Commit a7c6dfe2 authored by Henry Orosco's avatar Henry Orosco Committed by Jason Gunthorpe

i40iw: Notify user of established connection after QP in RTS

Established CM event is sent prior to modifying QP to RTS state.
This can result in application closing the connection before the
QP is actually in RTS state. Move sending of established CM
event to after modify QP to RTS.

Fixes: f27b4746 ("i40iw: add connection management code")
Signed-off-by: default avatarHenry Orosco <henry.orosco@intel.com>
Signed-off-by: default avatarShiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 8bb45252
...@@ -3687,11 +3687,16 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3687,11 +3687,16 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
cm_id->add_ref(cm_id); cm_id->add_ref(cm_id);
i40iw_add_ref(&iwqp->ibqp); i40iw_add_ref(&iwqp->ibqp);
i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_ESTABLISHED, 0);
attr.qp_state = IB_QPS_RTS; attr.qp_state = IB_QPS_RTS;
cm_node->qhash_set = false; cm_node->qhash_set = false;
i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL); i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL);
cm_node->accelerated = 1;
status =
i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_ESTABLISHED, 0);
if (status)
i40iw_debug(dev, I40IW_DEBUG_CM, "error sending cm event - ESTABLISHED\n");
if (cm_node->loopbackpartner) { if (cm_node->loopbackpartner) {
cm_node->loopbackpartner->pdata.size = conn_param->private_data_len; cm_node->loopbackpartner->pdata.size = conn_param->private_data_len;
...@@ -3702,7 +3707,6 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3702,7 +3707,6 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
i40iw_create_event(cm_node->loopbackpartner, I40IW_CM_EVENT_CONNECTED); i40iw_create_event(cm_node->loopbackpartner, I40IW_CM_EVENT_CONNECTED);
} }
cm_node->accelerated = 1;
if (cm_node->accept_pend) { if (cm_node->accept_pend) {
atomic_dec(&cm_node->listener->pend_accepts_cnt); atomic_dec(&cm_node->listener->pend_accepts_cnt);
cm_node->accept_pend = 0; cm_node->accept_pend = 0;
...@@ -4048,9 +4052,6 @@ static void i40iw_cm_event_connected(struct i40iw_cm_event *event) ...@@ -4048,9 +4052,6 @@ static void i40iw_cm_event_connected(struct i40iw_cm_event *event)
dev->iw_priv_qp_ops->qp_send_rtt(&iwqp->sc_qp, read0); dev->iw_priv_qp_ops->qp_send_rtt(&iwqp->sc_qp, read0);
if (iwqp->page) if (iwqp->page)
kunmap(iwqp->page); kunmap(iwqp->page);
status = i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY, 0);
if (status)
i40iw_pr_err("send cm event\n");
memset(&attr, 0, sizeof(attr)); memset(&attr, 0, sizeof(attr));
attr.qp_state = IB_QPS_RTS; attr.qp_state = IB_QPS_RTS;
...@@ -4058,6 +4059,10 @@ static void i40iw_cm_event_connected(struct i40iw_cm_event *event) ...@@ -4058,6 +4059,10 @@ static void i40iw_cm_event_connected(struct i40iw_cm_event *event)
i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL); i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL);
cm_node->accelerated = 1; cm_node->accelerated = 1;
status = i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY,
0);
if (status)
i40iw_debug(dev, I40IW_DEBUG_CM, "error sending cm event - CONNECT_REPLY\n");
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment