mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-15 04:42:02 +00:00
46 lines
1.8 KiB
Diff
46 lines
1.8 KiB
Diff
From f378724e10ced69c5e55db2e23ad350ede76f174 Mon Sep 17 00:00:00 2001
|
|
From: Alexis Bauvin <abauvin@scaleway.com>
|
|
Date: Tue, 23 Jul 2019 16:23:01 +0200
|
|
Subject: [PATCH 802/826] tun: mark small packets as owned by the tap sock
|
|
|
|
[ Upstream commit 4b663366246be1d1d4b1b8b01245b2e88ad9e706 ]
|
|
|
|
- v1 -> v2: Move skb_set_owner_w to __tun_build_skb to reduce patch size
|
|
|
|
Small packets going out of a tap device go through an optimized code
|
|
path that uses build_skb() rather than sock_alloc_send_pskb(). The
|
|
latter calls skb_set_owner_w(), but the small packet code path does not.
|
|
|
|
The net effect is that small packets are not owned by the userland
|
|
application's socket (e.g. QEMU), while large packets are.
|
|
This can be seen with a TCP session, where packets are not owned when
|
|
the window size is small enough (around PAGE_SIZE), while they are once
|
|
the window grows (note that this requires the host to support virtio
|
|
tso for the guest to offload segmentation).
|
|
All this leads to inconsistent behaviour in the kernel, especially on
|
|
netfilter modules that uses sk->socket (e.g. xt_owner).
|
|
|
|
Fixes: 66ccbc9c87c2 ("tap: use build_skb() for small packet")
|
|
Signed-off-by: Alexis Bauvin <abauvin@scaleway.com>
|
|
Acked-by: Jason Wang <jasowang@redhat.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/net/tun.c | 1 +
|
|
1 file changed, 1 insertion(+)
|
|
|
|
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
|
|
index b67fee56ec81..5fa7047ea361 100644
|
|
--- a/drivers/net/tun.c
|
|
+++ b/drivers/net/tun.c
|
|
@@ -1682,6 +1682,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
|
|
|
|
skb_reserve(skb, pad - delta);
|
|
skb_put(skb, len);
|
|
+ skb_set_owner_w(skb, tfile->socket.sk);
|
|
get_page(alloc_frag->page);
|
|
alloc_frag->offset += buflen;
|
|
|
|
--
|
|
2.22.0
|
|
|