diff options
author | Jiri Kosina <jkosina@suse.cz> | 2012-07-27 14:38:50 +0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-07-28 00:45:51 +0400 |
commit | 59ea33a68a9083ac98515e4861c00e71efdc49a1 (patch) | |
tree | 709ce54c4ab4e140d8fa77ed63b3711445d9ac79 /net/sysctl_net.c | |
parent | 6081030769f23c83c0564e993be146db568bf68b (diff) | |
download | linux-59ea33a68a9083ac98515e4861c00e71efdc49a1.tar.xz |
tcp: perform DMA to userspace only if there is a task waiting for it
Back in 2006, commit 1a2449a87b ("[I/OAT]: TCP recv offload to I/OAT")
added support for receive offloading to IOAT dma engine if available.
The code in tcp_rcv_established() tries to perform early DMA copy if
applicable. It however does so without checking whether the userspace
task is actually expecting the data in the buffer.
This is not a problem under normal circumstances, but there is a corner
case where this doesn't work -- and that's when MSG_TRUNC flag to
recvmsg() is used.
If the IOAT dma engine is not used, the code properly checks whether
there is a valid ucopy.task and the socket is owned by userspace, but
misses the check in the dmaengine case.
This problem can be observed in real trivially -- for example 'tbench' is a
good reproducer, as it makes a heavy use of MSG_TRUNC. On systems utilizing
IOAT, you will soon find tbench waiting indefinitely in sk_wait_data(), as they
have been already early-copied in tcp_rcv_established() using dma engine.
This patch introduces the same check we are performing in the simple
iovec copy case to the IOAT case as well. It fixes the indefinite
recvmsg(MSG_TRUNC) hangs.
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sysctl_net.c')
0 files changed, 0 insertions, 0 deletions