From b4e060b5601bea140de678532f14d6bac1bae496 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Tue, 21 Apr 2020 16:11:39 -0700 Subject: [PATCH] lib/nvme: check that req is not null in RDMA. When a request has been aborted, it's possible to get a completion for an rdma request but the rdma_req->req object has already been cleared to NULL. Signed-off-by: Seth Howell Change-Id: I5f7b1b96ff4be8c436aae9a7e2a7c9927d04e627 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1960 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk Reviewed-by: Shuhei Matsumoto --- lib/nvme/nvme_rdma.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index b314fed15..3e66d0368 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -2143,17 +2143,23 @@ nvme_rdma_cq_process_completions(struct ibv_cq *cq, uint32_t batch_size) case RDMA_WR_TYPE_SEND: rdma_req = SPDK_CONTAINEROF(rdma_wr, struct spdk_nvme_rdma_req, rdma_wr); - rqpair = nvme_rdma_qpair(rdma_req->req->qpair); - rdma_req->completion_flags |= NVME_RDMA_SEND_COMPLETED; + /* If we are flushing I/O */ if (wc[i].status) { + rqpair = rdma_req->req ? nvme_rdma_qpair(rdma_req->req->qpair) : NULL; + if (rqpair) { + nvme_rdma_fail_qpair(&rqpair->qpair, 0); + } SPDK_ERRLOG("CQ error on Queue Pair %p, Response Index %lu (%d): %s\n", rqpair, wc[i].wr_id, wc[i].status, ibv_wc_status_str(wc[i].status)); - nvme_rdma_fail_qpair(&rqpair->qpair, 0); completion_rc = -ENXIO; continue; } + rqpair = nvme_rdma_qpair(rdma_req->req->qpair); + rdma_req->completion_flags |= NVME_RDMA_SEND_COMPLETED; + + if ((rdma_req->completion_flags & NVME_RDMA_RECV_COMPLETED) != 0) { if (spdk_unlikely(nvme_rdma_request_ready(rqpair, rdma_req))) { SPDK_ERRLOG("Unable to re-post rx descriptor\n");