Skip to content

Commit 441244d

Browse files
Olga KornievskaiaTrond Myklebust
authored andcommitted
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>
1 parent 8936ff4 commit 441244d

3 files changed

Lines changed: 19 additions & 9 deletions

File tree

include/linux/sunrpc/bc_xprt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ void xprt_init_bc_request(struct rpc_rqst *req, struct rpc_task *task,
2525
void xprt_free_bc_request(struct rpc_rqst *req);
2626
int xprt_setup_backchannel(struct rpc_xprt *, unsigned int min_reqs);
2727
void xprt_destroy_backchannel(struct rpc_xprt *, unsigned int max_reqs);
28+
void xprt_enqueue_bc_request(struct rpc_rqst *req);
2829

2930
/* Socket backchannel transport methods */
3031
int xprt_setup_bc(struct rpc_xprt *xprt, unsigned int min_reqs);

net/sunrpc/backchannel_rqst.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,6 @@ struct rpc_rqst *xprt_lookup_bc_request(struct rpc_xprt *xprt, __be32 xid)
354354
void xprt_complete_bc_request(struct rpc_rqst *req, uint32_t copied)
355355
{
356356
struct rpc_xprt *xprt = req->rq_xprt;
357-
struct svc_serv *bc_serv = xprt->bc_serv;
358357

359358
spin_lock(&xprt->bc_pa_lock);
360359
list_del(&req->rq_bc_pa_list);
@@ -365,7 +364,21 @@ void xprt_complete_bc_request(struct rpc_rqst *req, uint32_t copied)
365364
set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state);
366365

367366
dprintk("RPC: add callback request to list\n");
367+
xprt_enqueue_bc_request(req);
368+
}
369+
370+
void xprt_enqueue_bc_request(struct rpc_rqst *req)
371+
{
372+
struct rpc_xprt *xprt = req->rq_xprt;
373+
struct svc_serv *bc_serv;
374+
368375
xprt_get(xprt);
369-
lwq_enqueue(&req->rq_bc_list, &bc_serv->sv_cb_list);
370-
svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]);
376+
spin_lock(&xprt->bc_pa_lock);
377+
bc_serv = xprt->bc_serv;
378+
if (bc_serv) {
379+
lwq_enqueue(&req->rq_bc_list, &bc_serv->sv_cb_list);
380+
svc_pool_wake_idle_thread(&bc_serv->sv_pools[0]);
381+
}
382+
spin_unlock(&xprt->bc_pa_lock);
371383
}
384+
EXPORT_SYMBOL_GPL(xprt_enqueue_bc_request);

net/sunrpc/xprtrdma/backchannel.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <linux/sunrpc/svc.h>
1010
#include <linux/sunrpc/svc_xprt.h>
1111
#include <linux/sunrpc/svc_rdma.h>
12+
#include <linux/sunrpc/bc_xprt.h>
1213

1314
#include "xprt_rdma.h"
1415
#include <trace/events/rpcrdma.h>
@@ -220,7 +221,6 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
220221
struct rpcrdma_rep *rep)
221222
{
222223
struct rpc_xprt *xprt = &r_xprt->rx_xprt;
223-
struct svc_serv *bc_serv;
224224
struct rpcrdma_req *req;
225225
struct rpc_rqst *rqst;
226226
struct xdr_buf *buf;
@@ -261,11 +261,7 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
261261
trace_xprtrdma_cb_call(r_xprt, rqst);
262262

263263
/* 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);
269265

270266
r_xprt->rx_stats.bcall_count++;
271267
return;

0 commit comments

Comments
 (0)