From 6967fec6df6d0412b813d4b2addd25a9c5ad23ce Mon Sep 17 00:00:00 2001 From: Alexey Marchuk Date: Tue, 28 Jul 2020 22:16:45 +0300 Subject: [PATCH] nvmf/rdma: Submit recv to SRQ when AER is released Currently we don't resubmit receive request associated with AER request to SRQ. This leads to reducing of SRQ elements and may lead to non responsive NVMF target. Fixes #1507 Change-Id: Ie96f8c4be0202ae973e561ebe5ea28688a6a3b72 Signed-off-by: Alexey Marchuk Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3558 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Michael Haeuptle Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/nvmf/rdma.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index c06e1f2f7..4a4de4374 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -3567,6 +3567,23 @@ nvmf_rdma_request_free(struct spdk_nvmf_request *req) struct spdk_nvmf_rdma_request *rdma_req = SPDK_CONTAINEROF(req, struct spdk_nvmf_rdma_request, req); struct spdk_nvmf_rdma_transport *rtransport = SPDK_CONTAINEROF(req->qpair->transport, struct spdk_nvmf_rdma_transport, transport); + struct spdk_nvmf_rdma_qpair *rqpair = SPDK_CONTAINEROF(rdma_req->req.qpair, + struct spdk_nvmf_rdma_qpair, qpair); + + /* + * AER requests are freed when a qpair is destroyed. The recv corresponding to that request + * needs to be returned to the shared receive queue or the poll group will eventually be + * starved of RECV structures. + */ + if (rqpair->srq && rdma_req->recv) { + int rc; + struct ibv_recv_wr *bad_recv_wr; + + rc = ibv_post_srq_recv(rqpair->srq, &rdma_req->recv->wr, &bad_recv_wr); + if (rc) { + SPDK_ERRLOG("Unable to re-post rx descriptor\n"); + } + } _nvmf_rdma_request_free(rdma_req, rtransport); return 0;