diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/skbuff.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 1d10bb4adec1..5b3559cb1d82 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -6512,18 +6512,15 @@ nodefer: __kfree_skb(skb); if (READ_ONCE(sd->defer_count) >= defer_max) goto nodefer; - /* We do not send an IPI or any signal. - * Remote cpu will eventually call skb_defer_free_flush() - */ spin_lock_irqsave(&sd->defer_lock, flags); - skb->next = sd->defer_list; - /* Paired with READ_ONCE() in skb_defer_free_flush() */ - WRITE_ONCE(sd->defer_list, skb); - sd->defer_count++; - /* Send an IPI every time queue reaches half capacity. */ kick = sd->defer_count == (defer_max >> 1); + /* Paired with the READ_ONCE() few lines above */ + WRITE_ONCE(sd->defer_count, sd->defer_count + 1); + skb->next = sd->defer_list; + /* Paired with READ_ONCE() in skb_defer_free_flush() */ + WRITE_ONCE(sd->defer_list, skb); spin_unlock_irqrestore(&sd->defer_lock, flags); /* Make sure to trigger NET_RX_SOFTIRQ on the remote CPU |