5007 static int dev_cpu_callback(struct notifier_block *nfb,
5008                             unsigned long action,
5009                             void *ocpu)
5010 {
5011         struct sk_buff **list_skb;
5012         struct Qdisc **list_net;
5013         struct sk_buff *skb;
5014         unsigned int cpu, oldcpu = (unsigned long)ocpu;
5015         struct softnet_data *sd, *oldsd;
5016
5017         if (action != CPU_DEAD && action != CPU_DEAD_FROZEN)
5018                 return NOTIFY_OK;
5019
5020         local_irq_disable();
5021         cpu = smp_processor_id();
5022         sd = &per_cpu(softnet_data, cpu);
5023         oldsd = &per_cpu(softnet_data, oldcpu);
5024
5025         /* Find end of our completion_queue. */
5026         list_skb = &sd->completion_queue;
5027         while (*list_skb)
5028                 list_skb = &(*list_skb)->next;
5029         /* Append completion queue from offline CPU. */
5030         *list_skb = oldsd->completion_queue;
5031         oldsd->completion_queue = NULL;
5032
5033         /* Find end of our output_queue. */
5034         list_net = &sd->output_queue;
5035         while (*list_net)
5036                 list_net = &(*list_net)->next_sched;
5037         /* Append output queue from offline CPU. */
5038         *list_net = oldsd->output_queue;
5039         oldsd->output_queue = NULL;
5040
5041         raise_softirq_irqoff(NET_TX_SOFTIRQ);
5042         local_irq_enable();
5043
5044         /* Process offline CPU's input_pkt_queue */
5045         while ((skb = __skb_dequeue(&oldsd->input_pkt_queue)))
5046                 netif_rx(skb);
5047

5048         return NOTIFY_OK;
5049 }

Reply via email to