Commit aaf45bd8 authored by Bart Van Assche's avatar Bart Van Assche Committed by Doug Ledford

IB/srpt: Detect session shutdown reliably

The Last WQE Reached event is only generated after one or more work
requests have been queued on the QP associated with a session. Since
session shutdown can start before any work requests have been queued,
use a zero-length RDMA write to wait until a QP has been drained.

Additionally, rework the code for closing and disconnecting a session.
Signed-off-by: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Cc: Sagi Grimberg <sagig@mellanox.com>
Cc: Alex Estrin <alex.estrin@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 8628991f
This diff is collapsed.
...@@ -218,20 +218,20 @@ struct srpt_send_ioctx { ...@@ -218,20 +218,20 @@ struct srpt_send_ioctx {
/** /**
* enum rdma_ch_state - SRP channel state. * enum rdma_ch_state - SRP channel state.
* @CH_CONNECTING: QP is in RTR state; waiting for RTU. * @CH_CONNECTING: QP is in RTR state; waiting for RTU.
* @CH_LIVE: QP is in RTS state. * @CH_LIVE: QP is in RTS state.
* @CH_DISCONNECTING: DREQ has been received; waiting for DREP * @CH_DISCONNECTING: DREQ has been sent and waiting for DREP or DREQ has
* or DREQ has been send and waiting for DREP * been received.
* or . * @CH_DRAINING: DREP has been received or waiting for DREP timed out
* @CH_DRAINING: QP is in ERR state; waiting for last WQE event. * and last work request has been queued.
* @CH_RELEASING: Last WQE event has been received; releasing resources. * @CH_DISCONNECTED: Last completion has been received.
*/ */
enum rdma_ch_state { enum rdma_ch_state {
CH_CONNECTING, CH_CONNECTING,
CH_LIVE, CH_LIVE,
CH_DISCONNECTING, CH_DISCONNECTING,
CH_DRAINING, CH_DRAINING,
CH_RELEASING CH_DISCONNECTED,
}; };
/** /**
...@@ -267,6 +267,8 @@ struct srpt_rdma_ch { ...@@ -267,6 +267,8 @@ struct srpt_rdma_ch {
struct ib_cm_id *cm_id; struct ib_cm_id *cm_id;
struct ib_qp *qp; struct ib_qp *qp;
struct ib_cq *cq; struct ib_cq *cq;
struct ib_cqe zw_cqe;
struct kref kref;
int rq_size; int rq_size;
u32 rsp_size; u32 rsp_size;
atomic_t sq_wr_avail; atomic_t sq_wr_avail;
......
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