#endif
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -4558,7 +4558,8 @@ static void rps_trigger_softirq(void *da
- {
- struct softnet_data *sd = data;
-
-- ____napi_schedule(sd, &sd->backlog);
-+ if (!__test_and_set_bit(NAPI_STATE_SCHED, &sd->backlog.state))
-+ ____napi_schedule(sd, &sd->backlog);
- sd->received_rps++;
- }
-
-@@ -4574,7 +4575,7 @@ static int rps_ipi_queued(struct softnet
+@@ -4574,7 +4574,7 @@ static int rps_ipi_queued(struct softnet
#ifdef CONFIG_RPS
struct softnet_data *mysd = this_cpu_ptr(&softnet_data);
sd->rps_ipi_next = mysd->rps_ipi_list;
mysd->rps_ipi_list = sd;
-@@ -5755,6 +5756,8 @@ static DEFINE_PER_CPU(struct work_struct
+@@ -5755,6 +5755,8 @@ static DEFINE_PER_CPU(struct work_struct
/* Network device is going away, flush any packets still pending */
static void flush_backlog(struct work_struct *work)
{
struct sk_buff *skb, *tmp;
struct softnet_data *sd;
-@@ -5770,9 +5773,18 @@ static void flush_backlog(struct work_st
+@@ -5770,9 +5772,18 @@ static void flush_backlog(struct work_st
input_queue_head_incr(sd);
}
}
skb_queue_walk_safe(&sd->process_queue, skb, tmp) {
if (skb->dev->reg_state == NETREG_UNREGISTERING) {
__skb_unlink(skb, &sd->process_queue);
-@@ -5780,7 +5792,18 @@ static void flush_backlog(struct work_st
+@@ -5780,7 +5791,18 @@ static void flush_backlog(struct work_st
input_queue_head_incr(sd);
}
}
}
static bool flush_required(int cpu)
-@@ -6463,6 +6486,7 @@ static int process_backlog(struct napi_s
+@@ -6463,6 +6485,7 @@ static int process_backlog(struct napi_s
local_irq_disable();
rps_lock(sd);
if (skb_queue_empty(&sd->input_pkt_queue)) {
/*
* Inline a custom version of __napi_complete().
-@@ -6472,7 +6496,8 @@ static int process_backlog(struct napi_s
+@@ -6472,7 +6495,8 @@ static int process_backlog(struct napi_s
* We can use a plain write instead of clear_bit(),
* and we dont need an smp_mb() memory barrier.
*/
again = false;
} else {
skb_queue_splice_tail_init(&sd->input_pkt_queue,
-@@ -6889,6 +6914,57 @@ int dev_set_threaded(struct net_device *
+@@ -6889,6 +6913,57 @@ int dev_set_threaded(struct net_device *
}
EXPORT_SYMBOL(dev_set_threaded);
void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
int (*poll)(struct napi_struct *, int), int weight)
{
-@@ -11367,6 +11443,9 @@ static int dev_cpu_dead(unsigned int old
+@@ -11367,6 +11442,9 @@ static int dev_cpu_dead(unsigned int old
raise_softirq_irqoff(NET_TX_SOFTIRQ);
local_irq_enable();
#ifdef CONFIG_RPS
remsd = oldsd->rps_ipi_list;
oldsd->rps_ipi_list = NULL;
-@@ -11706,6 +11785,7 @@ static int __init net_dev_init(void)
+@@ -11706,6 +11784,7 @@ static int __init net_dev_init(void)
sd->cpu = i;
#endif