From: Chuck Lever <chuck.lever@oracle.com> To: linux-nfs@vger.kernel.org, linux-rdma@vger.kernel.org Subject: [PATCH v2 4/8] xprtrdma: Improve locking around rpcrdma_rep destruction Date: Fri, 02 Apr 2021 11:30:37 -0400 [thread overview] Message-ID: <161737743713.2012531.7618338855111719466.stgit@manet.1015granger.net> (raw) In-Reply-To: <161737723751.2012531.17740046594972271239.stgit@manet.1015granger.net> Currently rpcrdma_reps_destroy() assumes that, at transport tear-down, the content of the rb_free_reps list is the same as the content of the rb_all_reps list. Although that is usually true, using the rb_all_reps list should be more reliable because of the way it's managed. And, rpcrdma_reps_unmap() uses rb_all_reps; these two functions should both traverse the "all" list. Ensure that all rpcrdma_reps are always destroyed whether they are on the rep free list or not. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- net/sunrpc/xprtrdma/verbs.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index 1b599a623eea..482fdc9e25c2 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c @@ -1007,16 +1007,23 @@ struct rpcrdma_rep *rpcrdma_rep_create(struct rpcrdma_xprt *r_xprt, return NULL; } -/* No locking needed here. This function is invoked only by the - * Receive completion handler, or during transport shutdown. - */ -static void rpcrdma_rep_destroy(struct rpcrdma_rep *rep) +static void rpcrdma_rep_destroy_locked(struct rpcrdma_rep *rep) { - list_del(&rep->rr_all); rpcrdma_regbuf_free(rep->rr_rdmabuf); kfree(rep); } +static void rpcrdma_rep_destroy(struct rpcrdma_rep *rep) +{ + struct rpcrdma_buffer *buf = &rep->rr_rxprt->rx_buf; + + spin_lock(&buf->rb_lock); + list_del(&rep->rr_all); + spin_unlock(&buf->rb_lock); + + rpcrdma_rep_destroy_locked(rep); +} + static struct rpcrdma_rep *rpcrdma_rep_get_locked(struct rpcrdma_buffer *buf) { struct llist_node *node; @@ -1049,8 +1056,18 @@ static void rpcrdma_reps_destroy(struct rpcrdma_buffer *buf) { struct rpcrdma_rep *rep; - while ((rep = rpcrdma_rep_get_locked(buf)) != NULL) - rpcrdma_rep_destroy(rep); + spin_lock(&buf->rb_lock); + while ((rep = list_first_entry_or_null(&buf->rb_all_reps, + struct rpcrdma_rep, + rr_all)) != NULL) { + list_del(&rep->rr_all); + spin_unlock(&buf->rb_lock); + + rpcrdma_rep_destroy_locked(rep); + + spin_lock(&buf->rb_lock); + } + spin_unlock(&buf->rb_lock); } /**
next prev parent reply other threads:[~2021-04-02 15:30 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-04-02 15:30 [PATCH v2 0/8] xprtrdma Receive Queue fixes Chuck Lever 2021-04-02 15:30 ` [PATCH v2 1/8] xprtrdma: Avoid Receive Queue wrapping Chuck Lever 2021-04-02 15:30 ` [PATCH v2 2/8] xprtrdma: Do not refresh Receive Queue while it is draining Chuck Lever 2021-04-02 15:30 ` [PATCH v2 3/8] xprtrdma: Put flushed Receives on free list instead of destroying them Chuck Lever 2021-04-02 15:30 ` Chuck Lever [this message] 2021-04-02 15:30 ` [PATCH v2 5/8] xprtrdma: Improve commentary around rpcrdma_reps_unmap() Chuck Lever 2021-04-02 15:30 ` [PATCH v2 6/8] xprtrdma: Improve locking around rpcrdma_rep creation Chuck Lever 2021-04-02 15:30 ` [PATCH v2 7/8] xprtrdma: Fix cwnd update ordering Chuck Lever 2021-04-02 15:31 ` [PATCH v2 8/8] xprtrdma: Delete rpcrdma_recv_buffer_put() Chuck Lever
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=161737743713.2012531.7618338855111719466.stgit@manet.1015granger.net \ --to=chuck.lever@oracle.com \ --cc=linux-nfs@vger.kernel.org \ --cc=linux-rdma@vger.kernel.org \ --subject='Re: [PATCH v2 4/8] xprtrdma: Improve locking around rpcrdma_rep destruction' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.