@@ -191,8 +191,6 @@ int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task)
191
191
goto out_sleep ;
192
192
}
193
193
xprt -> snd_task = task ;
194
- if (req != NULL )
195
- req -> rq_ntrans ++ ;
196
194
197
195
return 1 ;
198
196
@@ -247,7 +245,6 @@ int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task)
247
245
}
248
246
if (__xprt_get_cong (xprt , task )) {
249
247
xprt -> snd_task = task ;
250
- req -> rq_ntrans ++ ;
251
248
return 1 ;
252
249
}
253
250
xprt_clear_locked (xprt );
@@ -281,12 +278,8 @@ static inline int xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task)
281
278
static bool __xprt_lock_write_func (struct rpc_task * task , void * data )
282
279
{
283
280
struct rpc_xprt * xprt = data ;
284
- struct rpc_rqst * req ;
285
281
286
- req = task -> tk_rqstp ;
287
282
xprt -> snd_task = task ;
288
- if (req )
289
- req -> rq_ntrans ++ ;
290
283
return true;
291
284
}
292
285
@@ -1153,6 +1146,7 @@ void xprt_transmit(struct rpc_task *task)
1153
1146
struct rpc_rqst * req = task -> tk_rqstp ;
1154
1147
struct rpc_xprt * xprt = req -> rq_xprt ;
1155
1148
unsigned int connect_cookie ;
1149
+ int is_retrans = RPC_WAS_SENT (task );
1156
1150
int status ;
1157
1151
1158
1152
dprintk ("RPC: %5u xprt_transmit(%u)\n" , task -> tk_pid , req -> rq_slen );
@@ -1167,14 +1161,25 @@ void xprt_transmit(struct rpc_task *task)
1167
1161
}
1168
1162
}
1169
1163
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
+
1170
1171
connect_cookie = xprt -> connect_cookie ;
1171
1172
status = xprt -> ops -> send_request (req , task );
1172
1173
trace_xprt_transmit (xprt , req -> rq_xid , status );
1173
1174
if (status != 0 ) {
1175
+ req -> rq_ntrans -- ;
1174
1176
task -> tk_status = status ;
1175
1177
return ;
1176
1178
}
1177
1179
1180
+ if (is_retrans )
1181
+ task -> tk_client -> cl_stats -> rpcretrans ++ ;
1182
+
1178
1183
xprt_inject_disconnect (xprt );
1179
1184
1180
1185
dprintk ("RPC: %5u xmit complete\n" , task -> tk_pid );
0 commit comments