Patch "net: better skb->sender_cpu and skb->napi_id cohabitation" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
net: better skb->sender_cpu and skb->napi_id cohabitation
to the 4.4-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:
net-better-skb-sender_cpu-and-skb-napi_id-cohabitation.patch
and it can be found in the queue-4.4 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
52bd2d62ce6758d811edcbd2256eb9ea7f6a56cbMon Sep 17 00:00:00 2001
From: Eric Dumazet <[email protected]>
Date: Wed, 18 Nov 2015 06:30:50 -0800
Subject: net: better skb->sender_cpu and skb->napi_id cohabitation
From: Eric Dumazet <[email protected]>
commit 52bd2d62ce6758d811edcbd2256eb9ea7f6a56cb upstream.
skb->sender_cpu and skb->napi_id share a common storage, and we had various bugs about this.
We had to call skb_sender_cpu_clear() in some places to not leave a prior skb->napi_id and fool netdev_pick_tx()
As suggested by Alexei, we could split the space so that these errors can not happen.
0 value being reserved as the common (not initialized) value, let's reserve [1 .. NR_CPUS] range for valid sender_cpu, and [NR_CPUS+1 .. ~0U] for valid napi_id.
This will allow proper busy polling support over tunnels.
--- include/linux/skbuff.h | 3 --- net/core/dev.c | 33 ++++++++++++++++----------------- 2 files changed, 16 insertions(+), 20 deletions(-)
include/linux/skbuff.h +0 -3
@@ -1084,9 +1084,6 @@ static inline void skb_copy_hash(structstatic inline void skb_sender_cpu_clear (struct sk_buff *skb) { -#ifdef CONFIG_XPS - skb->sender_cpu =0 ; -#endif }#ifdef NET_SKBUFF_DATA_USES_OFFSET
net/core/dev.c +16 -17
@@ -182,7 +182,7 @@ EXPORT_SYMBOL(dev_base_lock);/* protects napi_hash addition/deletion and napi_gen_id */ static DEFINE_SPINLOCK (napi_hash_lock); -static unsigned int napi_gen_id; +static unsigned int napi_gen_id =NR_CPUS ; static DEFINE_HASHTABLE(napi_hash, 8);static seqcount_t devnet_rename_seq;
@@ -3049,7 +3049,9 @@ struct netdev_queue *netdev_pick_tx(struint queue_index =0 ;#ifdef CONFIG_XPS -if (skb->sender_cpu ==0 ) +u32 sender_cpu = skb->sender_cpu -1 ; + +if (sender_cpu >= (u32 )NR_CPUS ) skb->sender_cpu =raw_smp_processor_id () +1 ;#endif
@@ -4726,25 +4728,22 @@ EXPORT_SYMBOL_GPL(napi_by_id);void napi_hash_add (struct napi_struct *napi) { -if (!test_and_set_bit (NAPI_STATE_HASHED , &napi->state)) { +if (test_and_set_bit (NAPI_STATE_HASHED , &napi->state)) +return ; -spin_lock (&napi_hash_lock); +spin_lock (&napi_hash_lock); -/* 0 is not a valid id, we also skip an id that is taken -* we expect both events to be extremely rare -*/ - napi->napi_id =0 ; -while (!napi->napi_id) { - napi->napi_id = ++napi_gen_id; -if (napi_by_id (napi->napi_id)) - napi->napi_id =0 ; - } +/* 0..NR_CPUS+1 range is reserved for sender_cpu use */ +do { +if (unlikely (++napi_gen_id <NR_CPUS +1 )) + napi_gen_id =NR_CPUS +1 ; + }while (napi_by_id (napi_gen_id)); + napi->napi_id = napi_gen_id; -hlist_add_head_rcu (&napi->napi_hash_node, - &napi_hash[napi->napi_id %HASH_SIZE (napi_hash)]); +hlist_add_head_rcu (&napi->napi_hash_node, + &napi_hash[napi->napi_id %HASH_SIZE (napi_hash)]); -spin_unlock (&napi_hash_lock); - } +spin_unlock (&napi_hash_lock); }EXPORT_SYMBOL_GPL (napi_hash_add);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/tcp-disallow-cwnd-undo-when-switching-congestion-control.patch queue-4.4/net-better-skb-sender_cpu-and-skb-napi_id-cohabitation.patch queue-4.4/net-ping-do-not-abuse-udp_poll.patch