[ofa-general] [PATCH] uDAPL v2: dat_evd_wait, hold lock when working with rbuf resources

Davis, Arlin R arlin.r.davis at intel.com
Sun Apr 19 01:03:25 PDT 2009


Since the removal thread is the user's, but the queuing thread is
not, the synchronization must be provided by DAPL.  Hold the evd lock
around any calls to dapls_rbuf_*.

Signed-off-by: Sean Hefty <sean.hefty at intel.com>
---
 dapl/udapl/dapl_evd_wait.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/dapl/udapl/dapl_evd_wait.c b/dapl/udapl/dapl_evd_wait.c
index 9fc0ba2..c973397 100644
--- a/dapl/udapl/dapl_evd_wait.c
+++ b/dapl/udapl/dapl_evd_wait.c
@@ -149,7 +149,6 @@ DAT_RETURN DAT_API dapl_evd_wait (
     {
 	/* Bogus state, bail out */
 	dat_status = DAT_ERROR (DAT_INVALID_STATE,0);
-	dapl_os_unlock ( &evd_ptr->header.lock );
 	goto bail;
     }
 
@@ -160,10 +159,8 @@ DAT_RETURN DAT_API dapl_evd_wait (
 		evd_ptr->evd_state = evd_state;
 
 	dat_status = DAT_ERROR (DAT_INVALID_STATE, DAT_INVALID_STATE_EVD_UNWAITABLE);
-	dapl_os_unlock ( &evd_ptr->header.lock );
 	goto bail;
     }
-    dapl_os_unlock ( &evd_ptr->header.lock );
 
 
     /*
@@ -185,7 +182,9 @@ DAT_RETURN DAT_API dapl_evd_wait (
 	 * return right away if the ib_cq_handle associate with these evd
 	 * equal to IB_INVALID_HANDLE
 	 */
+	dapl_os_unlock(&evd_ptr->header.lock);
 	dapls_evd_copy_cq(evd_ptr);
+	dapl_os_lock(&evd_ptr->header.lock);
 
 	if (dapls_rbuf_count(&evd_ptr->pending_event_queue) >= threshold)
 	{
@@ -226,6 +225,7 @@ DAT_RETURN DAT_API dapl_evd_wait (
 	evd_ptr->threshold = threshold;	
 
 	DAPL_CNTR(evd_ptr, DCNT_EVD_WAIT_BLOCKED);
+	dapl_os_unlock(&evd_ptr->header.lock);
 
 #ifdef CQ_WAIT_OBJECT
 	if (evd_ptr->cq_wait_obj_handle)
@@ -235,6 +235,9 @@ DAT_RETURN DAT_API dapl_evd_wait (
 #endif
 		dat_status = dapl_os_wait_object_wait (
 				&evd_ptr->wait_object, time_out );
+
+	dapl_os_lock(&evd_ptr->header.lock);
+
 	/*
 	 * FIXME: if the thread loops around and waits again
 	 * the time_out value needs to be updated.
@@ -276,6 +279,7 @@ DAT_RETURN DAT_API dapl_evd_wait (
     *nmore = dapls_rbuf_count(&evd_ptr->pending_event_queue);
 
  bail:
+    dapl_os_unlock(&evd_ptr->header.lock);
     if ( dat_status ) {
         dapl_dbg_log (DAPL_DBG_TYPE_RTN,
 			"dapl_evd_wait () returns 0x%x\n", dat_status);
-- 
1.5.2.5




More information about the general mailing list