rxrpc: Fix decision on when to generate an IDLE ACK
[ Upstream commit 9a3dedcf18096e8f7f22b8777d78c4acfdea1651 ]
Fix the decision on when to generate an IDLE ACK by keeping a count of the
number of packets we've received, but not yet soft-ACK'd, and the number of
packets we've processed, but not yet hard-ACK'd, rather than trying to keep
track of which DATA sequence numbers correspond to those points.
We then generate an ACK when either counter exceeds 2. The counters are
both cleared when we transcribe the information into any sort of ACK packet
for transmission. IDLE and DELAY ACKs are skipped if both counters are 0
(ie. no change).
Fixes: 805b21b929
("rxrpc: Send an ACK after every few DATA packets we receive")
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
3eef677a25
commit
4790963ef4
@@ -412,8 +412,8 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb)
|
||||
{
|
||||
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
||||
enum rxrpc_call_state state;
|
||||
unsigned int j, nr_subpackets;
|
||||
rxrpc_serial_t serial = sp->hdr.serial, ack_serial = 0;
|
||||
unsigned int j, nr_subpackets, nr_unacked = 0;
|
||||
rxrpc_serial_t serial = sp->hdr.serial, ack_serial = serial;
|
||||
rxrpc_seq_t seq0 = sp->hdr.seq, hard_ack;
|
||||
bool immediate_ack = false, jumbo_bad = false;
|
||||
u8 ack = 0;
|
||||
@@ -569,6 +569,8 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb)
|
||||
sp = NULL;
|
||||
}
|
||||
|
||||
nr_unacked++;
|
||||
|
||||
if (last) {
|
||||
set_bit(RXRPC_CALL_RX_LAST, &call->flags);
|
||||
if (!ack) {
|
||||
@@ -588,9 +590,14 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb)
|
||||
}
|
||||
call->rx_expect_next = seq + 1;
|
||||
}
|
||||
if (!ack)
|
||||
ack_serial = serial;
|
||||
}
|
||||
|
||||
ack:
|
||||
if (atomic_add_return(nr_unacked, &call->ackr_nr_unacked) > 2 && !ack)
|
||||
ack = RXRPC_ACK_IDLE;
|
||||
|
||||
if (ack)
|
||||
rxrpc_propose_ACK(call, ack, ack_serial,
|
||||
immediate_ack, true,
|
||||
|
Reference in New Issue
Block a user