]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rxrpc: Generate rtt_min
authorDavid Howells <dhowells@redhat.com>
Wed, 4 Dec 2024 07:46:54 +0000 (07:46 +0000)
committerJakub Kicinski <kuba@kernel.org>
Mon, 9 Dec 2024 21:48:29 +0000 (13:48 -0800)
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>
lib/win_minmax.c
net/rxrpc/ar-internal.h
net/rxrpc/rtt.c

index ec10506834b6291ad189381c7cbf544ebe5fc4ec..1682e614309c724ce0321cde5bd6c6bea629ac55 100644 (file)
@@ -97,3 +97,4 @@ u32 minmax_running_min(struct minmax *m, u32 win, u32 t, u32 meas)
 
        return minmax_subwin_update(m, win, &val);
 }
+EXPORT_SYMBOL(minmax_running_min);
index 297be421639cc3f6f3ae229ae8fd9bf7b74c18f2..d0d0ab45390959a67a6f4757fe35e46b6e4f0e1d 100644 (file)
@@ -371,6 +371,8 @@ struct rxrpc_peer {
        spinlock_t              rtt_input_lock; /* RTT lock for input routine */
        ktime_t                 rtt_last_req;   /* Time of last RTT request */
        unsigned int            rtt_count;      /* Number of samples we've got */
+       unsigned int            rtt_taken;      /* Number of samples taken (wrapping) */
+       struct minmax           min_rtt;        /* Estimated minimum RTT */
 
        u32                     srtt_us;        /* smoothed round trip time << 3 in usecs */
        u32                     mdev_us;        /* medium deviation                     */
index 6dc51486b5a60c805701c6be7f79ef7c25482b8c..8048467f4bee83c59051005f3496f71c29a2f525 100644 (file)
@@ -127,16 +127,27 @@ static void rxrpc_set_rto(struct rxrpc_peer *peer)
        peer->rto_us = rxrpc_bound_rto(rto);
 }
 
-static void rxrpc_ack_update_rtt(struct rxrpc_peer *peer, long rtt_us)
+static void rxrpc_update_rtt_min(struct rxrpc_peer *peer, ktime_t resp_time, long rtt_us)
+{
+       /* Window size 5mins in approx usec (ipv4.sysctl_tcp_min_rtt_wlen) */
+       u32 wlen_us = 5ULL * NSEC_PER_SEC / 1024;
+
+       minmax_running_min(&peer->min_rtt, wlen_us, resp_time / 1024,
+                          (u32)rtt_us ? : jiffies_to_usecs(1));
+}
+
+static void rxrpc_ack_update_rtt(struct rxrpc_peer *peer, ktime_t resp_time, long rtt_us)
 {
        if (rtt_us < 0)
                return;
 
-       //rxrpc_update_rtt_min(peer, rtt_us);
+       /* Update RACK min RTT [RFC8985 6.1 Step 1]. */
+       rxrpc_update_rtt_min(peer, resp_time, rtt_us);
+
        rxrpc_rtt_estimator(peer, rtt_us);
        rxrpc_set_rto(peer);
 
-       /* RFC6298: only reset backoff on valid RTT measurement. */
+       /* Only reset backoff on valid RTT measurement [RFC6298]. */
        peer->backoff = 0;
 }
 
@@ -157,9 +168,10 @@ void rxrpc_peer_add_rtt(struct rxrpc_call *call, enum rxrpc_rtt_rx_trace why,
                return;
 
        spin_lock(&peer->rtt_input_lock);
-       rxrpc_ack_update_rtt(peer, rtt_us);
+       rxrpc_ack_update_rtt(peer, resp_time, rtt_us);
        if (peer->rtt_count < 3)
                peer->rtt_count++;
+       peer->rtt_taken++;
        spin_unlock(&peer->rtt_input_lock);
 
        trace_rxrpc_rtt_rx(call, why, rtt_slot, send_serial, resp_serial,