Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

SUNRPC: cleanup common code in backchannel request

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>

authored by

Olga Kornievskaia and committed by
Trond Myklebust
441244d4 8936ff47

+20 -10
+1
include/linux/sunrpc/bc_xprt.h
··· 25 25 void xprt_free_bc_request(struct rpc_rqst *req); 26 26 int xprt_setup_backchannel(struct rpc_xprt *, unsigned int min_reqs); 27 27 void xprt_destroy_backchannel(struct rpc_xprt *, unsigned int max_reqs); 28 + void xprt_enqueue_bc_request(struct rpc_rqst *req); 28 29 29 30 /* Socket backchannel transport methods */ 30 31 int xprt_setup_bc(struct rpc_xprt *xprt, unsigned int min_reqs);
+17 -4
net/sunrpc/backchannel_rqst.c
··· 354 354 void xprt_complete_bc_request(struct rpc_rqst *req, uint32_t copied) 355 355 { 356 356 struct rpc_xprt *xprt = req->rq_xprt; 357 - struct svc_serv *bc_serv = xprt->bc_serv; 358 357 359 358 spin_lock(&xprt->bc_pa_lock); 360 359 list_del(&req->rq_bc_pa_list); ··· 364 365 set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); 365 366 366 367 dprintk("RPC: add callback request to list\n"); 367 - xprt_get(xprt); 368 - lwq_enqueue(&req->rq_bc_list, &bc_serv->sv_cb_list); 369 - svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]); 368 + xprt_enqueue_bc_request(req); 370 369 } 370 + 371 + void xprt_enqueue_bc_request(struct rpc_rqst *req) 372 + { 373 + struct rpc_xprt *xprt = req->rq_xprt; 374 + struct svc_serv *bc_serv; 375 + 376 + xprt_get(xprt); 377 + spin_lock(&xprt->bc_pa_lock); 378 + bc_serv = xprt->bc_serv; 379 + if (bc_serv) { 380 + lwq_enqueue(&req->rq_bc_list, &bc_serv->sv_cb_list); 381 + svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]); 382 + } 383 + spin_unlock(&xprt->bc_pa_lock); 384 + } 385 + EXPORT_SYMBOL_GPL(xprt_enqueue_bc_request);
+2 -6
net/sunrpc/xprtrdma/backchannel.c
··· 9 9 #include <linux/sunrpc/svc.h> 10 10 #include <linux/sunrpc/svc_xprt.h> 11 11 #include <linux/sunrpc/svc_rdma.h> 12 + #include <linux/sunrpc/bc_xprt.h> 12 13 13 14 #include "xprt_rdma.h" 14 15 #include <trace/events/rpcrdma.h> ··· 221 220 struct rpcrdma_rep *rep) 222 221 { 223 222 struct rpc_xprt *xprt = &r_xprt->rx_xprt; 224 - struct svc_serv *bc_serv; 225 223 struct rpcrdma_req *req; 226 224 struct rpc_rqst *rqst; 227 225 struct xdr_buf *buf; ··· 261 261 trace_xprtrdma_cb_call(r_xprt, rqst); 262 262 263 263 /* Queue rqst for ULP's callback service */ 264 - bc_serv = xprt->bc_serv; 265 - xprt_get(xprt); 266 - lwq_enqueue(&rqst->rq_bc_list, &bc_serv->sv_cb_list); 267 - 268 - svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]); 264 + xprt_enqueue_bc_request(rqst); 269 265 270 266 r_xprt->rx_stats.bcall_count++; 271 267 return;