Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rxrpc: Fix afs large storage transmission performance drop

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>

+1 -1
+1 -1
net/rxrpc/call_event.c
··· 253 253 * confuse things 254 254 */ 255 255 annotation &= ~RXRPC_TX_ANNO_MASK; 256 - annotation |= RXRPC_TX_ANNO_RESENT; 256 + annotation |= RXRPC_TX_ANNO_UNACK | RXRPC_TX_ANNO_RESENT; 257 257 call->rxtx_annotations[ix] = annotation; 258 258 259 259 skb = call->rxtx_buffer[ix];