tcp: Fix possible double-ack w/ user dma
From: Ali Saidi <saidi@engin.umich.edu> When TCP receive copy offload is enabled it's possible that tcp_rcv_established() will cause two acks to be sent for a single packet. In the case that a tcp_dma_early_copy() is successful, copied_early is set to true which causes tcp_cleanup_rbuf() to be called early which can send an ack. Further along in tcp_rcv_established(), __tcp_ack_snd_check() is called and will schedule a delayed ACK. If no packets are processed before the delayed ack timer expires the packet will be acked twice. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b6c40d68ff
commit
53240c2087
|
@ -4879,7 +4879,8 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
|
||||||
goto no_ack;
|
goto no_ack;
|
||||||
}
|
}
|
||||||
|
|
||||||
__tcp_ack_snd_check(sk, 0);
|
if (!copied_early || tp->rcv_nxt != tp->rcv_wup)
|
||||||
|
__tcp_ack_snd_check(sk, 0);
|
||||||
no_ack:
|
no_ack:
|
||||||
#ifdef CONFIG_NET_DMA
|
#ifdef CONFIG_NET_DMA
|
||||||
if (copied_early)
|
if (copied_early)
|
||||||
|
|
Loading…
Reference in New Issue