IB/iser: Fix a possible race in iser connection states transition
In some circumstances (multiple targets), RDMA_CM ESTABLISHED event and ep_disconnect may race. In this case, the iser connection state may transition to UP (after ep_disconnect transitioned it to TERMINATING), while the connection is being torn down. Upon RDMA_CM event ESTABLISHED we allow iser connection state to transition to UP only from PENDING. We also make sure to protect this state change (done under the connection lock). Signed-off-by: Ariel Nahum <arieln@mellanox.com> Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
b73c3adabd
commit
66d4e62d27
|
@ -732,8 +732,8 @@ static void iser_connected_handler(struct rdma_cm_id *cma_id)
|
||||||
iser_info("remote qpn:%x my qpn:%x\n", attr.dest_qp_num, cma_id->qp->qp_num);
|
iser_info("remote qpn:%x my qpn:%x\n", attr.dest_qp_num, cma_id->qp->qp_num);
|
||||||
|
|
||||||
ib_conn = (struct iser_conn *)cma_id->context;
|
ib_conn = (struct iser_conn *)cma_id->context;
|
||||||
ib_conn->state = ISER_CONN_UP;
|
if (iser_conn_state_comp_exch(ib_conn, ISER_CONN_PENDING, ISER_CONN_UP))
|
||||||
wake_up_interruptible(&ib_conn->wait);
|
wake_up_interruptible(&ib_conn->wait);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iser_disconnected_handler(struct rdma_cm_id *cma_id)
|
static void iser_disconnected_handler(struct rdma_cm_id *cma_id)
|
||||||
|
|
Loading…
Reference in New Issue