[ofw] [PATCH] uDAPL v2 - ucm: inbound DREQ/DREP handshake should transition QP.
Davis, Arlin R
arlin.r.davis at intel.com
Wed Nov 18 16:22:28 PST 2009
during RC QP release, when receiving a disconnect request from remote peer
instead of a disconnect call from the client, the QP didn't get properly
set in ERR state and didn't flush the queue during disconnect processing.
Signed-off-by: Arlin Davis <arlin.r.davis at intel.com>
---
dapl/openib_ucm/cm.c | 15 ++++++++++-----
1 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/dapl/openib_ucm/cm.c b/dapl/openib_ucm/cm.c
index 2b7471e..b51556a 100644
--- a/dapl/openib_ucm/cm.c
+++ b/dapl/openib_ucm/cm.c
@@ -711,7 +711,8 @@ static void ucm_ud_free(DAPL_EP *ep)
void dapls_ib_cm_free(dp_ib_cm_handle_t cm, DAPL_EP *ep)
{
dapl_dbg_log(DAPL_DBG_TYPE_CM,
- " cm_destroy: cm %p ep %p\n", cm, ep);
+ " cm_destroy: %s cm %p ep %p\n",
+ cm ? dapl_cm_state_str(cm->state) : "", cm, ep);
if (!cm && ep) {
ucm_ud_free(ep);
@@ -813,6 +814,10 @@ DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm)
dapl_os_lock(&cm->lock);
switch (cm->state) {
case DCM_CONNECTED:
+ /* CONSUMER: move to err state to flush, if not UD */
+ if (cm->ep->qp_handle->qp_type != IBV_QPT_UD)
+ dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);
+
/* send DREQ, event after DREP or DREQ timeout */
cm->state = DCM_DISC_PENDING;
cm->msg.op = htons(DCM_DREQ);
@@ -836,6 +841,10 @@ DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm)
}
break;
case DCM_DISC_RECV:
+ /* CM_THREAD: move to err state to flush, if not UD */
+ if (cm->ep->qp_handle->qp_type != IBV_QPT_UD)
+ dapls_modify_qp_state(cm->ep->qp_handle, IBV_QPS_ERR,0,0,0);
+
/* DREQ received, send DREP and schedule event */
cm->msg.op = htons(DCM_DREP);
break;
@@ -1547,10 +1556,6 @@ dapls_ib_disconnect(IN DAPL_EP *ep, IN DAT_CLOSE_FLAGS close_flags)
dapl_dbg_log(DAPL_DBG_TYPE_EP,
"dapls_ib_disconnect(ep_handle %p ....)\n", ep);
- /* move to err state to flush, if not UD */
- if (ep->qp_handle->qp_type != IBV_QPT_UD)
- dapls_modify_qp_state(ep->qp_handle, IBV_QPS_ERR,0,0,0);
-
if (ep->cm_handle == NULL ||
ep->param.ep_state == DAT_EP_STATE_DISCONNECTED)
return DAT_SUCCESS;
--
1.5.2.5
More information about the ofw
mailing list