There is the possibility of dat_ep_free being called with RC CR's still in connected state. Call disconnect on the CR before marking for destroy. Destroy state change must be serialized via CR lock.
Signed-off-by: Arlin Davis <[email protected]> --- dapl/openib_scm/dapl_ib_cm.c | 3 ++- dapl/openib_scm/dapl_ib_qp.c | 3 +++ dapl/openib_scm/dapl_ib_util.h | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dapl/openib_scm/dapl_ib_cm.c b/dapl/openib_scm/dapl_ib_cm.c index d116c62..6d39a4a 100644 --- a/dapl/openib_scm/dapl_ib_cm.c +++ b/dapl/openib_scm/dapl_ib_cm.c @@ -308,8 +308,9 @@ static void dapli_cm_queue(struct ib_cm_handle *cm_ptr) /* * ACTIVE/PASSIVE: called from CR thread or consumer via ep_disconnect + * or from ep_free */ -static DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr) +DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr) { DAPL_EP *ep_ptr = cm_ptr->ep; DAT_UINT32 disc_data = htonl(0xdead); diff --git a/dapl/openib_scm/dapl_ib_qp.c b/dapl/openib_scm/dapl_ib_qp.c index f30da11..7c3c280 100644 --- a/dapl/openib_scm/dapl_ib_qp.c +++ b/dapl/openib_scm/dapl_ib_qp.c @@ -219,7 +219,10 @@ DAT_RETURN dapls_ib_qp_free(IN DAPL_IA * ia_ptr, IN DAPL_EP * ep_ptr) if (cr->ep == ep_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " qp_free CR: ep %p cr %p\n", ep_ptr, cr); + dapli_socket_disconnect(cr); + dapl_os_lock(&cr->lock); cr->state = SCM_DESTROY; + dapl_os_unlock(&cr->lock); } } dapl_os_unlock(&ia_ptr->hca_ptr->ib_trans.lock); diff --git a/dapl/openib_scm/dapl_ib_util.h b/dapl/openib_scm/dapl_ib_util.h index e924572..ef98ab6 100644 --- a/dapl/openib_scm/dapl_ib_util.h +++ b/dapl/openib_scm/dapl_ib_util.h @@ -316,7 +316,7 @@ int32_t dapls_ib_release (void); void cr_thread(void *arg); int dapli_cq_thread_init(struct dapl_hca *hca_ptr); void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr); - +DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr); DAT_RETURN dapls_modify_qp_state ( IN ib_qp_handle_t qp_handle, -- 1.5.2.5 _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
