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 } |