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 */