Return unused entry to free list before trying to allocate new one.
Otherwise the code may deadlock.

Index: ompi/mca/btl/openib/btl_openib_component.c
===================================================================
--- ompi/mca/btl/openib/btl_openib_component.c  (revision 7878)
+++ ompi/mca/btl/openib/btl_openib_component.c  (working copy)
@@ -590,6 +590,7 @@
                                                           &frag->base, 
                                                           
openib_btl->ib_reg[frag->hdr->tag].cbdata);         

+                OMPI_FREE_LIST_RETURN(&(openib_btl->recv_free_eager), 
(opal_list_item_t*) frag); 
 #ifdef OMPI_MCA_BTL_OPENIB_HAVE_SRQ
                 if(mca_btl_openib_component.use_srq) { 
                     OPAL_THREAD_ADD32((int32_t*) &openib_btl->srr_posted_high, 
-1); 
@@ -601,7 +602,6 @@
 #ifdef OMPI_MCA_BTL_OPENIB_HAVE_SRQ
                 }
 #endif 
-                OMPI_FREE_LIST_RETURN(&(openib_btl->recv_free_eager), 
(opal_list_item_t*) frag); 
                 count++; 
                 break; 

@@ -683,6 +683,8 @@
                                                           &frag->base, 
                                                           
openib_btl->ib_reg[frag->hdr->tag].cbdata);         

+                OMPI_FREE_LIST_RETURN(&(openib_btl->recv_free_max), 
(opal_list_item_t*) frag); 
+
 #ifdef OMPI_MCA_BTL_OPENIB_HAVE_SRQ
                 if(mca_btl_openib_component.use_srq) { 
                     OPAL_THREAD_ADD32((int32_t*) &openib_btl->srr_posted_low, 
-1); 
@@ -695,7 +697,6 @@
 #ifdef OMPI_MCA_BTL_OPENIB_HAVE_SRQ
                 }
 #endif 
-                OMPI_FREE_LIST_RETURN(&(openib_btl->recv_free_max), 
(opal_list_item_t*) frag); 
                 count++; 
                 break; 

--
                        Gleb.

Reply via email to