Skip to content

Commit 15d3988

Browse files
neilbrownchucklever
authored andcommitted
SUNRPC: change the back-channel queue to lwq
This removes the need to store and update back-links in the list. It also remove the need for the _bh version of spin_lock(). Signed-off-by: NeilBrown <neilb@suse.de> Cc: Trond Myklebust <trond.myklebust@hammerspace.com> Cc: Anna Schumaker <Anna.Schumaker@Netapp.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
1 parent 580a257 commit 15d3988

File tree

6 files changed

+9
-21
lines changed

6 files changed

+9
-21
lines changed

include/linux/sunrpc/svc.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,9 @@ struct svc_serv {
9090
int (*sv_threadfn)(void *data);
9191

9292
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
93-
struct list_head sv_cb_list; /* queue for callback requests
93+
struct lwq sv_cb_list; /* queue for callback requests
9494
* that arrive over the same
9595
* connection */
96-
spinlock_t sv_cb_lock; /* protects the svc_cb_list */
9796
bool sv_bc_enabled; /* service uses backchannel */
9897
#endif /* CONFIG_SUNRPC_BACKCHANNEL */
9998
};

include/linux/sunrpc/xprt.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ struct xprt_class;
5757
struct seq_file;
5858
struct svc_serv;
5959
struct net;
60+
#include <linux/lwq.h>
6061

6162
/*
6263
* This describes a complete RPC request
@@ -121,7 +122,7 @@ struct rpc_rqst {
121122
int rq_ntrans;
122123

123124
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
124-
struct list_head rq_bc_list; /* Callback service list */
125+
struct lwq_node rq_bc_list; /* Callback service list */
125126
unsigned long rq_bc_pa_state; /* Backchannel prealloc state */
126127
struct list_head rq_bc_pa_list; /* Backchannel prealloc list */
127128
#endif /* CONFIG_SUNRPC_BACKCHANEL */

net/sunrpc/backchannel_rqst.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ static struct rpc_rqst *xprt_alloc_bc_req(struct rpc_xprt *xprt)
8383
return NULL;
8484

8585
req->rq_xprt = xprt;
86-
INIT_LIST_HEAD(&req->rq_bc_list);
8786

8887
/* Preallocate one XDR receive buffer */
8988
if (xprt_alloc_xdr_buf(&req->rq_rcv_buf, gfp_flags) < 0) {
@@ -367,8 +366,6 @@ void xprt_complete_bc_request(struct rpc_rqst *req, uint32_t copied)
367366

368367
dprintk("RPC: add callback request to list\n");
369368
xprt_get(xprt);
370-
spin_lock(&bc_serv->sv_cb_lock);
371-
list_add(&req->rq_bc_list, &bc_serv->sv_cb_list);
372-
spin_unlock(&bc_serv->sv_cb_lock);
369+
lwq_enqueue(&req->rq_bc_list, &bc_serv->sv_cb_list);
373370
svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]);
374371
}

net/sunrpc/svc.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,8 +438,7 @@ EXPORT_SYMBOL_GPL(svc_bind);
438438
static void
439439
__svc_init_bc(struct svc_serv *serv)
440440
{
441-
INIT_LIST_HEAD(&serv->sv_cb_list);
442-
spin_lock_init(&serv->sv_cb_lock);
441+
lwq_init(&serv->sv_cb_list);
443442
}
444443
#else
445444
static void

net/sunrpc/svc_xprt.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ svc_thread_should_sleep(struct svc_rqst *rqstp)
705705

706706
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
707707
if (svc_is_backchannel(rqstp)) {
708-
if (!list_empty(&rqstp->rq_server->sv_cb_list))
708+
if (!lwq_empty(&rqstp->rq_server->sv_cb_list))
709709
return false;
710710
}
711711
#endif
@@ -878,18 +878,12 @@ void svc_recv(struct svc_rqst *rqstp)
878878
struct svc_serv *serv = rqstp->rq_server;
879879
struct rpc_rqst *req;
880880

881-
spin_lock_bh(&serv->sv_cb_lock);
882-
req = list_first_entry_or_null(&serv->sv_cb_list,
883-
struct rpc_rqst, rq_bc_list);
881+
req = lwq_dequeue(&serv->sv_cb_list,
882+
struct rpc_rqst, rq_bc_list);
884883
if (req) {
885-
list_del(&req->rq_bc_list);
886-
spin_unlock_bh(&serv->sv_cb_lock);
887884
svc_thread_wake_next(rqstp);
888-
889885
svc_process_bc(req, rqstp);
890-
return;
891886
}
892-
spin_unlock_bh(&serv->sv_cb_lock);
893887
}
894888
#endif
895889
}

net/sunrpc/xprtrdma/backchannel.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,7 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
263263
/* Queue rqst for ULP's callback service */
264264
bc_serv = xprt->bc_serv;
265265
xprt_get(xprt);
266-
spin_lock(&bc_serv->sv_cb_lock);
267-
list_add(&rqst->rq_bc_list, &bc_serv->sv_cb_list);
268-
spin_unlock(&bc_serv->sv_cb_lock);
266+
lwq_enqueue(&rqst->rq_bc_list, &bc_serv->sv_cb_list);
269267

270268
svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]);
271269

0 commit comments

Comments
 (0)