Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2019-05-17 06:38:43 +0200
committerJiri Slaby <jslaby@suse.cz>2019-05-17 06:38:51 +0200
commitfe43b681f65a72d1635bfe88ee5e8af49c971bd3 (patch)
treed5097412c73afbfd5cd0e17e7b59e5d54f7aa3da
parentf5be590f7ea275fcc97119e37b5ef1e597c027c1 (diff)
tuntap: synchronize through tfiles array instead of
tun->numqueues (bnc#1012628).
-rw-r--r--patches.kernel.org/5.1.3-030-tuntap-synchronize-through-tfiles-array-instead.patch77
-rw-r--r--series.conf1
2 files changed, 78 insertions, 0 deletions
diff --git a/patches.kernel.org/5.1.3-030-tuntap-synchronize-through-tfiles-array-instead.patch b/patches.kernel.org/5.1.3-030-tuntap-synchronize-through-tfiles-array-instead.patch
new file mode 100644
index 0000000000..8299910bdf
--- /dev/null
+++ b/patches.kernel.org/5.1.3-030-tuntap-synchronize-through-tfiles-array-instead.patch
@@ -0,0 +1,77 @@
+From: Jason Wang <jasowang@redhat.com>
+Date: Wed, 8 May 2019 23:20:18 -0400
+Subject: [PATCH] tuntap: synchronize through tfiles array instead of
+ tun->numqueues
+References: bnc#1012628
+Patch-mainline: 5.1.3
+Git-commit: 9871a9e47a2646fe30ae7fd2e67668a8d30912f6
+
+[ Upstream commit 9871a9e47a2646fe30ae7fd2e67668a8d30912f6 ]
+
+When a queue(tfile) is detached through __tun_detach(), we move the
+last enabled tfile to the position where detached one sit but don't
+NULL out last position. We expect to synchronize the datapath through
+tun->numqueues. Unfortunately, this won't work since we're lacking
+sufficient mechanism to order or synchronize the access to
+tun->numqueues.
+
+To fix this, NULL out the last position during detaching and check
+RCU protected tfile against NULL instead of checking tun->numqueues in
+datapath.
+
+Cc: YueHaibing <yuehaibing@huawei.com>
+Cc: Cong Wang <xiyou.wangcong@gmail.com>
+Cc: weiyongjun (A) <weiyongjun1@huawei.com>
+Cc: Eric Dumazet <eric.dumazet@gmail.com>
+Fixes: c8d68e6be1c3b ("tuntap: multiqueue support")
+Signed-off-by: Jason Wang <jasowang@redhat.com>
+Reviewed-by: Wei Yongjun <weiyongjun1@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Jiri Slaby <jslaby@suse.cz>
+---
+ drivers/net/tun.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index dc62fc3c5a95..f4c933ac6edf 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -705,6 +705,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
+ tun->tfiles[tun->numqueues - 1]);
+ ntfile = rtnl_dereference(tun->tfiles[index]);
+ ntfile->queue_index = index;
++ rcu_assign_pointer(tun->tfiles[tun->numqueues - 1],
++ NULL);
+
+ --tun->numqueues;
+ if (clean) {
+@@ -1087,7 +1089,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
+ tfile = rcu_dereference(tun->tfiles[txq]);
+
+ /* Drop packet if interface is not attached */
+- if (txq >= tun->numqueues)
++ if (!tfile)
+ goto drop;
+
+ if (!rcu_dereference(tun->steering_prog))
+@@ -1310,6 +1312,7 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
+
+ rcu_read_lock();
+
++resample:
+ numqueues = READ_ONCE(tun->numqueues);
+ if (!numqueues) {
+ rcu_read_unlock();
+@@ -1318,6 +1321,8 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
+
+ tfile = rcu_dereference(tun->tfiles[smp_processor_id() %
+ numqueues]);
++ if (unlikely(!tfile))
++ goto resample;
+
+ spin_lock(&tfile->tx_ring.producer_lock);
+ for (i = 0; i < n; i++) {
+--
+2.21.0
+
diff --git a/series.conf b/series.conf
index af7f32761c..872e8678e7 100644
--- a/series.conf
+++ b/series.conf
@@ -115,6 +115,7 @@
patches.kernel.org/5.1.3-027-vlan-disable-SIOCSHWTSTAMP-in-container.patch
patches.kernel.org/5.1.3-028-vrf-sit-mtu-should-not-be-updated-when-vrf-netd.patch
patches.kernel.org/5.1.3-029-tuntap-fix-dividing-by-zero-in-ebpf-queue-selec.patch
+ patches.kernel.org/5.1.3-030-tuntap-synchronize-through-tfiles-array-instead.patch
########################################################
# Build fixes that apply to the vanilla kernel too.