Patch "tuntap: disable preemption during XDP processing" has been added to the 4.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
tuntap: disable preemption during XDP processing
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
tuntap-disable-preemption-during-xdp-processing.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Tue Mar 6 19:02:12 PST 2018
From: Jason Wang <[email protected]>
Date: Sat, 24 Feb 2018 11:32:25 +0800
Subject: tuntap: disable preemption during XDP processing
From: Jason Wang <[email protected]>
[ Upstream commit 23e43f07f896f8578318cfcc9466f1e8b8ab21b6 ]
Except for tuntap, all other drivers' XDP was implemented at NAPI poll() routine in a bh. This guarantees all XDP operation were done at the same CPU which is required by e.g BFP_MAP_TYPE_PERCPU_ARRAY. But for tuntap, we do it in process context and we try to protect XDP processing by RCU reader lock. This is insufficient since CONFIG_PREEMPT_RCU can preempt the RCU reader critical section which breaks the assumption that all XDP were processed in the same CPU.
Fixing this by simply disabling preemption during XDP processing.
--- drivers/net/tun.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/tun.c +6 -0
@@ -1315,6 +1315,7 @@ static struct sk_buff *tun_build_skb(strelse *skb_xdp =0 ; +preempt_disable ();rcu_read_lock (); xdp_prog =rcu_dereference (tun->xdp_prog);if (xdp_prog && !*skb_xdp) {
@@ -1337,6 +1338,7 @@ static struct sk_buff *tun_build_skb(strif (err) goto err_redirect;rcu_read_unlock (); +preempt_enable ();return NULL ;case XDP_TX : xdp_xmit = true;
@@ -1358,6 +1360,7 @@ static struct sk_buff *tun_build_skb(str skb =build_skb (buf, buflen);if (!skb) {rcu_read_unlock (); +preempt_enable ();return ERR_PTR (-ENOMEM ); }
@@ -1370,10 +1373,12 @@ static struct sk_buff *tun_build_skb(str skb->dev = tun->dev;generic_xdp_tx (skb, xdp_prog);rcu_read_unlock (); +preempt_enable ();return NULL ; }rcu_read_unlock (); +preempt_enable ();return skb;
@@ -1381,6 +1386,7 @@ err_redirect:put_page (alloc_frag->page); err_xdp:rcu_read_unlock (); +preempt_enable ();this_cpu_inc (tun->pcpu_stats->rx_dropped);return NULL ; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/tuntap-correctly-add-the-missing-xdp-flush.patch queue-4.14/virtio-net-disable-napi-only-when-enabled-during-xdp-set.patch queue-4.14/tuntap-disable-preemption-during-xdp-processing.patch