From 66dbb5f20bf494eb3f5041655b478059165c5f1b Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Tue, 26 Jan 2010 15:13:03 -0800 Subject: [PATCH] dapl: move close device after async thread is done using it 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 --- dapl/openib_cma/device.c | 12 ++++++------ dapl/openib_scm/device.c | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/dapl/openib_cma/device.c b/dapl/openib_cma/device.c index e9ec733..7ab05aa 100644 --- a/dapl/openib_cma/device.c +++ b/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/dapl/openib_scm/device.c b/dapl/openib_scm/device.c index dedcb16..35d4c45 100644 --- a/dapl/openib_scm/device.c +++ b/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); } -- 2.41.0