Skip to content

Commit 1d4adfa

Browse files
committed
rxrpc: Make rxrpc_kernel_get_srtt() indicate validity
Fix rxrpc_kernel_get_srtt() to indicate the validity of the returned smoothed RTT. If we haven't had any valid samples yet, the SRTT isn't useful. Fixes: c410bf0 ("rxrpc: Fix the excessive initial retransmission timeout") Signed-off-by: David Howells <[email protected]>
1 parent 4700c4d commit 1d4adfa

File tree

4 files changed

+18
-8
lines changed

4 files changed

+18
-8
lines changed

fs/afs/fs_probe.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ void afs_fileserver_probe_result(struct afs_call *call)
161161
}
162162
}
163163

164-
rtt_us = rxrpc_kernel_get_srtt(call->net->socket, call->rxcall);
165-
if (rtt_us < server->probe.rtt) {
164+
if (rxrpc_kernel_get_srtt(call->net->socket, call->rxcall, &rtt_us) &&
165+
rtt_us < server->probe.rtt) {
166166
server->probe.rtt = rtt_us;
167167
server->rtt = rtt_us;
168168
alist->preferred = index;

fs/afs/vl_probe.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ void afs_vlserver_probe_result(struct afs_call *call)
9292
}
9393
}
9494

95-
rtt_us = rxrpc_kernel_get_srtt(call->net->socket, call->rxcall);
96-
if (rtt_us < server->probe.rtt) {
95+
if (rxrpc_kernel_get_srtt(call->net->socket, call->rxcall, &rtt_us) &&
96+
rtt_us < server->probe.rtt) {
9797
server->probe.rtt = rtt_us;
9898
alist->preferred = index;
9999
have_result = true;

include/net/af_rxrpc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ bool rxrpc_kernel_abort_call(struct socket *, struct rxrpc_call *,
5959
void rxrpc_kernel_end_call(struct socket *, struct rxrpc_call *);
6060
void rxrpc_kernel_get_peer(struct socket *, struct rxrpc_call *,
6161
struct sockaddr_rxrpc *);
62-
u32 rxrpc_kernel_get_srtt(struct socket *, struct rxrpc_call *);
62+
bool rxrpc_kernel_get_srtt(struct socket *, struct rxrpc_call *, u32 *);
6363
int rxrpc_kernel_charge_accept(struct socket *, rxrpc_notify_rx_t,
6464
rxrpc_user_attach_call_t, unsigned long, gfp_t,
6565
unsigned int);

net/rxrpc/peer_object.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -502,11 +502,21 @@ EXPORT_SYMBOL(rxrpc_kernel_get_peer);
502502
* rxrpc_kernel_get_srtt - Get a call's peer smoothed RTT
503503
* @sock: The socket on which the call is in progress.
504504
* @call: The call to query
505+
* @_srtt: Where to store the SRTT value.
505506
*
506-
* Get the call's peer smoothed RTT.
507+
* Get the call's peer smoothed RTT in uS.
507508
*/
508-
u32 rxrpc_kernel_get_srtt(struct socket *sock, struct rxrpc_call *call)
509+
bool rxrpc_kernel_get_srtt(struct socket *sock, struct rxrpc_call *call,
510+
u32 *_srtt)
509511
{
510-
return call->peer->srtt_us >> 3;
512+
struct rxrpc_peer *peer = call->peer;
513+
514+
if (peer->rtt_count == 0) {
515+
*_srtt = 1000000; /* 1S */
516+
return false;
517+
}
518+
519+
*_srtt = call->peer->srtt_us >> 3;
520+
return true;
511521
}
512522
EXPORT_SYMBOL(rxrpc_kernel_get_srtt);

0 commit comments

Comments
 (0)