]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
SUNRPC: cleanup common code in backchannel request
authorOlga Kornievskaia <okorniev@redhat.com>
Tue, 4 Nov 2025 22:29:25 +0000 (17:29 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 23 Nov 2025 20:30:12 +0000 (15:30 -0500)
Create a helper function for common code between rdma
and tcp backchannel handling of the backchannel request.
Make sure that access is protected by the bc_pa_lock
lock.

Signed-off-by: Olga Kornievskaia <okorniev@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
include/linux/sunrpc/bc_xprt.h
net/sunrpc/backchannel_rqst.c
net/sunrpc/xprtrdma/backchannel.c

index f22bf915dcf6e6e52740251ee292d0b2a147b794..178f34ad8db6f8c39aae5b62aa614a17a6ba809b 100644 (file)
@@ -25,6 +25,7 @@ void xprt_init_bc_request(struct rpc_rqst *req, struct rpc_task *task,
 void xprt_free_bc_request(struct rpc_rqst *req);
 int xprt_setup_backchannel(struct rpc_xprt *, unsigned int min_reqs);
 void xprt_destroy_backchannel(struct rpc_xprt *, unsigned int max_reqs);
+void xprt_enqueue_bc_request(struct rpc_rqst *req);
 
 /* Socket backchannel transport methods */
 int xprt_setup_bc(struct rpc_xprt *xprt, unsigned int min_reqs);
index caa94cf57123f4e02752cbe8d19912ea470a9463..efddea0f4b8b56ed5ea824e6e9e8554e05d12797 100644 (file)
@@ -354,7 +354,6 @@ found:
 void xprt_complete_bc_request(struct rpc_rqst *req, uint32_t copied)
 {
        struct rpc_xprt *xprt = req->rq_xprt;
-       struct svc_serv *bc_serv = xprt->bc_serv;
 
        spin_lock(&xprt->bc_pa_lock);
        list_del(&req->rq_bc_pa_list);
@@ -365,7 +364,21 @@ void xprt_complete_bc_request(struct rpc_rqst *req, uint32_t copied)
        set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state);
 
        dprintk("RPC:       add callback request to list\n");
+       xprt_enqueue_bc_request(req);
+}
+
+void xprt_enqueue_bc_request(struct rpc_rqst *req)
+{
+       struct rpc_xprt *xprt = req->rq_xprt;
+       struct svc_serv *bc_serv;
+
        xprt_get(xprt);
-       lwq_enqueue(&req->rq_bc_list, &bc_serv->sv_cb_list);
-       svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]);
+       spin_lock(&xprt->bc_pa_lock);
+       bc_serv = xprt->bc_serv;
+       if (bc_serv) {
+               lwq_enqueue(&req->rq_bc_list, &bc_serv->sv_cb_list);
+               svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]);
+       }
+       spin_unlock(&xprt->bc_pa_lock);
 }
+EXPORT_SYMBOL_GPL(xprt_enqueue_bc_request);
index 8c817e755262df284e2b6c5d55ff1ade93ee40d2..2f0f9618dd0580f8ad72f64b4926b0c5be043bb7 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/sunrpc/svc.h>
 #include <linux/sunrpc/svc_xprt.h>
 #include <linux/sunrpc/svc_rdma.h>
+#include <linux/sunrpc/bc_xprt.h>
 
 #include "xprt_rdma.h"
 #include <trace/events/rpcrdma.h>
@@ -220,7 +221,6 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
                             struct rpcrdma_rep *rep)
 {
        struct rpc_xprt *xprt = &r_xprt->rx_xprt;
-       struct svc_serv *bc_serv;
        struct rpcrdma_req *req;
        struct rpc_rqst *rqst;
        struct xdr_buf *buf;
@@ -261,11 +261,7 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
        trace_xprtrdma_cb_call(r_xprt, rqst);
 
        /* Queue rqst for ULP's callback service */
-       bc_serv = xprt->bc_serv;
-       xprt_get(xprt);
-       lwq_enqueue(&rqst->rq_bc_list, &bc_serv->sv_cb_list);
-
-       svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]);
+       xprt_enqueue_bc_request(rqst);
 
        r_xprt->rx_stats.bcall_count++;
        return;