mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-03 08:14:12 +00:00
rxrpc: Fix lockup due to no error backoff after ack transmit error
[ Upstream commitc7e86acfce] If the network becomes (partially) unavailable, say by disabling IPv6, the background ACK transmission routine can get itself into a tizzy by proposing immediate ACK retransmission. Since we're in the call event processor, that happens immediately without returning to the workqueue manager. The condition should clear after a while when either the network comes back or the call times out. Fix this by: (1) When re-proposing an ACK on failed Tx, don't schedule it immediately. This will allow a certain amount of time to elapse before we try again. (2) Enforce a return to the workqueue manager after a certain number of iterations of the call processing loop. (3) Add a backoff delay that increases the delay on deferred ACKs by a jiffy per failed transmission to a limit of HZ. The backoff delay is cleared on a successful return from kernel_sendmsg(). (4) Cancel calls immediately if the opening sendmsg fails. The layer above can arrange retransmission or rotate to another server. Fixes:248f219cb8("rxrpc: Rewrite the data and ack handling code") Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
75f7571635
commit
36b0575076
@@ -611,6 +611,7 @@ struct rxrpc_call {
|
||||
* not hard-ACK'd packet follows this.
|
||||
*/
|
||||
rxrpc_seq_t tx_top; /* Highest Tx slot allocated. */
|
||||
u16 tx_backoff; /* Delay to insert due to Tx failure */
|
||||
|
||||
/* TCP-style slow-start congestion control [RFC5681]. Since the SMSS
|
||||
* is fixed, we keep these numbers in terms of segments (ie. DATA
|
||||
|
||||
Reference in New Issue
Block a user