diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2018-05-04 15:34:59 -0400 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2018-05-07 09:20:03 -0400 |
commit | a9cde23ab7cdf5e4e93432dffd0e734267f2b745 (patch) | |
tree | 1c3aea9e962db1c79e19ad9217aa3dd9ddf8778d | |
parent | 37ac86c3a76c113619b7d9afe0251bbfc04cb80a (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.h | 4 | ||||
-rw-r--r-- | net/sunrpc/xprt.c | 5 | ||||
-rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_backchannel.c | 1 | ||||
-rw-r--r-- | net/sunrpc/xprtrdma/transport.c | 1 | ||||
-rw-r--r-- | net/sunrpc/xprtsock.c | 4 |
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); | |||
329 | int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task); | 331 | int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task); |
330 | int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); | 332 | int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); |
331 | void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); | 333 | void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); |
334 | void xprt_free_slot(struct rpc_xprt *xprt, | ||
335 | struct rpc_rqst *req); | ||
332 | void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); | 336 | void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); |
333 | bool xprt_prepare_transmit(struct rpc_task *task); | 337 | bool xprt_prepare_transmit(struct rpc_task *task); |
334 | void xprt_transmit(struct rpc_task *task); | 338 | void 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 | } |
1187 | EXPORT_SYMBOL_GPL(xprt_lock_and_alloc_slot); | 1187 | EXPORT_SYMBOL_GPL(xprt_lock_and_alloc_slot); |
1188 | 1188 | ||
1189 | static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) | 1189 | void 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 | } |
1199 | EXPORT_SYMBOL_GPL(xprt_free_slot); | ||
1199 | 1200 | ||
1200 | static void xprt_free_all_slots(struct rpc_xprt *xprt) | 1201 | static 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, |