Commit c637bd06 authored by David Howells's avatar David Howells Committed by Jakub Kicinski
Browse files

rxrpc: Generate rtt_min



Generate rtt_min as this is required by RACK-TLP.

Signed-off-by: default avatarDavid 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: default avatarJakub Kicinski <kuba@kernel.org>
parent 7903d443
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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			*/
+16 −4
Original line number Diff line number Diff line
@@ -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,