From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============2504748997076442211==" MIME-Version: 1.0 From: Sasha Kotchubievsky Subject: Re: [SPDK] RDMA QP leak on spdk nvmf target Date: Mon, 17 Dec 2018 21:21:21 +0200 Message-ID: In-Reply-To: 20181217190248.GA20210@chelsio.com List-ID: To: spdk@lists.01.org --===============2504748997076442211== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi, I believe, = https://github.com/spdk/spdk/commit/7da9f8faba8712e655fc75240b2a2dc6660e0e6= 1 = recently merged into "master" should fix the problem. Best regards Sasha On 12/17/2018 9:02 PM, Potnuri Bharat Teja wrote: > Hi All, > With recent spdk code, RDMA QPs are not destroyed on the nvmf target afte= r each > spdk perf run until target is cleared/stopped. > > SPDK nvmf target is using drain WR completion logic to destroy the RDMA Q= P. But > even after send/recv drain completions are received RDMA QP is not destro= yed as > the rqpair->refcnt is 0 in spdk_nvmf_rdma_qpair_destroy(). > > I believe rqpair refcnt needs to be incremented before spdk_nvmf_rdma_qpa= ir_destroy(). > Here is my experimental patch that fixes the issue, Please let me know if= this > qualifies for a patch. > --- a/lib/nvmf/rdma.c > +++ b/lib/nvmf/rdma.c > @@ -2586,9 +2595,10 @@ spdk_nvmf_rdma_poller_poll(struct spdk_nvmf_rdma_t= ransport *rtransport, > case RDMA_WR_TYPE_DRAIN_RECV: > rqpair =3D SPDK_CONTAINEROF(rdma_wr, struct spdk_nvmf_rdma_qpair, drain= _recv_wr); > assert(rqpair->disconnect_flags & RDMA_QP_DISCONNECTING); > SPDK_DEBUGLOG(SPDK_LOG_RDMA, "Drained QP RECV %u (%p)\n", rqpair->qpair= .qid, rqpair); > rqpair->disconnect_flags |=3D RDMA_QP_RECV_DRAINED; > if (rqpair->disconnect_flags & RDMA_QP_SEND_DRAINED) { > + spdk_nvmf_rdma_qpair_inc_refcnt(rqpair); > spdk_nvmf_rdma_qpair_destroy(rqpair); > } > /* Continue so that this does not trigger the disconnect path below. */ > @@ -2596,9 +2606,10 @@ spdk_nvmf_rdma_poller_poll(struct spdk_nvmf_rdma_t= ransport *rtransport, > case RDMA_WR_TYPE_DRAIN_SEND: > rqpair =3D SPDK_CONTAINEROF(rdma_wr, struct spdk_nvmf_rdma_qpair, drain= _send_wr); > assert(rqpair->disconnect_flags & RDMA_QP_DISCONNECTING); > SPDK_DEBUGLOG(SPDK_LOG_RDMA, "Drained QP SEND %u (%p)\n", rqpair->qpair= .qid, rqpair); > rqpair->disconnect_flags |=3D RDMA_QP_SEND_DRAINED; > if (rqpair->disconnect_flags & RDMA_QP_RECV_DRAINED) { > + spdk_nvmf_rdma_qpair_inc_refcnt(rqpair); > spdk_nvmf_rdma_qpair_destroy(rqpair); > } > /* Continue so that this does not trigger the disconnect path below. */ > ---- > > Thanks, > Bharat. > _______________________________________________ > SPDK mailing list > SPDK(a)lists.01.org > https://lists.01.org/mailman/listinfo/spdk --===============2504748997076442211==--