]> www.infradead.org Git - users/jedix/linux-maple.git/commit
tcp: flush DMA queue before sk_wait_data if rcv_wnd is zero
authorMichal Kubeček <mkubecek@suse.cz>
Fri, 14 Sep 2012 04:59:52 +0000 (04:59 +0000)
committerGuangyu Sun <guangyu.sun@oracle.com>
Wed, 17 Oct 2012 18:24:24 +0000 (11:24 -0700)
commitfcdcb3a0c92a02b7a4cbff7e834e513e97bb5146
tree9bb431f95f8b20f14b74cf1343640ff75f2bf792
parenta941c5abdbe812d4365be053f28d536867ce9c0d
tcp: flush DMA queue before sk_wait_data if rcv_wnd is zero

[ Upstream commit 15c041759bfcd9ab0a4e43f1c16e2644977d0467 ]

If recv() syscall is called for a TCP socket so that
  - IOAT DMA is used
  - MSG_WAITALL flag is used
  - requested length is bigger than sk_rcvbuf
  - enough data has already arrived to bring rcv_wnd to zero
then when tcp_recvmsg() gets to calling sk_wait_data(), receive
window can be still zero while sk_async_wait_queue exhausts
enough space to keep it zero. As this queue isn't cleaned until
the tcp_service_net_dma() call, sk_wait_data() cannot receive
any data and blocks forever.

If zero receive window and non-empty sk_async_wait_queue is
detected before calling sk_wait_data(), process the queue first.

Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Guangyu Sun <guangyu.sun@oracle.com>
net/ipv4/tcp.c