rxrpc: Fix RACK-TLP implementation
Fix the RACK-TLP implementation in the following ways:
(1) Move the "in/exiting Fast or RTO recovery" flags to the rxrpc_call
struct rather than rxrpc_ack_summary so that they persist beyond ACK
parsing to the next time rxrpc_congestion_management() happens (when
the next ACK is parsed). This allows those values to be accessed by
RACK-TLP when invoked by the Reorder timer expiring.
(2) In rxrpc_input_call_event(), rearm the RTO timer before the function
returns if no other timer is running and if DATA packets have been
sent but not yet ACK'd. This prevents us not having a timer set to
drive retransmission.
(3) In rxrpc_congestion_management(), initialise the TLP state when
entering the FAST_RETRANSMIT congestion control state, not every time
we process that state - otherwise TLP doesn't happen in that state.
(4) Don't reset segment_xmit_ts in rxrpc_rack_mark_lost() as that's called
from two places, one of which shouldn't do that. Instead, do it in
rxrpc_rack_detect_loss().
(5) In rxrpc_tlp_calc_pto(), check flight_size is at most one jumbo
packet's worth of subpackets in size, not just any non-zero value
(RFC8985 7.2 has a comparison against 1, so this is approximated
because we'll be sending jumbo packets if possible).
(6) In rxrpc_prepare_data_packet(), only increment call->tx_nr_resent if
the DATA packet being retransmitted was not previously transmitted
otherwise tx_nr_resent will keep getting bigger and cause RACK-TLP to
malfunction (the value is used in the in-flight calculation).
tx_nr_resent is decremented when a packet that has been retransmitted
is discarded - but only by 1 per packet.
Fixes: 7c482665931b ("rxrpc: Implement RACK/TLP to deal with transmission stalls [RFC8985]")
Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Marc Dionne <marc.dionne@auristor.com>
Tested-by: Marc Dionne <marc.dionne@auristor.com>
Reviewed-by: Jeffrey Altman <jaltman@auristor.com>
cc: Eric Dumazet <edumazet@google.com>
cc: "David S. Miller" <davem@davemloft.net>
cc: Jakub Kicinski <kuba@kernel.org>
cc: Paolo Abeni <pabeni@redhat.com>
cc: Simon Horman <horms@kernel.org>
cc: linux-afs@lists.infradead.org
cc: stable@vger.kernel.org
5 files changed