aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2018-05-04 15:34:59 -0400
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2018-05-07 09:20:03 -0400
commita9cde23ab7cdf5e4e93432dffd0e734267f2b745 (patch)
tree1c3aea9e962db1c79e19ad9217aa3dd9ddf8778d
parent37ac86c3a76c113619b7d9afe0251bbfc04cb80a (diff)
SUNRPC: Add a ->free_slot transport callout
Refactor: xprtrdma needs to have better control over when RPCs are awoken from the backlog queue, so replace xprt_free_slot with a transport op callout. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
-rw-r--r--include/linux/sunrpc/xprt.h4
-rw-r--r--net/sunrpc/xprt.c5
-rw-r--r--net/sunrpc/xprtrdma/svc_rdma_backchannel.c1
-rw-r--r--net/sunrpc/xprtrdma/transport.c1
-rw-r--r--net/sunrpc/xprtsock.c4
5 files changed, 13 insertions, 2 deletions
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h
index 9784e2875e7e..706eef12bbc0 100644
--- a/include/linux/sunrpc/xprt.h
+++ b/include/linux/sunrpc/xprt.h
@@ -127,6 +127,8 @@ struct rpc_xprt_ops {
127 int (*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); 127 int (*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
128 void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); 128 void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
129 void (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task); 129 void (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task);
130 void (*free_slot)(struct rpc_xprt *xprt,
131 struct rpc_rqst *req);
130 void (*rpcbind)(struct rpc_task *task); 132 void (*rpcbind)(struct rpc_task *task);
131 void (*set_port)(struct rpc_xprt *xprt, unsigned short port); 133 void (*set_port)(struct rpc_xprt *xprt, unsigned short port);
132 void (*connect)(struct rpc_xprt *xprt, struct rpc_task *task); 134 void (*connect)(struct rpc_xprt *xprt, struct rpc_task *task);
@@ -329,6 +331,8 @@ void xprt_retry_reserve(struct rpc_task *task);
329int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task); 331int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
330int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); 332int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
331void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); 333void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
334void xprt_free_slot(struct rpc_xprt *xprt,
335 struct rpc_rqst *req);
332void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); 336void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
333bool xprt_prepare_transmit(struct rpc_task *task); 337bool xprt_prepare_transmit(struct rpc_task *task);
334void xprt_transmit(struct rpc_task *task); 338void xprt_transmit(struct rpc_task *task);
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
index 2d959268d9b7..3c85af058227 100644
--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -1186,7 +1186,7 @@ void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task)
1186} 1186}
1187EXPORT_SYMBOL_GPL(xprt_lock_and_alloc_slot); 1187EXPORT_SYMBOL_GPL(xprt_lock_and_alloc_slot);
1188 1188
1189static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) 1189void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req)
1190{ 1190{
1191 spin_lock(&xprt->reserve_lock); 1191 spin_lock(&xprt->reserve_lock);
1192 if (!xprt_dynamic_free_slot(xprt, req)) { 1192 if (!xprt_dynamic_free_slot(xprt, req)) {
@@ -1196,6 +1196,7 @@ static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req)
1196 xprt_wake_up_backlog(xprt); 1196 xprt_wake_up_backlog(xprt);
1197 spin_unlock(&xprt->reserve_lock); 1197 spin_unlock(&xprt->reserve_lock);
1198} 1198}
1199EXPORT_SYMBOL_GPL(xprt_free_slot);
1199 1200
1200static void xprt_free_all_slots(struct rpc_xprt *xprt) 1201static void xprt_free_all_slots(struct rpc_xprt *xprt)
1201{ 1202{
@@ -1375,7 +1376,7 @@ void xprt_release(struct rpc_task *task)
1375 1376
1376 dprintk("RPC: %5u release request %p\n", task->tk_pid, req); 1377 dprintk("RPC: %5u release request %p\n", task->tk_pid, req);
1377 if (likely(!bc_prealloc(req))) 1378 if (likely(!bc_prealloc(req)))
1378 xprt_free_slot(xprt, req); 1379 xprt->ops->free_slot(xprt, req);
1379 else 1380 else
1380 xprt_free_bc_request(req); 1381 xprt_free_bc_request(req);
1381} 1382}
diff --git a/net/sunrpc/xprtrdma/svc_rdma_backchannel.c b/net/sunrpc/xprtrdma/svc_rdma_backchannel.c
index a73632ca9048..1035516d54e2 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_backchannel.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_backchannel.c
@@ -273,6 +273,7 @@ static const struct rpc_xprt_ops xprt_rdma_bc_procs = {
273 .reserve_xprt = xprt_reserve_xprt_cong, 273 .reserve_xprt = xprt_reserve_xprt_cong,
274 .release_xprt = xprt_release_xprt_cong, 274 .release_xprt = xprt_release_xprt_cong,
275 .alloc_slot = xprt_alloc_slot, 275 .alloc_slot = xprt_alloc_slot,
276 .free_slot = xprt_free_slot,
276 .release_request = xprt_release_rqst_cong, 277 .release_request = xprt_release_rqst_cong,
277 .buf_alloc = xprt_rdma_bc_allocate, 278 .buf_alloc = xprt_rdma_bc_allocate,
278 .buf_free = xprt_rdma_bc_free, 279 .buf_free = xprt_rdma_bc_free,
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
index 4717578b4b81..cf5e866ee969 100644
--- a/net/sunrpc/xprtrdma/transport.c
+++ b/net/sunrpc/xprtrdma/transport.c
@@ -781,6 +781,7 @@ static const struct rpc_xprt_ops xprt_rdma_procs = {
781 .reserve_xprt = xprt_reserve_xprt_cong, 781 .reserve_xprt = xprt_reserve_xprt_cong,
782 .release_xprt = xprt_release_xprt_cong, /* sunrpc/xprt.c */ 782 .release_xprt = xprt_release_xprt_cong, /* sunrpc/xprt.c */
783 .alloc_slot = xprt_alloc_slot, 783 .alloc_slot = xprt_alloc_slot,
784 .free_slot = xprt_free_slot,
784 .release_request = xprt_release_rqst_cong, /* ditto */ 785 .release_request = xprt_release_rqst_cong, /* ditto */
785 .set_retrans_timeout = xprt_set_retrans_timeout_def, /* ditto */ 786 .set_retrans_timeout = xprt_set_retrans_timeout_def, /* ditto */
786 .timer = xprt_rdma_timer, 787 .timer = xprt_rdma_timer,
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index c8902f11efdd..9e1c5024aba9 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -2763,6 +2763,7 @@ static const struct rpc_xprt_ops xs_local_ops = {
2763 .reserve_xprt = xprt_reserve_xprt, 2763 .reserve_xprt = xprt_reserve_xprt,
2764 .release_xprt = xs_tcp_release_xprt, 2764 .release_xprt = xs_tcp_release_xprt,
2765 .alloc_slot = xprt_alloc_slot, 2765 .alloc_slot = xprt_alloc_slot,
2766 .free_slot = xprt_free_slot,
2766 .rpcbind = xs_local_rpcbind, 2767 .rpcbind = xs_local_rpcbind,
2767 .set_port = xs_local_set_port, 2768 .set_port = xs_local_set_port,
2768 .connect = xs_local_connect, 2769 .connect = xs_local_connect,
@@ -2782,6 +2783,7 @@ static const struct rpc_xprt_ops xs_udp_ops = {
2782 .reserve_xprt = xprt_reserve_xprt_cong, 2783 .reserve_xprt = xprt_reserve_xprt_cong,
2783 .release_xprt = xprt_release_xprt_cong, 2784 .release_xprt = xprt_release_xprt_cong,
2784 .alloc_slot = xprt_alloc_slot, 2785 .alloc_slot = xprt_alloc_slot,
2786 .free_slot = xprt_free_slot,
2785 .rpcbind = rpcb_getport_async, 2787 .rpcbind = rpcb_getport_async,
2786 .set_port = xs_set_port, 2788 .set_port = xs_set_port,
2787 .connect = xs_connect, 2789 .connect = xs_connect,
@@ -2803,6 +2805,7 @@ static const struct rpc_xprt_ops xs_tcp_ops = {
2803 .reserve_xprt = xprt_reserve_xprt, 2805 .reserve_xprt = xprt_reserve_xprt,
2804 .release_xprt = xs_tcp_release_xprt, 2806 .release_xprt = xs_tcp_release_xprt,
2805 .alloc_slot = xprt_lock_and_alloc_slot, 2807 .alloc_slot = xprt_lock_and_alloc_slot,
2808 .free_slot = xprt_free_slot,
2806 .rpcbind = rpcb_getport_async, 2809 .rpcbind = rpcb_getport_async,
2807 .set_port = xs_set_port, 2810 .set_port = xs_set_port,
2808 .connect = xs_connect, 2811 .connect = xs_connect,
@@ -2834,6 +2837,7 @@ static const struct rpc_xprt_ops bc_tcp_ops = {
2834 .reserve_xprt = xprt_reserve_xprt, 2837 .reserve_xprt = xprt_reserve_xprt,
2835 .release_xprt = xprt_release_xprt, 2838 .release_xprt = xprt_release_xprt,
2836 .alloc_slot = xprt_alloc_slot, 2839 .alloc_slot = xprt_alloc_slot,
2840 .free_slot = xprt_free_slot,
2837 .buf_alloc = bc_malloc, 2841 .buf_alloc = bc_malloc,
2838 .buf_free = bc_free, 2842 .buf_free = bc_free,
2839 .send_request = bc_send_request, 2843 .send_request = bc_send_request,