[ofw] [PATCH] dapl: move close device after async thread is done using it

Sean Hefty sean.hefty at intel.com
Sat Jan 23 00:10:20 PST 2010


Before calling ibv_close_device, wait for the asynchronous
processing thread to finish using the device.  This prevents
a use after free error.

Signed-off-by: Sean Hefty <sean.hefty at intel.com>
---
This should go into 2.2, and be pushed into the main dapl.git tree.

 trunk/ulp/dapl2/dapl/openib_cma/device.c |   12 ++++++------
 trunk/ulp/dapl2/dapl/openib_scm/device.c |   14 +++++++-------
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/trunk/ulp/dapl2/dapl/openib_cma/device.c b/trunk/ulp/dapl2/dapl/openib_cma/device.c
index e9ec733..7ab05aa 100644
--- a/trunk/ulp/dapl2/dapl/openib_cma/device.c
+++ b/trunk/ulp/dapl2/dapl/openib_cma/device.c
@@ -474,12 +474,6 @@ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr)
 	dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p->%p\n",
 		     hca_ptr, hca_ptr->ib_hca_handle);
 
-	if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) {
-		if (rdma_destroy_id(hca_ptr->ib_trans.cm_id))
-			return (dapl_convert_errno(errno, "ib_close_device"));
-		hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
-	}
-
 	dapl_os_lock(&g_hca_lock);
 	if (g_ib_thread_state != IB_THREAD_RUN) {
 		dapl_os_unlock(&g_hca_lock);
@@ -508,6 +502,12 @@ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr)
 		dapl_os_sleep_usec(1000);
 	}
 bail:
+	if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) {
+		if (rdma_destroy_id(hca_ptr->ib_trans.cm_id))
+			return (dapl_convert_errno(errno, "ib_close_device"));
+		hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
+	}
+
 	return (DAT_SUCCESS);
 }
 
diff --git a/trunk/ulp/dapl2/dapl/openib_scm/device.c b/trunk/ulp/dapl2/dapl/openib_scm/device.c
index dedcb16..35d4c45 100644
--- a/trunk/ulp/dapl2/dapl/openib_scm/device.c
+++ b/trunk/ulp/dapl2/dapl/openib_scm/device.c
@@ -465,16 +465,10 @@ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr)
 {
 	dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p\n", hca_ptr);
 
-	if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) {
-		if (ibv_close_device(hca_ptr->ib_hca_handle))
-			return (dapl_convert_errno(errno, "ib_close_device"));
-		hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
-	}
-
 	dapl_os_lock(&g_hca_lock);
 	if (g_ib_thread_state != IB_THREAD_RUN) {
 		dapl_os_unlock(&g_hca_lock);
-		return (DAT_SUCCESS);
+		goto out;
 	}
 	dapl_os_unlock(&g_hca_lock);
 
@@ -509,6 +503,12 @@ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr)
 		dapl_os_sleep_usec(1000);
 	}
 
+out:
+	if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) {
+		if (ibv_close_device(hca_ptr->ib_hca_handle))
+			return (dapl_convert_errno(errno, "ib_close_device"));
+		hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
+	}
 	return (DAT_SUCCESS);
 }
 






More information about the ofw mailing list