Commit a333974e authored by Alex Michon's avatar Alex Michon Committed by Jim Harris
Browse files

nvme/rdma: Flush queued send WRs when disconnecting a qpair



This will prevent staying in lingering state until the disconnection
timeout for no good reason.

Change-Id: Ife01eb2a7dd28e000fee15fba10dfd8aa7802725
Signed-off-by: default avatarAlex Michon <amichon@kalrayinc.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/25429


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
parent 2b867217
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -764,10 +764,8 @@ nvme_rdma_qpair_init(struct nvme_rdma_qpair *rqpair)

static void
nvme_rdma_reset_failed_sends(struct nvme_rdma_qpair *rqpair,
			     struct ibv_send_wr *bad_send_wr, int rc)
			     struct ibv_send_wr *bad_send_wr)
{
	SPDK_ERRLOG("Failed to post WRs on send queue, errno %d (%s), bad_wr %p\n",
		    rc, spdk_strerror(rc), bad_send_wr);
	while (bad_send_wr != NULL) {
		assert(rqpair->current_num_sends > 0);
		rqpair->current_num_sends--;
@@ -797,7 +795,9 @@ nvme_rdma_qpair_submit_sends(struct nvme_rdma_qpair *rqpair)
	rc = spdk_rdma_provider_qp_flush_send_wrs(rqpair->rdma_qp, &bad_send_wr);

	if (spdk_unlikely(rc)) {
		nvme_rdma_reset_failed_sends(rqpair, bad_send_wr, rc);
		SPDK_ERRLOG("Failed to post WRs on send queue, errno %d (%s), bad_wr %p\n",
			    rc, spdk_strerror(rc), bad_send_wr);
		nvme_rdma_reset_failed_sends(rqpair, bad_send_wr);
	}

	return rc;
@@ -2083,6 +2083,18 @@ nvme_rdma_qpair_destroy(struct nvme_rdma_qpair *rqpair)

static void nvme_rdma_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr);

static void
nvme_rdma_qpair_flush_send_wrs(struct nvme_rdma_qpair *rqpair)
{
	struct ibv_send_wr *bad_wr = NULL;
	int rc;

	rc = spdk_rdma_provider_qp_flush_send_wrs(rqpair->rdma_qp, &bad_wr);
	if (rc) {
		nvme_rdma_reset_failed_sends(rqpair, bad_wr);
	}
}

static int
nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
{
@@ -2102,6 +2114,8 @@ nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
		goto quiet;
	}

	nvme_rdma_qpair_flush_send_wrs(rqpair);

	if (rqpair->need_destroy ||
	    (rqpair->current_num_sends != 0 ||
	     (!rqpair->srq && rqpair->rsps->current_num_recvs != 0)) ||