SUNRPC: change the back-channel queue to lwq
authorNeilBrown <neilb@suse.de>
Mon, 11 Sep 2023 14:40:22 +0000 (10:40 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 16 Oct 2023 16:44:08 +0000 (12:44 -0400)
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>
include/linux/sunrpc/svc.h
include/linux/sunrpc/xprt.h
net/sunrpc/backchannel_rqst.c
net/sunrpc/svc.c
net/sunrpc/svc_xprt.c
net/sunrpc/xprtrdma/backchannel.c

index 8ce1392c1a357af4ab1b314d934c4779f8c5ec22..c1feaf0d15429d831cc719f352d509bd5246f35c 100644 (file)
@@ -90,10 +90,9 @@ struct svc_serv {
        int                     (*sv_threadfn)(void *data);
 
 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
-       struct list_head        sv_cb_list;     /* queue for callback requests
+       struct lwq              sv_cb_list;     /* queue for callback requests
                                                 * that arrive over the same
                                                 * connection */
-       spinlock_t              sv_cb_lock;     /* protects the svc_cb_list */
        bool                    sv_bc_enabled;  /* service uses backchannel */
 #endif /* CONFIG_SUNRPC_BACKCHANNEL */
 };
index 4ecc89301eb74d1a31d9f141fab3ea3ed4157dad..f85d3a0daca26f045be8a628f7e08dc08af380f5 100644 (file)
@@ -57,6 +57,7 @@ struct xprt_class;
 struct seq_file;
 struct svc_serv;
 struct net;
+#include <linux/lwq.h>
 
 /*
  * This describes a complete RPC request
@@ -121,7 +122,7 @@ struct rpc_rqst {
        int                     rq_ntrans;
 
 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
-       struct list_head        rq_bc_list;     /* Callback service list */
+       struct lwq_node         rq_bc_list;     /* Callback service list */
        unsigned long           rq_bc_pa_state; /* Backchannel prealloc state */
        struct list_head        rq_bc_pa_list;  /* Backchannel prealloc list */
 #endif /* CONFIG_SUNRPC_BACKCHANEL */
index 44b7c89a635fa80b01c5df5f758237ff8b9d8c20..caa94cf57123f4e02752cbe8d19912ea470a9463 100644 (file)
@@ -83,7 +83,6 @@ static struct rpc_rqst *xprt_alloc_bc_req(struct rpc_xprt *xprt)
                return NULL;
 
        req->rq_xprt = xprt;
-       INIT_LIST_HEAD(&req->rq_bc_list);
 
        /* Preallocate one XDR receive buffer */
        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)
 
        dprintk("RPC:       add callback request to list\n");
        xprt_get(xprt);
-       spin_lock(&bc_serv->sv_cb_lock);
-       list_add(&req->rq_bc_list, &bc_serv->sv_cb_list);
-       spin_unlock(&bc_serv->sv_cb_lock);
+       lwq_enqueue(&req->rq_bc_list, &bc_serv->sv_cb_list);
        svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]);
 }
index efe7a58ccbdca175654dc7eca08899216b02d3a0..7d4c10e609dcd4f06ae86b2c2cd087c023576013 100644 (file)
@@ -438,8 +438,7 @@ EXPORT_SYMBOL_GPL(svc_bind);
 static void
 __svc_init_bc(struct svc_serv *serv)
 {
-       INIT_LIST_HEAD(&serv->sv_cb_list);
-       spin_lock_init(&serv->sv_cb_lock);
+       lwq_init(&serv->sv_cb_list);
 }
 #else
 static void
index 28ca7db55da1b2bdfb01ea2869633eab7f5b05d8..fee83d1024bc8d0a1f6fba7a2a74687850c340cf 100644 (file)
@@ -705,7 +705,7 @@ svc_thread_should_sleep(struct svc_rqst *rqstp)
 
 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
        if (svc_is_backchannel(rqstp)) {
-               if (!list_empty(&rqstp->rq_server->sv_cb_list))
+               if (!lwq_empty(&rqstp->rq_server->sv_cb_list))
                        return false;
        }
 #endif
@@ -878,18 +878,12 @@ void svc_recv(struct svc_rqst *rqstp)
                struct svc_serv *serv = rqstp->rq_server;
                struct rpc_rqst *req;
 
-               spin_lock_bh(&serv->sv_cb_lock);
-               req = list_first_entry_or_null(&serv->sv_cb_list,
-                                              struct rpc_rqst, rq_bc_list);
+               req = lwq_dequeue(&serv->sv_cb_list,
+                                 struct rpc_rqst, rq_bc_list);
                if (req) {
-                       list_del(&req->rq_bc_list);
-                       spin_unlock_bh(&serv->sv_cb_lock);
                        svc_thread_wake_next(rqstp);
-
                        svc_process_bc(req, rqstp);
-                       return;
                }
-               spin_unlock_bh(&serv->sv_cb_lock);
        }
 #endif
 }
index bfc434ec52a7d14d19a89f7576453c720ddccee6..8c817e755262df284e2b6c5d55ff1ade93ee40d2 100644 (file)
@@ -263,9 +263,7 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
        /* Queue rqst for ULP's callback service */
        bc_serv = xprt->bc_serv;
        xprt_get(xprt);
-       spin_lock(&bc_serv->sv_cb_lock);
-       list_add(&rqst->rq_bc_list, &bc_serv->sv_cb_list);
-       spin_unlock(&bc_serv->sv_cb_lock);
+       lwq_enqueue(&rqst->rq_bc_list, &bc_serv->sv_cb_list);
 
        svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]);