rxrpc: Fix congestion control algorithm
[ Upstream commit ba4e103848d3a2a28a0445e39f4a9564187efe54 ] Make the following fixes to the congestion control algorithm: (1) Don't vary the cwnd starting value by the size of RXRPC_TX_SMSS since that's currently held constant - set to the size of a jumbo subpacket payload so that we can create jumbo packets on the fly. The current code invariably picks 3 as the starting value. Further, the starting cwnd needs to be an even number because we ack every other packet, so set it to 4. (2) Don't cut ssthresh when we see an ACK come from the peer with a receive window (rwind) less than ssthresh. ssthresh keeps track of characteristics of the connection whereas rwind may be reduced by the peer for any reason - and may be reduced to 0. Fixes:1fc4fa2ac9
("rxrpc: Fix congestion management") Fixes:0851115090
("rxrpc: Reduce ssthresh to peer's receive window") Signed-off-by: David Howells <dhowells@redhat.com> Suggested-by: Simon Wilkinson <sxw@auristor.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: linux-afs@lists.infradead.org Reviewed-by: Jeffrey Altman <jaltman@auristor.com <mailto:jaltman@auristor.com>> Link: https://lore.kernel.org/r/20240503150749.1001323-2-dhowells@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
59881e57a7
commit
fa6dbe25e2
|
@ -688,7 +688,7 @@ struct rxrpc_call {
|
||||||
* packets) rather than bytes.
|
* packets) rather than bytes.
|
||||||
*/
|
*/
|
||||||
#define RXRPC_TX_SMSS RXRPC_JUMBO_DATALEN
|
#define RXRPC_TX_SMSS RXRPC_JUMBO_DATALEN
|
||||||
#define RXRPC_MIN_CWND (RXRPC_TX_SMSS > 2190 ? 2 : RXRPC_TX_SMSS > 1095 ? 3 : 4)
|
#define RXRPC_MIN_CWND 4
|
||||||
u8 cong_cwnd; /* Congestion window size */
|
u8 cong_cwnd; /* Congestion window size */
|
||||||
u8 cong_extra; /* Extra to send for congestion management */
|
u8 cong_extra; /* Extra to send for congestion management */
|
||||||
u8 cong_ssthresh; /* Slow-start threshold */
|
u8 cong_ssthresh; /* Slow-start threshold */
|
||||||
|
|
|
@ -175,12 +175,7 @@ struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *rx, gfp_t gfp,
|
||||||
call->rx_winsize = rxrpc_rx_window_size;
|
call->rx_winsize = rxrpc_rx_window_size;
|
||||||
call->tx_winsize = 16;
|
call->tx_winsize = 16;
|
||||||
|
|
||||||
if (RXRPC_TX_SMSS > 2190)
|
call->cong_cwnd = RXRPC_MIN_CWND;
|
||||||
call->cong_cwnd = 2;
|
|
||||||
else if (RXRPC_TX_SMSS > 1095)
|
|
||||||
call->cong_cwnd = 3;
|
|
||||||
else
|
|
||||||
call->cong_cwnd = 4;
|
|
||||||
call->cong_ssthresh = RXRPC_TX_MAX_WINDOW;
|
call->cong_ssthresh = RXRPC_TX_MAX_WINDOW;
|
||||||
|
|
||||||
call->rxnet = rxnet;
|
call->rxnet = rxnet;
|
||||||
|
|
|
@ -688,9 +688,6 @@ static void rxrpc_input_ack_trailer(struct rxrpc_call *call, struct sk_buff *skb
|
||||||
call->tx_winsize = rwind;
|
call->tx_winsize = rwind;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (call->cong_ssthresh > rwind)
|
|
||||||
call->cong_ssthresh = rwind;
|
|
||||||
|
|
||||||
mtu = min(ntohl(trailer->maxMTU), ntohl(trailer->ifMTU));
|
mtu = min(ntohl(trailer->maxMTU), ntohl(trailer->ifMTU));
|
||||||
|
|
||||||
peer = call->peer;
|
peer = call->peer;
|
||||||
|
|
Loading…
Reference in New Issue