}\r
\r
/* Post receive buffers. */\r
+ cl_spinlock_acquire( &p_spl_qp_svc->obj.lock );\r
status = spl_qp_svc_post_recvs( p_spl_qp_svc );\r
+ cl_spinlock_release( &p_spl_qp_svc->obj.lock );\r
if( status != IB_SUCCESS )\r
{\r
p_spl_qp_svc->obj.pfn_destroy( &p_spl_qp_svc->obj, NULL );\r
p_list_item != cl_qlist_end( &p_spl_qp_svc->send_queue );\r
p_list_item = cl_qlist_remove_head( &p_spl_qp_svc->send_queue ) )\r
{\r
+ cl_spinlock_release( &p_spl_qp_svc->obj.lock );\r
p_mad_wr = PARENT_STRUCT( p_list_item, al_mad_wr_t, list_item );\r
__complete_send_mad( p_spl_qp_svc->h_mad_disp, p_mad_wr,\r
IB_WCS_WR_FLUSHED_ERR );\r
+ cl_spinlock_acquire( &p_spl_qp_svc->obj.lock );\r
}\r
\r
cl_spinlock_release( &p_spl_qp_svc->obj.lock );\r
al_mad_element_t* p_al_mad;\r
ib_qp_mod_t qp_mod;\r
ib_api_status_t status;\r
+ cl_qlist_t mad_wr_list;\r
\r
AL_ENTER( AL_DBG_SMI_CB );\r
\r
CL_ASSERT( status == IB_SUCCESS );\r
\r
/* Return receive MAD elements to the pool. */\r
+ cl_spinlock_acquire( &p_spl_qp_svc->obj.lock );\r
for( p_list_item = cl_qlist_remove_head( &p_spl_qp_svc->recv_queue );\r
p_list_item != cl_qlist_end( &p_spl_qp_svc->recv_queue );\r
p_list_item = cl_qlist_remove_head( &p_spl_qp_svc->recv_queue ) )\r
status = ib_put_mad( &p_al_mad->element );\r
CL_ASSERT( status == IB_SUCCESS );\r
}\r
+ cl_spinlock_release( &p_spl_qp_svc->obj.lock );\r
\r
/* Re-initialize the QP. */\r
status = ib_init_dgrm_svc( p_spl_qp_svc->h_qp, NULL );\r
} while( status == IB_SUCCESS );\r
\r
/* Post receive buffers. */\r
+ cl_spinlock_acquire( &p_spl_qp_svc->obj.lock );\r
spl_qp_svc_post_recvs( p_spl_qp_svc );\r
\r
- /*\r
- * Re-queue any outstanding MAD send operations.\r
- * Work from tail to head to maintain the request order.\r
- */\r
- for( p_list_item = cl_qlist_remove_tail( &p_spl_qp_svc->send_queue );\r
- p_list_item != cl_qlist_end( &p_spl_qp_svc->send_queue );\r
- p_list_item = cl_qlist_remove_tail( &p_spl_qp_svc->send_queue ) )\r
+ /* Re-queue any outstanding MAD send operations. */\r
+ cl_qlist_init( &mad_wr_list );\r
+ cl_qlist_insert_list_tail( &mad_wr_list, &p_spl_qp_svc->send_queue );\r
+ cl_spinlock_release( &p_spl_qp_svc->obj.lock );\r
+\r
+ for( p_list_item = cl_qlist_remove_head( &mad_wr_list );\r
+ p_list_item != cl_qlist_end( &mad_wr_list );\r
+ p_list_item = cl_qlist_remove_head( &mad_wr_list ) )\r
{\r
p_mad_wr = PARENT_STRUCT( p_list_item, al_mad_wr_t, list_item );\r
special_qp_queue_mad( p_spl_qp_svc->h_qp, p_mad_wr );\r