Hello,

 This patch fixes a potential loss of a lock request in function
ompi_osc_rdma_passive_unlock_complete(). A new pending request is taken
from the m_locks_pending list. If m_lock_status is not equal to 0, this
new entry is then set to NULL and thus lost. This can lead to a deadlock
situation. So this patch moves the update of new_pending in its right
place.

 This patch was tested on v1.5.

Regards
Guillaume
---

diff --git a/ompi/mca/osc/rdma/osc_rdma_sync.c
b/ompi/mca/osc/rdma/osc_rdma_sync.c ---
a/ompi/mca/osc/rdma/osc_rdma_sync.c +++
b/ompi/mca/osc/rdma/osc_rdma_sync.c @@ -748,9 +748,9 @@
ompi_osc_rdma_passive_unlock_complete(om /* if we were really unlocked,
see if we have another lock request we can satisfy */
     OPAL_THREAD_LOCK(&(module->m_lock));
-    new_pending = (ompi_osc_rdma_pending_lock_t*) 
-        opal_list_remove_first(&(module->m_locks_pending));
     if (0 == module->m_lock_status) {
+        new_pending = (ompi_osc_rdma_pending_lock_t*)
+            opal_list_remove_first(&(module->m_locks_pending));
         if (NULL != new_pending) {
             ompi_win_append_mode(module->m_win, OMPI_WIN_EXPOSE_EPOCH);
             /* set lock state and generate a lock request */

Reply via email to