All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chuck Lever <chuck.lever@oracle.com>
To: anna.schumaker@netapp.com
Cc: linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org
Subject: [PATCH v3 10/24] xprtrdma: Simplify locking that protects the rl_allreqs list
Date: Mon, 10 Dec 2018 11:30:12 -0500	[thread overview]
Message-ID: <20181210163012.4198.33197.stgit@manet.1015granger.net> (raw)
In-Reply-To: <20181210161723.4198.51071.stgit@manet.1015granger.net>

Clean up: There's little chance of contention between the use of
rb_lock and rb_reqslock, so merge the two. This avoids having to
take both in some (possibly future) cases.

Transport tear-down is already serialized, thus there is no need for
locking at all when destroying rpcrdma_reqs.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 net/sunrpc/xprtrdma/backchannel.c |   20 +++-----------------
 net/sunrpc/xprtrdma/verbs.c       |   31 +++++++++++++++++--------------
 net/sunrpc/xprtrdma/xprt_rdma.h   |    7 +++----
 3 files changed, 23 insertions(+), 35 deletions(-)

diff --git a/net/sunrpc/xprtrdma/backchannel.c b/net/sunrpc/xprtrdma/backchannel.c
index e31cf26..41d263c 100644
--- a/net/sunrpc/xprtrdma/backchannel.c
+++ b/net/sunrpc/xprtrdma/backchannel.c
@@ -19,29 +19,16 @@
 
 #undef RPCRDMA_BACKCHANNEL_DEBUG
 
-static void rpcrdma_bc_free_rqst(struct rpcrdma_xprt *r_xprt,
-				 struct rpc_rqst *rqst)
-{
-	struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
-	struct rpcrdma_req *req = rpcr_to_rdmar(rqst);
-
-	spin_lock(&buf->rb_reqslock);
-	list_del(&req->rl_all);
-	spin_unlock(&buf->rb_reqslock);
-
-	rpcrdma_destroy_req(req);
-}
-
 static int rpcrdma_bc_setup_reqs(struct rpcrdma_xprt *r_xprt,
 				 unsigned int count)
 {
 	struct rpc_xprt *xprt = &r_xprt->rx_xprt;
+	struct rpcrdma_req *req;
 	struct rpc_rqst *rqst;
 	unsigned int i;
 
 	for (i = 0; i < (count << 1); i++) {
 		struct rpcrdma_regbuf *rb;
-		struct rpcrdma_req *req;
 		size_t size;
 
 		req = rpcrdma_create_req(r_xprt);
@@ -67,7 +54,7 @@ static int rpcrdma_bc_setup_reqs(struct rpcrdma_xprt *r_xprt,
 	return 0;
 
 out_fail:
-	rpcrdma_bc_free_rqst(r_xprt, rqst);
+	rpcrdma_req_destroy(req);
 	return -ENOMEM;
 }
 
@@ -225,7 +212,6 @@ int xprt_rdma_bc_send_reply(struct rpc_rqst *rqst)
  */
 void xprt_rdma_bc_destroy(struct rpc_xprt *xprt, unsigned int reqs)
 {
-	struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
 	struct rpc_rqst *rqst, *tmp;
 
 	spin_lock(&xprt->bc_pa_lock);
@@ -233,7 +219,7 @@ void xprt_rdma_bc_destroy(struct rpc_xprt *xprt, unsigned int reqs)
 		list_del(&rqst->rq_bc_pa_list);
 		spin_unlock(&xprt->bc_pa_lock);
 
-		rpcrdma_bc_free_rqst(r_xprt, rqst);
+		rpcrdma_req_destroy(rpcr_to_rdmar(rqst));
 
 		spin_lock(&xprt->bc_pa_lock);
 	}
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index a8d4def..bd6bc45 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -1083,9 +1083,9 @@ struct rpcrdma_req *
 	req->rl_buffer = buffer;
 	INIT_LIST_HEAD(&req->rl_registered);
 
-	spin_lock(&buffer->rb_reqslock);
+	spin_lock(&buffer->rb_lock);
 	list_add(&req->rl_all, &buffer->rb_allreqs);
-	spin_unlock(&buffer->rb_reqslock);
+	spin_unlock(&buffer->rb_lock);
 	return req;
 }
 
@@ -1153,7 +1153,6 @@ struct rpcrdma_req *
 
 	INIT_LIST_HEAD(&buf->rb_send_bufs);
 	INIT_LIST_HEAD(&buf->rb_allreqs);
-	spin_lock_init(&buf->rb_reqslock);
 	for (i = 0; i < buf->rb_max_requests; i++) {
 		struct rpcrdma_req *req;
 
@@ -1188,9 +1187,18 @@ struct rpcrdma_req *
 	kfree(rep);
 }
 
+/**
+ * rpcrdma_req_destroy - Destroy an rpcrdma_req object
+ * @req: unused object to be destroyed
+ *
+ * This function assumes that the caller prevents concurrent device
+ * unload and transport tear-down.
+ */
 void
-rpcrdma_destroy_req(struct rpcrdma_req *req)
+rpcrdma_req_destroy(struct rpcrdma_req *req)
 {
+	list_del(&req->rl_all);
+
 	rpcrdma_free_regbuf(req->rl_recvbuf);
 	rpcrdma_free_regbuf(req->rl_sendbuf);
 	rpcrdma_free_regbuf(req->rl_rdmabuf);
@@ -1244,19 +1252,14 @@ struct rpcrdma_req *
 		rpcrdma_destroy_rep(rep);
 	}
 
-	spin_lock(&buf->rb_reqslock);
-	while (!list_empty(&buf->rb_allreqs)) {
+	while (!list_empty(&buf->rb_send_bufs)) {
 		struct rpcrdma_req *req;
 
-		req = list_first_entry(&buf->rb_allreqs,
-				       struct rpcrdma_req, rl_all);
-		list_del(&req->rl_all);
-
-		spin_unlock(&buf->rb_reqslock);
-		rpcrdma_destroy_req(req);
-		spin_lock(&buf->rb_reqslock);
+		req = list_first_entry(&buf->rb_send_bufs,
+				       struct rpcrdma_req, rl_list);
+		list_del(&req->rl_list);
+		rpcrdma_req_destroy(req);
 	}
-	spin_unlock(&buf->rb_reqslock);
 
 	rpcrdma_mrs_destroy(buf);
 }
diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h
index 2ae1ee2..e1c6235 100644
--- a/net/sunrpc/xprtrdma/xprt_rdma.h
+++ b/net/sunrpc/xprtrdma/xprt_rdma.h
@@ -401,15 +401,14 @@ struct rpcrdma_buffer {
 	spinlock_t		rb_lock;	/* protect buf lists */
 	struct list_head	rb_send_bufs;
 	struct list_head	rb_recv_bufs;
+	struct list_head	rb_allreqs;
+
 	unsigned long		rb_flags;
 	u32			rb_max_requests;
 	u32			rb_credits;	/* most recent credit grant */
 	int			rb_posted_receives;
 
 	u32			rb_bc_srv_max_requests;
-	spinlock_t		rb_reqslock;	/* protect rb_allreqs */
-	struct list_head	rb_allreqs;
-
 	u32			rb_bc_max_requests;
 
 	struct delayed_work	rb_refresh_worker;
@@ -566,7 +565,7 @@ int rpcrdma_ep_post(struct rpcrdma_ia *, struct rpcrdma_ep *,
  * Buffer calls - xprtrdma/verbs.c
  */
 struct rpcrdma_req *rpcrdma_create_req(struct rpcrdma_xprt *);
-void rpcrdma_destroy_req(struct rpcrdma_req *);
+void rpcrdma_req_destroy(struct rpcrdma_req *req);
 int rpcrdma_buffer_create(struct rpcrdma_xprt *);
 void rpcrdma_buffer_destroy(struct rpcrdma_buffer *);
 struct rpcrdma_sendctx *rpcrdma_sendctx_get_locked(struct rpcrdma_buffer *buf);


  parent reply	other threads:[~2018-12-10 16:30 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-10 16:29 [PATCH v3 00/24] NFS/RDMA client for next Chuck Lever
2018-12-10 16:29 ` [PATCH v3 01/24] xprtrdma: Prevent leak of rpcrdma_rep objects Chuck Lever
2018-12-10 16:29 ` [PATCH v3 02/24] IB/rxe: IB_WR_REG_MR does not capture MR's iova field Chuck Lever
2018-12-11 14:00   ` Christoph Hellwig
2018-12-11 15:26     ` Chuck Lever
2018-12-10 16:29 ` [PATCH v3 03/24] xprtrdma: Remove support for FMR memory registration Chuck Lever
2018-12-11 14:02   ` Christoph Hellwig
2018-12-11 15:29     ` Chuck Lever
2018-12-12  7:18       ` Christoph Hellwig
2018-12-10 16:29 ` [PATCH v3 04/24] xprtrdma: Fix ri_max_segs and the result of ro_maxpages Chuck Lever
2018-12-10 16:29 ` [PATCH v3 05/24] xprtrdma: Reduce max_frwr_depth Chuck Lever
2018-12-11 14:02   ` Christoph Hellwig
2018-12-11 15:30     ` Chuck Lever
2018-12-12  7:18       ` Christoph Hellwig
2018-12-10 16:29 ` [PATCH v3 06/24] xprtrdma: Plant XID in on-the-wire RDMA offset (FRWR) Chuck Lever
2018-12-10 16:29 ` [PATCH v3 07/24] xprtrdma: Recognize XDRBUF_SPARSE_PAGES Chuck Lever
2018-12-10 16:30 ` [PATCH v3 08/24] xprtrdma: Remove request_module from backchannel Chuck Lever
2018-12-10 16:30 ` [PATCH v3 09/24] xprtrdma: Expose transport header errors Chuck Lever
2018-12-10 16:30 ` Chuck Lever [this message]
2018-12-10 16:30 ` [PATCH v3 11/24] xprtrdma: Cull dprintk() call sites Chuck Lever
2018-12-10 16:30 ` [PATCH v3 12/24] xprtrdma: Clean up of xprtrdma chunk trace points Chuck Lever
2018-12-10 16:30 ` [PATCH v3 13/24] xprtrdma: Relocate the xprtrdma_mr_map " Chuck Lever
2018-12-10 16:30 ` [PATCH v3 14/24] xprtrdma: Add trace points for calls to transport switch methods Chuck Lever
2018-12-10 16:30 ` [PATCH v3 15/24] NFS: Make "port=" mount option optional for RDMA mounts Chuck Lever
2018-12-10 16:30 ` [PATCH v3 16/24] SUNRPC: Remove support for kerberos_v1 Chuck Lever
2018-12-12 21:20   ` Chuck Lever
2018-12-14 21:16     ` Chuck Lever
2018-12-10 16:30 ` [PATCH v3 17/24] SUNRPC: Fix some kernel doc complaints Chuck Lever
2018-12-10 16:30 ` [PATCH v3 18/24] NFS: Fix NFSv4 symbolic trace point output Chuck Lever
     [not found]   ` <632f5635-4c37-16ae-cdd0-65679d21c9ec@oracle.com>
2018-12-11 19:19     ` Calum Mackay
2018-12-10 16:31 ` [PATCH v3 19/24] SUNRPC: Simplify defining common RPC trace events Chuck Lever
2018-12-10 16:31 ` [PATCH v3 20/24] xprtrdma: Trace mapping, alloc, and dereg failures Chuck Lever
2018-12-10 16:31 ` [PATCH v3 21/24] xprtrdma: Update comments in frwr_op_send Chuck Lever
2018-12-10 16:31 ` [PATCH v3 22/24] xprtrdma: Replace outdated comment for rpcrdma_ep_post Chuck Lever
2018-12-10 16:31 ` [PATCH v3 23/24] xprtrdma: Add documenting comment for rpcrdma_buffer_destroy Chuck Lever
2018-12-10 16:31 ` [PATCH v3 24/24] xprtrdma: Clarify comments in rpcrdma_ia_remove Chuck Lever
2018-12-10 17:55 ` [PATCH v3 00/24] NFS/RDMA client for next Jason Gunthorpe

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=20181210163012.4198.33197.stgit@manet.1015granger.net \
    --to=chuck.lever@oracle.com \
    --cc=anna.schumaker@netapp.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.