From b4d30668906e15aab4913fa0eb536ab4e3d1708d Mon Sep 17 00:00:00 2001 From: lorneli Date: Wed, 10 Jul 2019 17:21:51 +0800 Subject: [PATCH] nvmf/rdma: defer qp destruction until nvmf layer closes qp Currently rqpair will be destroyed directly in ibv_poll_cq path if it has been drained, regardless of whether there are outstanding I/Os issued to bdev layer. So after outstanding I/Os completing, spdk_nvmf_rdma_close_qpair will be called from nvmf layer, accessing a destroyed qp. This path defers qp destruction in nvmf_rdma_destroy_drained_qpair func until nvmf layer closes qp. Fixes 851 Change-Id: I8bcce66f8053ddb105702ac603d5d73af54bdcfc Signed-off-by: lorneli Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/461237 Reviewed-by: Changpeng Liu Reviewed-by: Seth Howell Reviewed-by: Darek Stojaczyk Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- lib/nvmf/rdma.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 41357fa6d..0d4d4131c 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -2672,6 +2672,12 @@ static void nvmf_rdma_destroy_drained_qpair(void *ctx) } spdk_nvmf_rdma_qpair_process_pending(rtransport, rqpair, true); + + /* Qpair will be destroyed after nvmf layer closes this qpair */ + if (rqpair->qpair.state != SPDK_NVMF_QPAIR_ERROR) { + return; + } + spdk_nvmf_rdma_qpair_destroy(rqpair); }