diff options
| author | Chuck Lever <cel@netapp.com> | 2005-08-25 19:25:53 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-09-23 12:38:45 -0400 |
| commit | a58dd398f5db4f73d5c581069fd70a4304cc4f0a (patch) | |
| tree | 09e290d351c043392e7a2f8e0bc77aba90ff88ad | |
| parent | 1570c1e41eabf6b7031f3e4322a2cf1cbe319fee (diff) | |
[PATCH] RPC: add a release_rqst callout to the RPC transport switch
The final place where congestion control state is adjusted is in
xprt_release, where each request is finally released. Add a callout
there to allow transports to perform additional processing when a
request is about to be released.
Test-plan:
Use WAN simulation to cause sporadic bursty packet loss. Look for significant
regression in performance or client stability.
Signed-off-by: Chuck Lever <cel@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
| -rw-r--r-- | include/linux/sunrpc/xprt.h | 2 | ||||
| -rw-r--r-- | net/sunrpc/xprt.c | 14 | ||||
| -rw-r--r-- | net/sunrpc/xprtsock.c | 1 |
3 files changed, 16 insertions, 1 deletions
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 2e48752d55d9..64e77658fa30 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
| @@ -138,6 +138,7 @@ struct rpc_xprt_ops { | |||
| 138 | int (*send_request)(struct rpc_task *task); | 138 | int (*send_request)(struct rpc_task *task); |
| 139 | void (*set_retrans_timeout)(struct rpc_task *task); | 139 | void (*set_retrans_timeout)(struct rpc_task *task); |
| 140 | void (*timer)(struct rpc_task *task); | 140 | void (*timer)(struct rpc_task *task); |
| 141 | void (*release_request)(struct rpc_task *task); | ||
| 141 | void (*close)(struct rpc_xprt *xprt); | 142 | void (*close)(struct rpc_xprt *xprt); |
| 142 | void (*destroy)(struct rpc_xprt *xprt); | 143 | void (*destroy)(struct rpc_xprt *xprt); |
| 143 | }; | 144 | }; |
| @@ -262,6 +263,7 @@ void xprt_update_rtt(struct rpc_task *task); | |||
| 262 | void xprt_adjust_cwnd(struct rpc_task *task, int result); | 263 | void xprt_adjust_cwnd(struct rpc_task *task, int result); |
| 263 | struct rpc_rqst * xprt_lookup_rqst(struct rpc_xprt *xprt, u32 xid); | 264 | struct rpc_rqst * xprt_lookup_rqst(struct rpc_xprt *xprt, u32 xid); |
| 264 | void xprt_complete_rqst(struct rpc_task *task, int copied); | 265 | void xprt_complete_rqst(struct rpc_task *task, int copied); |
| 266 | void xprt_release_rqst_cong(struct rpc_task *task); | ||
| 265 | void xprt_disconnect(struct rpc_xprt *xprt); | 267 | void xprt_disconnect(struct rpc_xprt *xprt); |
| 266 | 268 | ||
| 267 | /* | 269 | /* |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 707806fe1a23..e8d11bd6158e 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
| @@ -290,6 +290,17 @@ __xprt_put_cong(struct rpc_xprt *xprt, struct rpc_rqst *req) | |||
| 290 | } | 290 | } |
| 291 | 291 | ||
| 292 | /** | 292 | /** |
| 293 | * xprt_release_rqst_cong - housekeeping when request is complete | ||
| 294 | * @task: RPC request that recently completed | ||
| 295 | * | ||
| 296 | * Useful for transports that require congestion control. | ||
| 297 | */ | ||
| 298 | void xprt_release_rqst_cong(struct rpc_task *task) | ||
| 299 | { | ||
| 300 | __xprt_put_cong(task->tk_xprt, task->tk_rqstp); | ||
| 301 | } | ||
| 302 | |||
| 303 | /** | ||
| 293 | * xprt_adjust_cwnd - adjust transport congestion window | 304 | * xprt_adjust_cwnd - adjust transport congestion window |
| 294 | * @task: recently completed RPC request used to adjust window | 305 | * @task: recently completed RPC request used to adjust window |
| 295 | * @result: result code of completed RPC request | 306 | * @result: result code of completed RPC request |
| @@ -823,7 +834,8 @@ void xprt_release(struct rpc_task *task) | |||
| 823 | return; | 834 | return; |
| 824 | spin_lock_bh(&xprt->transport_lock); | 835 | spin_lock_bh(&xprt->transport_lock); |
| 825 | xprt->ops->release_xprt(xprt, task); | 836 | xprt->ops->release_xprt(xprt, task); |
| 826 | __xprt_put_cong(xprt, req); | 837 | if (xprt->ops->release_request) |
| 838 | xprt->ops->release_request(task); | ||
| 827 | if (!list_empty(&req->rq_list)) | 839 | if (!list_empty(&req->rq_list)) |
| 828 | list_del(&req->rq_list); | 840 | list_del(&req->rq_list); |
| 829 | xprt->last_used = jiffies; | 841 | xprt->last_used = jiffies; |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 980f26504f48..6c2f5dcea416 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -1059,6 +1059,7 @@ static struct rpc_xprt_ops xs_udp_ops = { | |||
| 1059 | .send_request = xs_udp_send_request, | 1059 | .send_request = xs_udp_send_request, |
| 1060 | .set_retrans_timeout = xprt_set_retrans_timeout_rtt, | 1060 | .set_retrans_timeout = xprt_set_retrans_timeout_rtt, |
| 1061 | .timer = xs_udp_timer, | 1061 | .timer = xs_udp_timer, |
| 1062 | .release_request = xprt_release_rqst_cong, | ||
| 1062 | .close = xs_close, | 1063 | .close = xs_close, |
| 1063 | .destroy = xs_destroy, | 1064 | .destroy = xs_destroy, |
| 1064 | }; | 1065 | }; |
