rxrpc: Fix afs large storage transmission performance drop
authorDavid Howells <dhowells@redhat.com>
Wed, 17 Jun 2020 14:46:33 +0000 (15:46 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jul 2020 07:39:32 +0000 (09:39 +0200)
commit0c7b840d4a76b922dba5fee5c6f3d454128f9357
tree99f35a1b6620bea03cc7f35e463321791c671c9d
parent2ff4e67e6a57cedf016da52c317aac4289b82b68
rxrpc: Fix afs large storage transmission performance drop

[ Upstream commit 02c28dffb13abbaaedece1e4a6493b48ad3f913a ]

Commit 2ad6691d988c, which moved the modification of the status annotation
for a packet in the Tx buffer prior to the retransmission moved the state
clearance, but managed to lose the bit that set it to UNACK.

Consequently, if a retransmission occurs, the packet is accidentally
changed to the ACK state (ie. 0) by masking it off, which means that the
packet isn't counted towards the tally of newly-ACK'd packets if it gets
hard-ACK'd.  This then prevents the congestion control algorithm from
recovering properly.

Fix by reinstating the change of state to UNACK.

Spotted by the generic/460 xfstest.

Fixes: 2ad6691d988c ("rxrpc: Fix race between incoming ACK parser and retransmitter")
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/rxrpc/call_event.c