Commit 698d8a58 authored by Richael Zhuang's avatar Richael Zhuang Committed by Tomasz Zawadzki
Browse files

nvme_rdma: abort outstanding requests when qpair is in existed state



In the callback of disconnecting a rdma qpair(nvme_rdma_qpair_disconnected),
the outstanding requests are all aborted. There is case that the
rdma qpair enters NVME_RDMA_QPAIR_STATE_LINGERING state, thus this
qpair is not destroyed until it exits NVME_RDMA_QPAIR_STATE_LINGERING.

During this time, the completion queue is still polled and there
may be a send completion whose wc->status is 0 but its corresponding
request is already aborted. This causes the following error:
"
nvme_rdma.c:2623:nvme_rdma_process_send_completion: ERROR: Received
malformed completion: request 0xfffb95006290 type 1

bdevperf: nvme_rdma.c:2626: nvme_rdma_process_send_completion:
Assertion `0' failed.

Aborted
"

This patch fixed this by aborting the outstanding requests when
the rdma qpair is in NVME_RDMA_QPAIR_STATE_EXITED state.

Change-Id: Ieb55ec47d4554d8e9a148166cd13f84807cec5a4
Signed-off-by: default avatarRichael Zhuang <richael.zhuang@arm.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18471


Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
parent 215a6e4c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1928,8 +1928,6 @@ static void nvme_rdma_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t d
static int
nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
{
	nvme_rdma_qpair_abort_reqs(&rqpair->qpair, 0);

	if (ret) {
		SPDK_DEBUGLOG(nvme, "Target did not respond to qpair disconnect.\n");
		goto quiet;
@@ -1959,6 +1957,7 @@ nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
quiet:
	rqpair->state = NVME_RDMA_QPAIR_STATE_EXITED;

	nvme_rdma_qpair_abort_reqs(&rqpair->qpair, 0);
	nvme_rdma_qpair_destroy(rqpair);
	nvme_transport_ctrlr_disconnect_qpair_done(&rqpair->qpair);

@@ -1976,6 +1975,7 @@ nvme_rdma_qpair_wait_until_quiet(struct nvme_rdma_qpair *rqpair)

	rqpair->state = NVME_RDMA_QPAIR_STATE_EXITED;

	nvme_rdma_qpair_abort_reqs(&rqpair->qpair, 0);
	nvme_rdma_qpair_destroy(rqpair);
	nvme_transport_ctrlr_disconnect_qpair_done(&rqpair->qpair);