diff --git a/net/core/dev.c b/net/core/dev.c index 2e616d68a7aa..395830206d73 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3262,6 +3262,8 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, local_irq_save(flags); rps_lock(sd); + if (!netif_running(skb->dev)) + goto drop; qlen = skb_queue_len(&sd->input_pkt_queue); if (qlen <= netdev_max_backlog && !skb_flow_limit(skb, qlen)) { if (skb_queue_len(&sd->input_pkt_queue)) { @@ -3283,6 +3285,7 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, goto enqueue; } +drop: sd->dropped++; rps_unlock(sd); @@ -5788,6 +5791,7 @@ static void rollback_registered_many(struct list_head *head) unlist_netdevice(dev); dev->reg_state = NETREG_UNREGISTERING; + on_each_cpu(flush_backlog, dev, 1); } synchronize_net(); @@ -6408,8 +6412,6 @@ void netdev_run_todo(void) dev->reg_state = NETREG_UNREGISTERED; - on_each_cpu(flush_backlog, dev, 1); - netdev_wait_allrefs(dev); /* paranoia */