]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commit
rxrpc: Fix lockup due to no error backoff after ack transmit error
authorDavid Howells <dhowells@redhat.com>
Thu, 1 Nov 2018 13:39:53 +0000 (13:39 +0000)
committerJuerg Haefliger <juergh@canonical.com>
Wed, 24 Jul 2019 02:00:03 +0000 (20:00 -0600)
commit1ebc9861b45b18069b66c98e1a974c5e1422b6fe
tree7de8e6c9158edf9d2d6c0a81eb7984cb7b8d99ee
parent5cef4d7cc4105583b9b12a96104804407fc9e908
rxrpc: Fix lockup due to no error backoff after ack transmit error

BugLink: https://bugs.launchpad.net/bugs/1836968
[ Upstream commit c7e86acfcee30794dc99a0759924bf7b9d43f1ca ]

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: 248f219cb8bc ("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>
Signed-off-by: Connor Kuehl <connor.kuehl@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
net/rxrpc/ar-internal.h
net/rxrpc/call_event.c
net/rxrpc/output.c