Skip to content

Commit dcbbeda

Browse files
author
Trond Myklebust
committed
SUNRPC: Move RPC retransmission stat counter to xprt_transmit()
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent 5f2f6bd commit dcbbeda

File tree

2 files changed

+12
-13
lines changed

2 files changed

+12
-13
lines changed

net/sunrpc/clnt.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,8 +1962,6 @@ call_connect_status(struct rpc_task *task)
19621962
static void
19631963
call_transmit(struct rpc_task *task)
19641964
{
1965-
int is_retrans = RPC_WAS_SENT(task);
1966-
19671965
dprint_status(task);
19681966

19691967
task->tk_action = call_transmit_status;
@@ -1973,10 +1971,6 @@ call_transmit(struct rpc_task *task)
19731971
if (!xprt_prepare_transmit(task))
19741972
return;
19751973
xprt_transmit(task);
1976-
if (task->tk_status < 0)
1977-
return;
1978-
if (is_retrans)
1979-
task->tk_client->cl_stats->rpcretrans++;
19801974
}
19811975

19821976
/*

net/sunrpc/xprt.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,6 @@ int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task)
191191
goto out_sleep;
192192
}
193193
xprt->snd_task = task;
194-
if (req != NULL)
195-
req->rq_ntrans++;
196194

197195
return 1;
198196

@@ -247,7 +245,6 @@ int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task)
247245
}
248246
if (__xprt_get_cong(xprt, task)) {
249247
xprt->snd_task = task;
250-
req->rq_ntrans++;
251248
return 1;
252249
}
253250
xprt_clear_locked(xprt);
@@ -281,12 +278,8 @@ static inline int xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task)
281278
static bool __xprt_lock_write_func(struct rpc_task *task, void *data)
282279
{
283280
struct rpc_xprt *xprt = data;
284-
struct rpc_rqst *req;
285281

286-
req = task->tk_rqstp;
287282
xprt->snd_task = task;
288-
if (req)
289-
req->rq_ntrans++;
290283
return true;
291284
}
292285

@@ -1153,6 +1146,7 @@ void xprt_transmit(struct rpc_task *task)
11531146
struct rpc_rqst *req = task->tk_rqstp;
11541147
struct rpc_xprt *xprt = req->rq_xprt;
11551148
unsigned int connect_cookie;
1149+
int is_retrans = RPC_WAS_SENT(task);
11561150
int status;
11571151

11581152
dprintk("RPC: %5u xprt_transmit(%u)\n", task->tk_pid, req->rq_slen);
@@ -1167,14 +1161,25 @@ void xprt_transmit(struct rpc_task *task)
11671161
}
11681162
}
11691163

1164+
/*
1165+
* Update req->rq_ntrans before transmitting to avoid races with
1166+
* xprt_update_rtt(), which needs to know that it is recording a
1167+
* reply to the first transmission.
1168+
*/
1169+
req->rq_ntrans++;
1170+
11701171
connect_cookie = xprt->connect_cookie;
11711172
status = xprt->ops->send_request(req, task);
11721173
trace_xprt_transmit(xprt, req->rq_xid, status);
11731174
if (status != 0) {
1175+
req->rq_ntrans--;
11741176
task->tk_status = status;
11751177
return;
11761178
}
11771179

1180+
if (is_retrans)
1181+
task->tk_client->cl_stats->rpcretrans++;
1182+
11781183
xprt_inject_disconnect(xprt);
11791184

11801185
dprintk("RPC: %5u xmit complete\n", task->tk_pid);

0 commit comments

Comments
 (0)