1 /*
2 * linux/kernel/softirq.c
3 *
4 * Copyright (C) 1992 Linus Torvalds
5 *
6 * Distribute under GPLv2.
7 *
8 * Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903)
9 *
10 * Remote softirq infrastructure is by Jens Axboe.
11 */
12
13 #include <linux/module.h>
14 #include <linux/kernel_stat.h>
15 #include <linux/interrupt.h>
16 #include <linux/init.h>
17 #include <linux/mm.h>
18 #include <linux/notifier.h>
19 #include <linux/percpu.h>
20 #include <linux/cpu.h>
21 #include <linux/freezer.h>
22 #include <linux/kthread.h>
23 #include <linux/rcupdate.h>
24 #include <linux/smp.h>
25 #include <linux/tick.h>
26
27 #include <asm/irq.h>
28 /*
29 - No shared variables, all the data are CPU local.
30 - If a softirq needs serialization, let it serialize itself
31 by its own spinlocks.
32 - Even if softirq is serialized, only local cpu is marked for
33 execution. Hence, we get something sort of weak cpu binding.
34 Though it is still not clear, will it result in better locality
35 or will not.
36
37 Examples:
38 - NET RX softirq. It is multithreaded and does not require
39 any global serialization.
40 - NET TX softirq. It kicks software netdevice queues, hence
41 it is logically serialized per device, but this serialization
42 is invisible to common code.
43 - Tasklets: serialized wrt itself.
44 */
45
46 #ifndef __ARCH_IRQ_STAT
47 irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned;
48 EXPORT_SYMBOL(irq_stat);
49 #endif
50
51 static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;
52
53 static DEFINE_PER_CPU(struct task_struct *, ksoftirqd);
54
55 /*
56 * we cannot loop indefinitely here to avoid userspace starvation,
57 * but we also don't want to introduce a worst case 1/HZ latency
58 * to the pending events, so lets the scheduler to balance
59 * the softirq load for us.
60 */
wakeup_softirqd(void)61 static inline void wakeup_softirqd(void)
62 {
63 /* Interrupts are disabled: no need to stop preemption */
64 struct task_struct *tsk = __get_cpu_var(ksoftirqd);
65
66 if (tsk && tsk->state != TASK_RUNNING)
67 wake_up_process(tsk);
68 }
69
70 /*
71 * This one is for softirq.c-internal use,
72 * where hardirqs are disabled legitimately:
73 */
74 #ifdef CONFIG_TRACE_IRQFLAGS
__local_bh_disable(unsigned long ip)75 static void __local_bh_disable(unsigned long ip)
76 {
77 unsigned long flags;
78
79 WARN_ON_ONCE(in_irq());
80
81 raw_local_irq_save(flags);
82 add_preempt_count(SOFTIRQ_OFFSET);
83 /*
84 * Were softirqs turned off above:
85 */
86 if (softirq_count() == SOFTIRQ_OFFSET)
87 trace_softirqs_off(ip);
88 raw_local_irq_restore(flags);
89 }
90 #else /* !CONFIG_TRACE_IRQFLAGS */
__local_bh_disable(unsigned long ip)91 static inline void __local_bh_disable(unsigned long ip)
92 {
93 add_preempt_count(SOFTIRQ_OFFSET);
94 barrier();
95 }
96 #endif /* CONFIG_TRACE_IRQFLAGS */
97
local_bh_disable(void)98 void local_bh_disable(void)
99 {
100 __local_bh_disable((unsigned long)__builtin_return_address(0));
101 }
102
103 EXPORT_SYMBOL(local_bh_disable);
104
105 /*
106 * Special-case - softirqs can safely be enabled in
107 * cond_resched_softirq(), or by __do_softirq(),
108 * without processing still-pending softirqs:
109 */
_local_bh_enable(void)110 void _local_bh_enable(void)
111 {
112 WARN_ON_ONCE(in_irq());
113 WARN_ON_ONCE(!irqs_disabled());
114
115 if (softirq_count() == SOFTIRQ_OFFSET)
116 trace_softirqs_on((unsigned long)__builtin_return_address(0));
117 sub_preempt_count(SOFTIRQ_OFFSET);
118 }
119
120 EXPORT_SYMBOL(_local_bh_enable);
121
_local_bh_enable_ip(unsigned long ip)122 static inline void _local_bh_enable_ip(unsigned long ip)
123 {
124 WARN_ON_ONCE(in_irq() || irqs_disabled());
125 #ifdef CONFIG_TRACE_IRQFLAGS
126 local_irq_disable();
127 #endif
128 /*
129 * Are softirqs going to be turned on now:
130 */
131 if (softirq_count() == SOFTIRQ_OFFSET)
132 trace_softirqs_on(ip);
133 /*
134 * Keep preemption disabled until we are done with
135 * softirq processing:
136 */
137 sub_preempt_count(SOFTIRQ_OFFSET - 1);
138
139 if (unlikely(!in_interrupt() && local_softirq_pending()))
140 do_softirq();
141
142 dec_preempt_count();
143 #ifdef CONFIG_TRACE_IRQFLAGS
144 local_irq_enable();
145 #endif
146 preempt_check_resched();
147 }
148
local_bh_enable(void)149 void local_bh_enable(void)
150 {
151 _local_bh_enable_ip((unsigned long)__builtin_return_address(0));
152 }
153 EXPORT_SYMBOL(local_bh_enable);
154
local_bh_enable_ip(unsigned long ip)155 void local_bh_enable_ip(unsigned long ip)
156 {
157 _local_bh_enable_ip(ip);
158 }
159 EXPORT_SYMBOL(local_bh_enable_ip);
160
161 /*
162 * We restart softirq processing MAX_SOFTIRQ_RESTART times,
163 * and we fall back to softirqd after that.
164 *
165 * This number has been established via experimentation.
166 * The two things to balance is latency against fairness -
167 * we want to handle softirqs as soon as possible, but they
168 * should not be able to lock up the box.
169 */
170 #define MAX_SOFTIRQ_RESTART 10
171
__do_softirq(void)172 asmlinkage void __do_softirq(void)
173 {
174 struct softirq_action *h;
175 __u32 pending;
176 int max_restart = MAX_SOFTIRQ_RESTART;
177 int cpu;
178
179 pending = local_softirq_pending();
180 account_system_vtime(current);
181
182 __local_bh_disable((unsigned long)__builtin_return_address(0));
183 trace_softirq_enter();
184
185 cpu = smp_processor_id();
186 restart:
187 /* Reset the pending bitmask before enabling irqs */
188 set_softirq_pending(0);
189
190 local_irq_enable();
191
192 h = softirq_vec;
193
194 do {
195 if (pending & 1) {
196 int prev_count = preempt_count();
197
198 h->action(h);
199
200 if (unlikely(prev_count != preempt_count())) {
201 printk(KERN_ERR "huh, entered softirq %td %p"
202 "with preempt_count %08x,"
203 " exited with %08x?\n", h - softirq_vec,
204 h->action, prev_count, preempt_count());
205 preempt_count() = prev_count;
206 }
207
208 rcu_bh_qsctr_inc(cpu);
209 }
210 h++;
211 pending >>= 1;
212 } while (pending);
213
214 local_irq_disable();
215
216 pending = local_softirq_pending();
217 if (pending && --max_restart)
218 goto restart;
219
220 if (pending)
221 wakeup_softirqd();
222
223 trace_softirq_exit();
224
225 account_system_vtime(current);
226 _local_bh_enable();
227 }
228
229 #ifndef __ARCH_HAS_DO_SOFTIRQ
230
do_softirq(void)231 asmlinkage void do_softirq(void)
232 {
233 __u32 pending;
234 unsigned long flags;
235
236 if (in_interrupt())
237 return;
238
239 local_irq_save(flags);
240
241 pending = local_softirq_pending();
242
243 if (pending)
244 __do_softirq();
245
246 local_irq_restore(flags);
247 }
248
249 #endif
250
251 /*
252 * Enter an interrupt context.
253 */
irq_enter(void)254 void irq_enter(void)
255 {
256 int cpu = smp_processor_id();
257
258 rcu_irq_enter();
259 if (idle_cpu(cpu) && !in_interrupt()) {
260 __irq_enter();
261 tick_check_idle(cpu);
262 } else
263 __irq_enter();
264 }
265
266 #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED
267 # define invoke_softirq() __do_softirq()
268 #else
269 # define invoke_softirq() do_softirq()
270 #endif
271
272 /*
273 * Exit an interrupt context. Process softirqs if needed and possible:
274 */
irq_exit(void)275 void irq_exit(void)
276 {
277 account_system_vtime(current);
278 trace_hardirq_exit();
279 sub_preempt_count(IRQ_EXIT_OFFSET);
280 if (!in_interrupt() && local_softirq_pending())
281 invoke_softirq();
282
283 #ifdef CONFIG_NO_HZ
284 /* Make sure that timer wheel updates are propagated */
285 rcu_irq_exit();
286 if (idle_cpu(smp_processor_id()) && !in_interrupt() && !need_resched())
287 tick_nohz_stop_sched_tick(0);
288 #endif
289 preempt_enable_no_resched();
290 }
291
292 /*
293 * This function must run with irqs disabled!
294 */
raise_softirq_irqoff(unsigned int nr)295 inline void raise_softirq_irqoff(unsigned int nr)
296 {
297 __raise_softirq_irqoff(nr);
298
299 /*
300 * If we're in an interrupt or softirq, we're done
301 * (this also catches softirq-disabled code). We will
302 * actually run the softirq once we return from
303 * the irq or softirq.
304 *
305 * Otherwise we wake up ksoftirqd to make sure we
306 * schedule the softirq soon.
307 */
308 if (!in_interrupt())
309 wakeup_softirqd();
310 }
311
raise_softirq(unsigned int nr)312 void raise_softirq(unsigned int nr)
313 {
314 unsigned long flags;
315
316 local_irq_save(flags);
317 raise_softirq_irqoff(nr);
318 local_irq_restore(flags);
319 }
320
open_softirq(int nr,void (* action)(struct softirq_action *))321 void open_softirq(int nr, void (*action)(struct softirq_action *))
322 {
323 softirq_vec[nr].action = action;
324 }
325
326 /* Tasklets */
327 struct tasklet_head
328 {
329 struct tasklet_struct *head;
330 struct tasklet_struct **tail;
331 };
332
333 static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
334 static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec);
335
__tasklet_schedule(struct tasklet_struct * t)336 void __tasklet_schedule(struct tasklet_struct *t)
337 {
338 unsigned long flags;
339
340 local_irq_save(flags);
341 t->next = NULL;
342 *__get_cpu_var(tasklet_vec).tail = t;
343 __get_cpu_var(tasklet_vec).tail = &(t->next);
344 raise_softirq_irqoff(TASKLET_SOFTIRQ);
345 local_irq_restore(flags);
346 }
347
348 EXPORT_SYMBOL(__tasklet_schedule);
349
__tasklet_hi_schedule(struct tasklet_struct * t)350 void __tasklet_hi_schedule(struct tasklet_struct *t)
351 {
352 unsigned long flags;
353
354 local_irq_save(flags);
355 t->next = NULL;
356 *__get_cpu_var(tasklet_hi_vec).tail = t;
357 __get_cpu_var(tasklet_hi_vec).tail = &(t->next);
358 raise_softirq_irqoff(HI_SOFTIRQ);
359 local_irq_restore(flags);
360 }
361
362 EXPORT_SYMBOL(__tasklet_hi_schedule);
363
tasklet_action(struct softirq_action * a)364 static void tasklet_action(struct softirq_action *a)
365 {
366 struct tasklet_struct *list;
367
368 local_irq_disable();
369 list = __get_cpu_var(tasklet_vec).head;
370 __get_cpu_var(tasklet_vec).head = NULL;
371 __get_cpu_var(tasklet_vec).tail = &__get_cpu_var(tasklet_vec).head;
372 local_irq_enable();
373
374 while (list) {
375 struct tasklet_struct *t = list;
376
377 list = list->next;
378
379 if (tasklet_trylock(t)) {
380 if (!atomic_read(&t->count)) {
381 if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
382 BUG();
383 t->func(t->data);
384 tasklet_unlock(t);
385 continue;
386 }
387 tasklet_unlock(t);
388 }
389
390 local_irq_disable();
391 t->next = NULL;
392 *__get_cpu_var(tasklet_vec).tail = t;
393 __get_cpu_var(tasklet_vec).tail = &(t->next);
394 __raise_softirq_irqoff(TASKLET_SOFTIRQ);
395 local_irq_enable();
396 }
397 }
398
tasklet_hi_action(struct softirq_action * a)399 static void tasklet_hi_action(struct softirq_action *a)
400 {
401 struct tasklet_struct *list;
402
403 local_irq_disable();
404 list = __get_cpu_var(tasklet_hi_vec).head;
405 __get_cpu_var(tasklet_hi_vec).head = NULL;
406 __get_cpu_var(tasklet_hi_vec).tail = &__get_cpu_var(tasklet_hi_vec).head;
407 local_irq_enable();
408
409 while (list) {
410 struct tasklet_struct *t = list;
411
412 list = list->next;
413
414 if (tasklet_trylock(t)) {
415 if (!atomic_read(&t->count)) {
416 if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
417 BUG();
418 t->func(t->data);
419 tasklet_unlock(t);
420 continue;
421 }
422 tasklet_unlock(t);
423 }
424
425 local_irq_disable();
426 t->next = NULL;
427 *__get_cpu_var(tasklet_hi_vec).tail = t;
428 __get_cpu_var(tasklet_hi_vec).tail = &(t->next);
429 __raise_softirq_irqoff(HI_SOFTIRQ);
430 local_irq_enable();
431 }
432 }
433
434
tasklet_init(struct tasklet_struct * t,void (* func)(unsigned long),unsigned long data)435 void tasklet_init(struct tasklet_struct *t,
436 void (*func)(unsigned long), unsigned long data)
437 {
438 t->next = NULL;
439 t->state = 0;
440 atomic_set(&t->count, 0);
441 t->func = func;
442 t->data = data;
443 }
444
445 EXPORT_SYMBOL(tasklet_init);
446
tasklet_kill(struct tasklet_struct * t)447 void tasklet_kill(struct tasklet_struct *t)
448 {
449 if (in_interrupt())
450 printk("Attempt to kill tasklet from interrupt\n");
451
452 while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
453 do
454 yield();
455 while (test_bit(TASKLET_STATE_SCHED, &t->state));
456 }
457 tasklet_unlock_wait(t);
458 clear_bit(TASKLET_STATE_SCHED, &t->state);
459 }
460
461 EXPORT_SYMBOL(tasklet_kill);
462
463 DEFINE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
464 EXPORT_PER_CPU_SYMBOL(softirq_work_list);
465
__local_trigger(struct call_single_data * cp,int softirq)466 static void __local_trigger(struct call_single_data *cp, int softirq)
467 {
468 struct list_head *head = &__get_cpu_var(softirq_work_list[softirq]);
469
470 list_add_tail(&cp->list, head);
471
472 /* Trigger the softirq only if the list was previously empty. */
473 if (head->next == &cp->list)
474 raise_softirq_irqoff(softirq);
475 }
476
477 #ifdef CONFIG_USE_GENERIC_SMP_HELPERS
remote_softirq_receive(void * data)478 static void remote_softirq_receive(void *data)
479 {
480 struct call_single_data *cp = data;
481 unsigned long flags;
482 int softirq;
483
484 softirq = cp->priv;
485
486 local_irq_save(flags);
487 __local_trigger(cp, softirq);
488 local_irq_restore(flags);
489 }
490
__try_remote_softirq(struct call_single_data * cp,int cpu,int softirq)491 static int __try_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
492 {
493 if (cpu_online(cpu)) {
494 cp->func = remote_softirq_receive;
495 cp->info = cp;
496 cp->flags = 0;
497 cp->priv = softirq;
498
499 __smp_call_function_single(cpu, cp);
500 return 0;
501 }
502 return 1;
503 }
504 #else /* CONFIG_USE_GENERIC_SMP_HELPERS */
__try_remote_softirq(struct call_single_data * cp,int cpu,int softirq)505 static int __try_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
506 {
507 return 1;
508 }
509 #endif
510
511 /**
512 * __send_remote_softirq - try to schedule softirq work on a remote cpu
513 * @cp: private SMP call function data area
514 * @cpu: the remote cpu
515 * @this_cpu: the currently executing cpu
516 * @softirq: the softirq for the work
517 *
518 * Attempt to schedule softirq work on a remote cpu. If this cannot be
519 * done, the work is instead queued up on the local cpu.
520 *
521 * Interrupts must be disabled.
522 */
__send_remote_softirq(struct call_single_data * cp,int cpu,int this_cpu,int softirq)523 void __send_remote_softirq(struct call_single_data *cp, int cpu, int this_cpu, int softirq)
524 {
525 if (cpu == this_cpu || __try_remote_softirq(cp, cpu, softirq))
526 __local_trigger(cp, softirq);
527 }
528 EXPORT_SYMBOL(__send_remote_softirq);
529
530 /**
531 * send_remote_softirq - try to schedule softirq work on a remote cpu
532 * @cp: private SMP call function data area
533 * @cpu: the remote cpu
534 * @softirq: the softirq for the work
535 *
536 * Like __send_remote_softirq except that disabling interrupts and
537 * computing the current cpu is done for the caller.
538 */
send_remote_softirq(struct call_single_data * cp,int cpu,int softirq)539 void send_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
540 {
541 unsigned long flags;
542 int this_cpu;
543
544 local_irq_save(flags);
545 this_cpu = smp_processor_id();
546 __send_remote_softirq(cp, cpu, this_cpu, softirq);
547 local_irq_restore(flags);
548 }
549 EXPORT_SYMBOL(send_remote_softirq);
550
remote_softirq_cpu_notify(struct notifier_block * self,unsigned long action,void * hcpu)551 static int __cpuinit remote_softirq_cpu_notify(struct notifier_block *self,
552 unsigned long action, void *hcpu)
553 {
554 /*
555 * If a CPU goes away, splice its entries to the current CPU
556 * and trigger a run of the softirq
557 */
558 if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
559 int cpu = (unsigned long) hcpu;
560 int i;
561
562 local_irq_disable();
563 for (i = 0; i < NR_SOFTIRQS; i++) {
564 struct list_head *head = &per_cpu(softirq_work_list[i], cpu);
565 struct list_head *local_head;
566
567 if (list_empty(head))
568 continue;
569
570 local_head = &__get_cpu_var(softirq_work_list[i]);
571 list_splice_init(head, local_head);
572 raise_softirq_irqoff(i);
573 }
574 local_irq_enable();
575 }
576
577 return NOTIFY_OK;
578 }
579
580 static struct notifier_block __cpuinitdata remote_softirq_cpu_notifier = {
581 .notifier_call = remote_softirq_cpu_notify,
582 };
583
softirq_init(void)584 void __init softirq_init(void)
585 {
586 int cpu;
587
588 for_each_possible_cpu(cpu) {
589 int i;
590
591 per_cpu(tasklet_vec, cpu).tail =
592 &per_cpu(tasklet_vec, cpu).head;
593 per_cpu(tasklet_hi_vec, cpu).tail =
594 &per_cpu(tasklet_hi_vec, cpu).head;
595 for (i = 0; i < NR_SOFTIRQS; i++)
596 INIT_LIST_HEAD(&per_cpu(softirq_work_list[i], cpu));
597 }
598
599 register_hotcpu_notifier(&remote_softirq_cpu_notifier);
600
601 open_softirq(TASKLET_SOFTIRQ, tasklet_action);
602 open_softirq(HI_SOFTIRQ, tasklet_hi_action);
603 }
604
ksoftirqd(void * __bind_cpu)605 static int ksoftirqd(void * __bind_cpu)
606 {
607 set_current_state(TASK_INTERRUPTIBLE);
608
609 while (!kthread_should_stop()) {
610 preempt_disable();
611 if (!local_softirq_pending()) {
612 preempt_enable_no_resched();
613 schedule();
614 preempt_disable();
615 }
616
617 __set_current_state(TASK_RUNNING);
618
619 while (local_softirq_pending()) {
620 /* Preempt disable stops cpu going offline.
621 If already offline, we'll be on wrong CPU:
622 don't process */
623 if (cpu_is_offline((long)__bind_cpu))
624 goto wait_to_die;
625 do_softirq();
626 preempt_enable_no_resched();
627 cond_resched();
628 preempt_disable();
629 rcu_qsctr_inc((long)__bind_cpu);
630 }
631 preempt_enable();
632 set_current_state(TASK_INTERRUPTIBLE);
633 }
634 __set_current_state(TASK_RUNNING);
635 return 0;
636
637 wait_to_die:
638 preempt_enable();
639 /* Wait for kthread_stop */
640 set_current_state(TASK_INTERRUPTIBLE);
641 while (!kthread_should_stop()) {
642 schedule();
643 set_current_state(TASK_INTERRUPTIBLE);
644 }
645 __set_current_state(TASK_RUNNING);
646 return 0;
647 }
648
649 #ifdef CONFIG_HOTPLUG_CPU
650 /*
651 * tasklet_kill_immediate is called to remove a tasklet which can already be
652 * scheduled for execution on @cpu.
653 *
654 * Unlike tasklet_kill, this function removes the tasklet
655 * _immediately_, even if the tasklet is in TASKLET_STATE_SCHED state.
656 *
657 * When this function is called, @cpu must be in the CPU_DEAD state.
658 */
tasklet_kill_immediate(struct tasklet_struct * t,unsigned int cpu)659 void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu)
660 {
661 struct tasklet_struct **i;
662
663 BUG_ON(cpu_online(cpu));
664 BUG_ON(test_bit(TASKLET_STATE_RUN, &t->state));
665
666 if (!test_bit(TASKLET_STATE_SCHED, &t->state))
667 return;
668
669 /* CPU is dead, so no lock needed. */
670 for (i = &per_cpu(tasklet_vec, cpu).head; *i; i = &(*i)->next) {
671 if (*i == t) {
672 *i = t->next;
673 /* If this was the tail element, move the tail ptr */
674 if (*i == NULL)
675 per_cpu(tasklet_vec, cpu).tail = i;
676 return;
677 }
678 }
679 BUG();
680 }
681
takeover_tasklets(unsigned int cpu)682 static void takeover_tasklets(unsigned int cpu)
683 {
684 /* CPU is dead, so no lock needed. */
685 local_irq_disable();
686
687 /* Find end, append list for that CPU. */
688 if (&per_cpu(tasklet_vec, cpu).head != per_cpu(tasklet_vec, cpu).tail) {
689 *(__get_cpu_var(tasklet_vec).tail) = per_cpu(tasklet_vec, cpu).head;
690 __get_cpu_var(tasklet_vec).tail = per_cpu(tasklet_vec, cpu).tail;
691 per_cpu(tasklet_vec, cpu).head = NULL;
692 per_cpu(tasklet_vec, cpu).tail = &per_cpu(tasklet_vec, cpu).head;
693 }
694 raise_softirq_irqoff(TASKLET_SOFTIRQ);
695
696 if (&per_cpu(tasklet_hi_vec, cpu).head != per_cpu(tasklet_hi_vec, cpu).tail) {
697 *__get_cpu_var(tasklet_hi_vec).tail = per_cpu(tasklet_hi_vec, cpu).head;
698 __get_cpu_var(tasklet_hi_vec).tail = per_cpu(tasklet_hi_vec, cpu).tail;
699 per_cpu(tasklet_hi_vec, cpu).head = NULL;
700 per_cpu(tasklet_hi_vec, cpu).tail = &per_cpu(tasklet_hi_vec, cpu).head;
701 }
702 raise_softirq_irqoff(HI_SOFTIRQ);
703
704 local_irq_enable();
705 }
706 #endif /* CONFIG_HOTPLUG_CPU */
707
cpu_callback(struct notifier_block * nfb,unsigned long action,void * hcpu)708 static int __cpuinit cpu_callback(struct notifier_block *nfb,
709 unsigned long action,
710 void *hcpu)
711 {
712 int hotcpu = (unsigned long)hcpu;
713 struct task_struct *p;
714
715 switch (action) {
716 case CPU_UP_PREPARE:
717 case CPU_UP_PREPARE_FROZEN:
718 p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
719 if (IS_ERR(p)) {
720 printk("ksoftirqd for %i failed\n", hotcpu);
721 return NOTIFY_BAD;
722 }
723 kthread_bind(p, hotcpu);
724 per_cpu(ksoftirqd, hotcpu) = p;
725 break;
726 case CPU_ONLINE:
727 case CPU_ONLINE_FROZEN:
728 wake_up_process(per_cpu(ksoftirqd, hotcpu));
729 break;
730 #ifdef CONFIG_HOTPLUG_CPU
731 case CPU_UP_CANCELED:
732 case CPU_UP_CANCELED_FROZEN:
733 if (!per_cpu(ksoftirqd, hotcpu))
734 break;
735 /* Unbind so it can run. Fall thru. */
736 kthread_bind(per_cpu(ksoftirqd, hotcpu),
737 cpumask_any(cpu_online_mask));
738 case CPU_DEAD:
739 case CPU_DEAD_FROZEN: {
740 struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
741
742 p = per_cpu(ksoftirqd, hotcpu);
743 per_cpu(ksoftirqd, hotcpu) = NULL;
744 sched_setscheduler_nocheck(p, SCHED_FIFO, ¶m);
745 kthread_stop(p);
746 takeover_tasklets(hotcpu);
747 break;
748 }
749 #endif /* CONFIG_HOTPLUG_CPU */
750 }
751 return NOTIFY_OK;
752 }
753
754 static struct notifier_block __cpuinitdata cpu_nfb = {
755 .notifier_call = cpu_callback
756 };
757
spawn_ksoftirqd(void)758 static __init int spawn_ksoftirqd(void)
759 {
760 void *cpu = (void *)(long)smp_processor_id();
761 int err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);
762
763 BUG_ON(err == NOTIFY_BAD);
764 cpu_callback(&cpu_nfb, CPU_ONLINE, cpu);
765 register_cpu_notifier(&cpu_nfb);
766 return 0;
767 }
768 early_initcall(spawn_ksoftirqd);
769
770 #ifdef CONFIG_SMP
771 /*
772 * Call a function on all processors
773 */
on_each_cpu(void (* func)(void * info),void * info,int wait)774 int on_each_cpu(void (*func) (void *info), void *info, int wait)
775 {
776 int ret = 0;
777
778 preempt_disable();
779 ret = smp_call_function(func, info, wait);
780 local_irq_disable();
781 func(info);
782 local_irq_enable();
783 preempt_enable();
784 return ret;
785 }
786 EXPORT_SYMBOL(on_each_cpu);
787 #endif
788
789 /*
790 * [ These __weak aliases are kept in a separate compilation unit, so that
791 * GCC does not inline them incorrectly. ]
792 */
793
early_irq_init(void)794 int __init __weak early_irq_init(void)
795 {
796 return 0;
797 }
798
arch_early_irq_init(void)799 int __init __weak arch_early_irq_init(void)
800 {
801 return 0;
802 }
803
arch_init_chip_data(struct irq_desc * desc,int cpu)804 int __weak arch_init_chip_data(struct irq_desc *desc, int cpu)
805 {
806 return 0;
807 }
808