aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 1e325adc4367..7f028d441e98 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -7075,10 +7075,20 @@ static int dev_cpu_callback(struct notifier_block *nfb,
7075 oldsd->output_queue = NULL; 7075 oldsd->output_queue = NULL;
7076 oldsd->output_queue_tailp = &oldsd->output_queue; 7076 oldsd->output_queue_tailp = &oldsd->output_queue;
7077 } 7077 }
7078 /* Append NAPI poll list from offline CPU. */ 7078 /* Append NAPI poll list from offline CPU, with one exception :
7079 if (!list_empty(&oldsd->poll_list)) { 7079 * process_backlog() must be called by cpu owning percpu backlog.
7080 list_splice_init(&oldsd->poll_list, &sd->poll_list); 7080 * We properly handle process_queue & input_pkt_queue later.
7081 raise_softirq_irqoff(NET_RX_SOFTIRQ); 7081 */
7082 while (!list_empty(&oldsd->poll_list)) {
7083 struct napi_struct *napi = list_first_entry(&oldsd->poll_list,
7084 struct napi_struct,
7085 poll_list);
7086
7087 list_del_init(&napi->poll_list);
7088 if (napi->poll == process_backlog)
7089 napi->state = 0;
7090 else
7091 ____napi_schedule(sd, napi);
7082 } 7092 }
7083 7093
7084 raise_softirq_irqoff(NET_TX_SOFTIRQ); 7094 raise_softirq_irqoff(NET_TX_SOFTIRQ);
@@ -7089,7 +7099,7 @@ static int dev_cpu_callback(struct notifier_block *nfb,
7089 netif_rx_internal(skb); 7099 netif_rx_internal(skb);
7090 input_queue_head_incr(oldsd); 7100 input_queue_head_incr(oldsd);
7091 } 7101 }
7092 while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { 7102 while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) {
7093 netif_rx_internal(skb); 7103 netif_rx_internal(skb);
7094 input_queue_head_incr(oldsd); 7104 input_queue_head_incr(oldsd);
7095 } 7105 }