[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