From b17e0ae7dbfc3075db464b00a19e84c1d19a8570 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Fri, 11 Jan 2019 17:17:58 -0700 Subject: [PATCH] rdma: process pending reqs before destroying qp This is an attempt to clean up requests sititng in the waiting_for_buffer state before destroying it for good. Change-Id: I8ae047e4d7fd01f30419ae346e4da49355dc033d Signed-off-by: Seth Howell Reviewed-on: https://review.gerrithub.io/c/440127 Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Darek Stojaczyk Reviewed-by: Jim Harris Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- lib/nvmf/rdma.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index f5e092f6f..eec86ba12 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -1405,7 +1405,7 @@ spdk_nvmf_rdma_request_process(struct spdk_nvmf_rdma_transport *rtransport, TAILQ_REMOVE(&rqpair->incoming_queue, rdma_recv, link); - if (rqpair->ibv_attr.qp_state == IBV_QPS_ERR) { + if (rqpair->ibv_attr.qp_state == IBV_QPS_ERR || rqpair->qpair.state != SPDK_NVMF_QPAIR_ACTIVE) { spdk_nvmf_rdma_request_set_state(rdma_req, RDMA_REQUEST_STATE_COMPLETED); break; } @@ -2647,6 +2647,7 @@ spdk_nvmf_rdma_poller_poll(struct spdk_nvmf_rdma_transport *rtransport, SPDK_DEBUGLOG(SPDK_LOG_RDMA, "Drained QP RECV %u (%p)\n", rqpair->qpair.qid, rqpair); rqpair->disconnect_flags |= RDMA_QP_RECV_DRAINED; if (rqpair->disconnect_flags & RDMA_QP_SEND_DRAINED) { + spdk_nvmf_rdma_qpair_process_pending(rtransport, rqpair, true); spdk_nvmf_rdma_qpair_destroy(rqpair); } /* Continue so that this does not trigger the disconnect path below. */ @@ -2657,6 +2658,7 @@ spdk_nvmf_rdma_poller_poll(struct spdk_nvmf_rdma_transport *rtransport, SPDK_DEBUGLOG(SPDK_LOG_RDMA, "Drained QP SEND %u (%p)\n", rqpair->qpair.qid, rqpair); rqpair->disconnect_flags |= RDMA_QP_SEND_DRAINED; if (rqpair->disconnect_flags & RDMA_QP_RECV_DRAINED) { + spdk_nvmf_rdma_qpair_process_pending(rtransport, rqpair, true); spdk_nvmf_rdma_qpair_destroy(rqpair); } /* Continue so that this does not trigger the disconnect path below. */