浏览代码

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>
Ali Saidi 16 年之前
父节点
当前提交
53240c2087
共有 1 个文件被更改,包括 2 次插入1 次删除
  1. 2 1
      net/ipv4/tcp_input.c

+ 2 - 1
net/ipv4/tcp_input.c

@@ -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)