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

rxrpc: Don't use received skbuff timestamps



Don't use received skbuff timestamps, but rather set a timestamp when an
ack is processed so that the time taken to get to rxrpc_input_ack() is
included in the RTT.

The timestamp of the latest ACK received is tracked in
call->acks_latest_ts.

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-26-dhowells@redhat.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent dcdff0d8
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -1037,14 +1037,6 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb)
	rxrpc_inc_stat(call->rxnet, stat_rx_acks[summary.ack_reason]);
	prefetch(call->tx_queue);

	if (summary.acked_serial != 0) {
		if (summary.ack_reason == RXRPC_ACK_PING_RESPONSE)
			rxrpc_complete_rtt_probe(call, skb->tstamp, summary.acked_serial,
						 ack_serial, rxrpc_rtt_rx_ping_response);
		else
			summary.rtt_sample_avail = true;
	}

	/* If we get an EXCEEDS_WINDOW ACK from the server, it probably
	 * indicates that the client address changed due to NAT.  The server
	 * lost the call because it switched to a different peer.
@@ -1087,7 +1079,7 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb)
	if (nr_acks > 0)
		skb_condense(skb);

	call->acks_latest_ts = skb->tstamp;
	call->acks_latest_ts = ktime_get_real();
	call->acks_hard_ack = hard_ack;
	call->acks_prev_seq = prev_pkt;

@@ -1108,6 +1100,15 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb)
	if (hard_ack + 1 == 0)
		return rxrpc_proto_abort(call, 0, rxrpc_eproto_ackr_zero);

	if (summary.acked_serial != 0) {
		if (summary.ack_reason == RXRPC_ACK_PING_RESPONSE)
			rxrpc_complete_rtt_probe(call, call->acks_latest_ts,
						 summary.acked_serial, ack_serial,
						 rxrpc_rtt_rx_ping_response);
		else
			summary.rtt_sample_avail = true;
	}

	/* Ignore ACKs unless we are or have just been transmitting. */
	switch (__rxrpc_call_state(call)) {
	case RXRPC_CALL_CLIENT_SEND_REQUEST:
+0 −3
Original line number Diff line number Diff line
@@ -215,9 +215,6 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)

		/* we want to set the don't fragment bit */
		rxrpc_local_dont_fragment(local, true);

		/* We want receive timestamps. */
		sock_enable_timestamps(usk);
		break;

	default: