]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
cma,scm,ucm: extra reference on EP, with RSP, causes dat_ep_free() to hang
authorArlin Davis <arlin.r.davis@intel.com>
Thu, 8 Dec 2011 00:39:55 +0000 (16:39 -0800)
committerArlin Davis <arlin.r.davis@intel.com>
Thu, 8 Dec 2011 00:39:55 +0000 (16:39 -0800)
Need to add check for RSP or PSP provider type service points during
passive side accepts before taking CR reference on the EP. In these
cases, the EP is already linked to inbound CR.

Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
dapl/openib_cma/cm.c
dapl/openib_scm/cm.c
dapl/openib_ucm/cm.c

index 7980cf66110e274a104dad042e341a52bd8b6445..bd2c1f097939fb5c973fa7b491d51ecc50885577 100644 (file)
@@ -901,8 +901,9 @@ dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,
                rdma_destroy_id(ep_conn->cm_id);
                dapls_cm_release(ep_conn);
 
-               /* add new CM to EP linking, qp_handle unchanged */
-               dapl_ep_link_cm(ep_ptr, cr_conn);
+               /* add new CM to EP linking, qp_handle unchanged, !PSP !RSP */
+               if (!cr_conn->sp->ep_handle && !cr_conn->sp->psp_flags)
+                       dapl_ep_link_cm(ep_ptr, cr_conn);
                cr_conn->ep = ep_ptr;
        } else {
                dapl_log(DAPL_DBG_TYPE_ERR,
index 586e1b0acfe4a96f9f5985bd382273d59429d680..b6109f116dd334afd5c739beaf061bc8bf1909e4 100644 (file)
@@ -1277,8 +1277,9 @@ dapli_socket_accept_usr(DAPL_EP * ep_ptr,
        cm_ptr->state = DCM_ACCEPTED;
        dapl_os_unlock(&cm_ptr->lock);
 
-       /* Link CM to EP, already queued on work thread */
-       dapl_ep_link_cm(ep_ptr, cm_ptr);
+       /* Link CM to EP, already queued on work thread, !PSP !RSP */
+       if (!cm_ptr->sp->ep_handle && !cm_ptr->sp->psp_flags)
+               dapl_ep_link_cm(ep_ptr, cm_ptr);
        cm_ptr->ep = ep_ptr;
 
        local.p_size = htons(p_size);
index 2d2063e93bc65e654515acb86b0312f050516e1c..762bd66fbfb2e4c2ece90ac608ad09025bb1575d 100644 (file)
@@ -1581,8 +1581,9 @@ dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data)
        cm->p_size = p_size;
        dapl_os_memcpy(&cm->p_data, p_data, p_size);
 
-       /* save state and setup valid reference to EP, HCA */
-       dapl_ep_link_cm(ep, cm);
+       /* save state and setup valid reference to EP, HCA. !PSP !RSP */
+       if (!cm->sp->ep_handle && !cm->sp->psp_flags)
+               dapl_ep_link_cm(ep, cm);
        cm->ep = ep;
        cm->hca = ia->hca_ptr;