blob: 6676687b448899745ce455cc5ddb41189530a5ed [file] [log] [blame]
From 0517ebc4ea477401a756cc04193f6d97aa000792 Mon Sep 17 00:00:00 2001
From: David Howells <>
Date: Wed, 17 Jun 2020 15:46:33 +0100
Subject: [PATCH] rxrpc: Fix afs large storage transmission performance drop
commit 02c28dffb13abbaaedece1e4a6493b48ad3f913a upstream.
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 <>
Signed-off-by: Paul Gortmaker <>
diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c
index 40b9d6b1d297..97ddf2f72a56 100644
--- a/net/rxrpc/call_event.c
+++ b/net/rxrpc/call_event.c
@@ -253,7 +253,7 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j)
* confuse things
annotation &= ~RXRPC_TX_ANNO_MASK;
- annotation |= RXRPC_TX_ANNO_RESENT;
call->rxtx_annotations[ix] = annotation;
skb = call->rxtx_buffer[ix];