From 4d5f288c7d9763ef8f6bd3f24d478c6f48b71ca2 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Fri, 14 Sep 2018 14:12:23 -0700 Subject: [PATCH] nvmf/rdma: Fix double complete when RNIC goes offline A request could be completed twice, once for an error on an IBV_SEND operation and again on an outstanding IBV_RDMA_WRITE operation, if the RNIC goes offline while a complete + data transfer are occurring. This fixes GitHub issue #414 Change-Id: I2338b4d4582c5ee2512cfbd1e89048a10d3ecf1c Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/425646 Chandler-Test-Pool: SPDK Automated Test System Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/nvmf/rdma.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index b4d5541b9..9992cf1c6 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -2670,8 +2670,6 @@ spdk_nvmf_rdma_poller_poll(struct spdk_nvmf_rdma_transport *rtransport, switch (wc[i].opcode) { case IBV_WC_SEND: - case IBV_WC_RDMA_WRITE: - case IBV_WC_RDMA_READ: rdma_req = get_rdma_req_from_wc(&wc[i]); rqpair = SPDK_CONTAINEROF(rdma_req->req.qpair, struct spdk_nvmf_rdma_qpair, qpair); @@ -2688,6 +2686,14 @@ spdk_nvmf_rdma_poller_poll(struct spdk_nvmf_rdma_transport *rtransport, * the queue pair disconnects or recovers. */ TAILQ_INSERT_TAIL(&rqpair->incoming_queue, rdma_recv, link); break; + case IBV_WC_RDMA_WRITE: + case IBV_WC_RDMA_READ: + /* If the data transfer fails still force the queue into the error state, + * but the rdma_req objects should only be manipulated in response to + * SEND and RECV operations. */ + rdma_req = get_rdma_req_from_wc(&wc[i]); + rqpair = SPDK_CONTAINEROF(rdma_req->req.qpair, struct spdk_nvmf_rdma_qpair, qpair); + break; default: SPDK_ERRLOG("Received an unknown opcode on the CQ: %d\n", wc[i].opcode); continue;