Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rxrpc: Generate rtt_min

Generate rtt_min as this is required by RACK-TLP.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Link: https://patch.msgid.link/20241204074710.990092-27-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

David Howells and committed by
Jakub Kicinski
c637bd06 7903d443

+19 -4
+1
lib/win_minmax.c
··· 97 97 98 98 return minmax_subwin_update(m, win, &val); 99 99 } 100 + EXPORT_SYMBOL(minmax_running_min);
+2
net/rxrpc/ar-internal.h
··· 371 371 spinlock_t rtt_input_lock; /* RTT lock for input routine */ 372 372 ktime_t rtt_last_req; /* Time of last RTT request */ 373 373 unsigned int rtt_count; /* Number of samples we've got */ 374 + unsigned int rtt_taken; /* Number of samples taken (wrapping) */ 375 + struct minmax min_rtt; /* Estimated minimum RTT */ 374 376 375 377 u32 srtt_us; /* smoothed round trip time << 3 in usecs */ 376 378 u32 mdev_us; /* medium deviation */
+16 -4
net/rxrpc/rtt.c
··· 127 127 peer->rto_us = rxrpc_bound_rto(rto); 128 128 } 129 129 130 - static void rxrpc_ack_update_rtt(struct rxrpc_peer *peer, long rtt_us) 130 + static void rxrpc_update_rtt_min(struct rxrpc_peer *peer, ktime_t resp_time, long rtt_us) 131 + { 132 + /* Window size 5mins in approx usec (ipv4.sysctl_tcp_min_rtt_wlen) */ 133 + u32 wlen_us = 5ULL * NSEC_PER_SEC / 1024; 134 + 135 + minmax_running_min(&peer->min_rtt, wlen_us, resp_time / 1024, 136 + (u32)rtt_us ? : jiffies_to_usecs(1)); 137 + } 138 + 139 + static void rxrpc_ack_update_rtt(struct rxrpc_peer *peer, ktime_t resp_time, long rtt_us) 131 140 { 132 141 if (rtt_us < 0) 133 142 return; 134 143 135 - //rxrpc_update_rtt_min(peer, rtt_us); 144 + /* Update RACK min RTT [RFC8985 6.1 Step 1]. */ 145 + rxrpc_update_rtt_min(peer, resp_time, rtt_us); 146 + 136 147 rxrpc_rtt_estimator(peer, rtt_us); 137 148 rxrpc_set_rto(peer); 138 149 139 - /* RFC6298: only reset backoff on valid RTT measurement. */ 150 + /* Only reset backoff on valid RTT measurement [RFC6298]. */ 140 151 peer->backoff = 0; 141 152 } 142 153 ··· 168 157 return; 169 158 170 159 spin_lock(&peer->rtt_input_lock); 171 - rxrpc_ack_update_rtt(peer, rtt_us); 160 + rxrpc_ack_update_rtt(peer, resp_time, rtt_us); 172 161 if (peer->rtt_count < 3) 173 162 peer->rtt_count++; 163 + peer->rtt_taken++; 174 164 spin_unlock(&peer->rtt_input_lock); 175 165 176 166 trace_rxrpc_rtt_rx(call, why, rtt_slot, send_serial, resp_serial,