kernel/kexec.c: use vscnprintf() instead of vsnprintf() in vmcoreinfo_append_str()
[linux-2.6-block.git] / kernel / softirq.c
CommitLineData
1da177e4
LT
1/*
2 * linux/kernel/softirq.c
3 *
4 * Copyright (C) 1992 Linus Torvalds
5 *
b10db7f0
PM
6 * Distribute under GPLv2.
7 *
8 * Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903)
1da177e4
LT
9 */
10
9984de1a 11#include <linux/export.h>
1da177e4
LT
12#include <linux/kernel_stat.h>
13#include <linux/interrupt.h>
14#include <linux/init.h>
15#include <linux/mm.h>
16#include <linux/notifier.h>
17#include <linux/percpu.h>
18#include <linux/cpu.h>
83144186 19#include <linux/freezer.h>
1da177e4
LT
20#include <linux/kthread.h>
21#include <linux/rcupdate.h>
7e49fcce 22#include <linux/ftrace.h>
78eef01b 23#include <linux/smp.h>
3e339b5d 24#include <linux/smpboot.h>
79bf2bb3 25#include <linux/tick.h>
a0e39ed3
HC
26
27#define CREATE_TRACE_POINTS
ad8d75ff 28#include <trace/events/irq.h>
1da177e4 29
1da177e4
LT
30/*
31 - No shared variables, all the data are CPU local.
32 - If a softirq needs serialization, let it serialize itself
33 by its own spinlocks.
34 - Even if softirq is serialized, only local cpu is marked for
35 execution. Hence, we get something sort of weak cpu binding.
36 Though it is still not clear, will it result in better locality
37 or will not.
38
39 Examples:
40 - NET RX softirq. It is multithreaded and does not require
41 any global serialization.
42 - NET TX softirq. It kicks software netdevice queues, hence
43 it is logically serialized per device, but this serialization
44 is invisible to common code.
45 - Tasklets: serialized wrt itself.
46 */
47
48#ifndef __ARCH_IRQ_STAT
49irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned;
50EXPORT_SYMBOL(irq_stat);
51#endif
52
978b0116 53static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;
1da177e4 54
4dd53d89 55DEFINE_PER_CPU(struct task_struct *, ksoftirqd);
1da177e4 56
5d592b44 57char *softirq_to_name[NR_SOFTIRQS] = {
5dd4de58 58 "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "BLOCK_IOPOLL",
09223371 59 "TASKLET", "SCHED", "HRTIMER", "RCU"
5d592b44
JB
60};
61
1da177e4
LT
62/*
63 * we cannot loop indefinitely here to avoid userspace starvation,
64 * but we also don't want to introduce a worst case 1/HZ latency
65 * to the pending events, so lets the scheduler to balance
66 * the softirq load for us.
67 */
676cb02d 68static void wakeup_softirqd(void)
1da177e4
LT
69{
70 /* Interrupts are disabled: no need to stop preemption */
909ea964 71 struct task_struct *tsk = __this_cpu_read(ksoftirqd);
1da177e4
LT
72
73 if (tsk && tsk->state != TASK_RUNNING)
74 wake_up_process(tsk);
75}
76
75e1056f
VP
77/*
78 * preempt_count and SOFTIRQ_OFFSET usage:
79 * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving
80 * softirq processing.
81 * - preempt_count is changed by SOFTIRQ_DISABLE_OFFSET (= 2 * SOFTIRQ_OFFSET)
82 * on local_bh_disable or local_bh_enable.
83 * This lets us distinguish between whether we are currently processing
84 * softirq and whether we just have bh disabled.
85 */
86
de30a2b3
IM
87/*
88 * This one is for softirq.c-internal use,
89 * where hardirqs are disabled legitimately:
90 */
3c829c36 91#ifdef CONFIG_TRACE_IRQFLAGS
0bd3a173 92void __local_bh_disable_ip(unsigned long ip, unsigned int cnt)
de30a2b3
IM
93{
94 unsigned long flags;
95
96 WARN_ON_ONCE(in_irq());
97
98 raw_local_irq_save(flags);
7e49fcce 99 /*
bdb43806 100 * The preempt tracer hooks into preempt_count_add and will break
7e49fcce
SR
101 * lockdep because it calls back into lockdep after SOFTIRQ_OFFSET
102 * is set and before current->softirq_enabled is cleared.
103 * We must manually increment preempt_count here and manually
104 * call the trace_preempt_off later.
105 */
bdb43806 106 __preempt_count_add(cnt);
de30a2b3
IM
107 /*
108 * Were softirqs turned off above:
109 */
9ea4c380 110 if (softirq_count() == (cnt & SOFTIRQ_MASK))
de30a2b3
IM
111 trace_softirqs_off(ip);
112 raw_local_irq_restore(flags);
7e49fcce 113
75e1056f 114 if (preempt_count() == cnt)
7e49fcce 115 trace_preempt_off(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1));
de30a2b3 116}
0bd3a173 117EXPORT_SYMBOL(__local_bh_disable_ip);
3c829c36 118#endif /* CONFIG_TRACE_IRQFLAGS */
de30a2b3 119
75e1056f
VP
120static void __local_bh_enable(unsigned int cnt)
121{
75e1056f
VP
122 WARN_ON_ONCE(!irqs_disabled());
123
9ea4c380 124 if (softirq_count() == (cnt & SOFTIRQ_MASK))
d2e08473 125 trace_softirqs_on(_RET_IP_);
bdb43806 126 preempt_count_sub(cnt);
75e1056f
VP
127}
128
de30a2b3
IM
129/*
130 * Special-case - softirqs can safely be enabled in
131 * cond_resched_softirq(), or by __do_softirq(),
132 * without processing still-pending softirqs:
133 */
134void _local_bh_enable(void)
135{
5d60d3e7 136 WARN_ON_ONCE(in_irq());
75e1056f 137 __local_bh_enable(SOFTIRQ_DISABLE_OFFSET);
de30a2b3
IM
138}
139
140EXPORT_SYMBOL(_local_bh_enable);
141
0bd3a173 142void __local_bh_enable_ip(unsigned long ip, unsigned int cnt)
de30a2b3 143{
0f476b6d 144 WARN_ON_ONCE(in_irq() || irqs_disabled());
3c829c36 145#ifdef CONFIG_TRACE_IRQFLAGS
0f476b6d 146 local_irq_disable();
3c829c36 147#endif
de30a2b3
IM
148 /*
149 * Are softirqs going to be turned on now:
150 */
75e1056f 151 if (softirq_count() == SOFTIRQ_DISABLE_OFFSET)
0f476b6d 152 trace_softirqs_on(ip);
de30a2b3
IM
153 /*
154 * Keep preemption disabled until we are done with
155 * softirq processing:
156 */
0bd3a173 157 preempt_count_sub(cnt - 1);
de30a2b3 158
0bed698a
FW
159 if (unlikely(!in_interrupt() && local_softirq_pending())) {
160 /*
161 * Run softirq if any pending. And do it in its own stack
162 * as we may be calling this deep in a task call stack already.
163 */
de30a2b3 164 do_softirq();
0bed698a 165 }
de30a2b3 166
bdb43806 167 preempt_count_dec();
3c829c36 168#ifdef CONFIG_TRACE_IRQFLAGS
0f476b6d 169 local_irq_enable();
3c829c36 170#endif
de30a2b3
IM
171 preempt_check_resched();
172}
0bd3a173 173EXPORT_SYMBOL(__local_bh_enable_ip);
de30a2b3 174
1da177e4 175/*
34376a50
BG
176 * We restart softirq processing for at most MAX_SOFTIRQ_RESTART times,
177 * but break the loop if need_resched() is set or after 2 ms.
178 * The MAX_SOFTIRQ_TIME provides a nice upper bound in most cases, but in
179 * certain cases, such as stop_machine(), jiffies may cease to
180 * increment and so we need the MAX_SOFTIRQ_RESTART limit as
181 * well to make sure we eventually return from this method.
1da177e4 182 *
c10d7367 183 * These limits have been established via experimentation.
1da177e4
LT
184 * The two things to balance is latency against fairness -
185 * we want to handle softirqs as soon as possible, but they
186 * should not be able to lock up the box.
187 */
c10d7367 188#define MAX_SOFTIRQ_TIME msecs_to_jiffies(2)
34376a50 189#define MAX_SOFTIRQ_RESTART 10
1da177e4 190
f1a83e65
PZ
191#ifdef CONFIG_TRACE_IRQFLAGS
192/*
f1a83e65
PZ
193 * When we run softirqs from irq_exit() and thus on the hardirq stack we need
194 * to keep the lockdep irq context tracking as tight as possible in order to
195 * not miss-qualify lock contexts and miss possible deadlocks.
196 */
f1a83e65 197
5c4853b6 198static inline bool lockdep_softirq_start(void)
f1a83e65 199{
5c4853b6 200 bool in_hardirq = false;
f1a83e65 201
5c4853b6
FW
202 if (trace_hardirq_context(current)) {
203 in_hardirq = true;
f1a83e65 204 trace_hardirq_exit();
5c4853b6
FW
205 }
206
f1a83e65 207 lockdep_softirq_enter();
5c4853b6
FW
208
209 return in_hardirq;
f1a83e65
PZ
210}
211
5c4853b6 212static inline void lockdep_softirq_end(bool in_hardirq)
f1a83e65
PZ
213{
214 lockdep_softirq_exit();
5c4853b6
FW
215
216 if (in_hardirq)
f1a83e65 217 trace_hardirq_enter();
f1a83e65 218}
f1a83e65 219#else
5c4853b6
FW
220static inline bool lockdep_softirq_start(void) { return false; }
221static inline void lockdep_softirq_end(bool in_hardirq) { }
f1a83e65
PZ
222#endif
223
1da177e4
LT
224asmlinkage void __do_softirq(void)
225{
c10d7367 226 unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
907aed48 227 unsigned long old_flags = current->flags;
34376a50 228 int max_restart = MAX_SOFTIRQ_RESTART;
f1a83e65 229 struct softirq_action *h;
5c4853b6 230 bool in_hardirq;
f1a83e65
PZ
231 __u32 pending;
232 int cpu;
907aed48
MG
233
234 /*
235 * Mask out PF_MEMALLOC s current task context is borrowed for the
236 * softirq. A softirq handled such as network RX might set PF_MEMALLOC
237 * again if the socket is related to swap
238 */
239 current->flags &= ~PF_MEMALLOC;
1da177e4
LT
240
241 pending = local_softirq_pending();
6a61671b 242 account_irq_enter_time(current);
829035fd 243
0bd3a173 244 __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);
5c4853b6 245 in_hardirq = lockdep_softirq_start();
1da177e4 246
1da177e4
LT
247 cpu = smp_processor_id();
248restart:
249 /* Reset the pending bitmask before enabling irqs */
3f74478b 250 set_softirq_pending(0);
1da177e4 251
c70f5d66 252 local_irq_enable();
1da177e4
LT
253
254 h = softirq_vec;
255
256 do {
257 if (pending & 1) {
f4bc6bb2 258 unsigned int vec_nr = h - softirq_vec;
8e85b4b5
TG
259 int prev_count = preempt_count();
260
f4bc6bb2
TG
261 kstat_incr_softirqs_this_cpu(vec_nr);
262
263 trace_softirq_entry(vec_nr);
1da177e4 264 h->action(h);
f4bc6bb2 265 trace_softirq_exit(vec_nr);
8e85b4b5 266 if (unlikely(prev_count != preempt_count())) {
f4bc6bb2 267 printk(KERN_ERR "huh, entered softirq %u %s %p"
8e85b4b5 268 "with preempt_count %08x,"
f4bc6bb2
TG
269 " exited with %08x?\n", vec_nr,
270 softirq_to_name[vec_nr], h->action,
271 prev_count, preempt_count());
4a2b4b22 272 preempt_count_set(prev_count);
8e85b4b5
TG
273 }
274
d6714c22 275 rcu_bh_qs(cpu);
1da177e4
LT
276 }
277 h++;
278 pending >>= 1;
279 } while (pending);
280
c70f5d66 281 local_irq_disable();
1da177e4
LT
282
283 pending = local_softirq_pending();
c10d7367 284 if (pending) {
34376a50
BG
285 if (time_before(jiffies, end) && !need_resched() &&
286 --max_restart)
c10d7367 287 goto restart;
1da177e4 288
1da177e4 289 wakeup_softirqd();
c10d7367 290 }
1da177e4 291
5c4853b6 292 lockdep_softirq_end(in_hardirq);
6a61671b 293 account_irq_exit_time(current);
75e1056f 294 __local_bh_enable(SOFTIRQ_OFFSET);
5d60d3e7 295 WARN_ON_ONCE(in_interrupt());
907aed48 296 tsk_restore_flags(current, old_flags, PF_MEMALLOC);
1da177e4
LT
297}
298
1da177e4
LT
299asmlinkage void do_softirq(void)
300{
301 __u32 pending;
302 unsigned long flags;
303
304 if (in_interrupt())
305 return;
306
307 local_irq_save(flags);
308
309 pending = local_softirq_pending();
310
311 if (pending)
7d65f4a6 312 do_softirq_own_stack();
1da177e4
LT
313
314 local_irq_restore(flags);
315}
316
dde4b2b5
IM
317/*
318 * Enter an interrupt context.
319 */
320void irq_enter(void)
321{
64db4cff 322 rcu_irq_enter();
0a8a2e78 323 if (is_idle_task(current) && !in_interrupt()) {
d267f87f
VP
324 /*
325 * Prevent raise_softirq from needlessly waking up ksoftirqd
326 * here, as softirq will be serviced on return from interrupt.
327 */
328 local_bh_disable();
e8fcaa5c 329 tick_check_idle();
d267f87f
VP
330 _local_bh_enable();
331 }
332
333 __irq_enter();
dde4b2b5
IM
334}
335
8d32a307
TG
336static inline void invoke_softirq(void)
337{
ded79754 338 if (!force_irqthreads) {
cc1f0274 339#ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK
ded79754
FW
340 /*
341 * We can safely execute softirq on the current stack if
342 * it is the irq stack, because it should be near empty
cc1f0274
FW
343 * at this stage.
344 */
345 __do_softirq();
346#else
347 /*
348 * Otherwise, irq_exit() is called on the task stack that can
349 * be potentially deep already. So call softirq in its own stack
350 * to prevent from any overrun.
ded79754 351 */
be6e1016 352 do_softirq_own_stack();
cc1f0274 353#endif
ded79754 354 } else {
8d32a307 355 wakeup_softirqd();
ded79754 356 }
8d32a307 357}
1da177e4 358
67826eae
FW
359static inline void tick_irq_exit(void)
360{
361#ifdef CONFIG_NO_HZ_COMMON
362 int cpu = smp_processor_id();
363
364 /* Make sure that timer wheel updates are propagated */
365 if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu)) {
366 if (!in_interrupt())
367 tick_nohz_irq_exit();
368 }
369#endif
370}
371
1da177e4
LT
372/*
373 * Exit an interrupt context. Process softirqs if needed and possible:
374 */
375void irq_exit(void)
376{
74eed016 377#ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED
4cd5d111 378 local_irq_disable();
74eed016
TG
379#else
380 WARN_ON_ONCE(!irqs_disabled());
381#endif
382
6a61671b 383 account_irq_exit_time(current);
bdb43806 384 preempt_count_sub(HARDIRQ_OFFSET);
1da177e4
LT
385 if (!in_interrupt() && local_softirq_pending())
386 invoke_softirq();
79bf2bb3 387
67826eae 388 tick_irq_exit();
416eb33c 389 rcu_irq_exit();
f1a83e65 390 trace_hardirq_exit(); /* must be last! */
1da177e4
LT
391}
392
393/*
394 * This function must run with irqs disabled!
395 */
7ad5b3a5 396inline void raise_softirq_irqoff(unsigned int nr)
1da177e4
LT
397{
398 __raise_softirq_irqoff(nr);
399
400 /*
401 * If we're in an interrupt or softirq, we're done
402 * (this also catches softirq-disabled code). We will
403 * actually run the softirq once we return from
404 * the irq or softirq.
405 *
406 * Otherwise we wake up ksoftirqd to make sure we
407 * schedule the softirq soon.
408 */
409 if (!in_interrupt())
410 wakeup_softirqd();
411}
412
7ad5b3a5 413void raise_softirq(unsigned int nr)
1da177e4
LT
414{
415 unsigned long flags;
416
417 local_irq_save(flags);
418 raise_softirq_irqoff(nr);
419 local_irq_restore(flags);
420}
421
f069686e
SR
422void __raise_softirq_irqoff(unsigned int nr)
423{
424 trace_softirq_raise(nr);
425 or_softirq_pending(1UL << nr);
426}
427
962cf36c 428void open_softirq(int nr, void (*action)(struct softirq_action *))
1da177e4 429{
1da177e4
LT
430 softirq_vec[nr].action = action;
431}
432
9ba5f005
PZ
433/*
434 * Tasklets
435 */
1da177e4
LT
436struct tasklet_head
437{
48f20a9a
OJ
438 struct tasklet_struct *head;
439 struct tasklet_struct **tail;
1da177e4
LT
440};
441
4620b49f
VN
442static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
443static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec);
1da177e4 444
7ad5b3a5 445void __tasklet_schedule(struct tasklet_struct *t)
1da177e4
LT
446{
447 unsigned long flags;
448
449 local_irq_save(flags);
48f20a9a 450 t->next = NULL;
909ea964
CL
451 *__this_cpu_read(tasklet_vec.tail) = t;
452 __this_cpu_write(tasklet_vec.tail, &(t->next));
1da177e4
LT
453 raise_softirq_irqoff(TASKLET_SOFTIRQ);
454 local_irq_restore(flags);
455}
456
457EXPORT_SYMBOL(__tasklet_schedule);
458
7ad5b3a5 459void __tasklet_hi_schedule(struct tasklet_struct *t)
1da177e4
LT
460{
461 unsigned long flags;
462
463 local_irq_save(flags);
48f20a9a 464 t->next = NULL;
909ea964
CL
465 *__this_cpu_read(tasklet_hi_vec.tail) = t;
466 __this_cpu_write(tasklet_hi_vec.tail, &(t->next));
1da177e4
LT
467 raise_softirq_irqoff(HI_SOFTIRQ);
468 local_irq_restore(flags);
469}
470
471EXPORT_SYMBOL(__tasklet_hi_schedule);
472
7c692cba
VN
473void __tasklet_hi_schedule_first(struct tasklet_struct *t)
474{
475 BUG_ON(!irqs_disabled());
476
909ea964
CL
477 t->next = __this_cpu_read(tasklet_hi_vec.head);
478 __this_cpu_write(tasklet_hi_vec.head, t);
7c692cba
VN
479 __raise_softirq_irqoff(HI_SOFTIRQ);
480}
481
482EXPORT_SYMBOL(__tasklet_hi_schedule_first);
483
1da177e4
LT
484static void tasklet_action(struct softirq_action *a)
485{
486 struct tasklet_struct *list;
487
488 local_irq_disable();
909ea964
CL
489 list = __this_cpu_read(tasklet_vec.head);
490 __this_cpu_write(tasklet_vec.head, NULL);
491 __this_cpu_write(tasklet_vec.tail, &__get_cpu_var(tasklet_vec).head);
1da177e4
LT
492 local_irq_enable();
493
494 while (list) {
495 struct tasklet_struct *t = list;
496
497 list = list->next;
498
499 if (tasklet_trylock(t)) {
500 if (!atomic_read(&t->count)) {
501 if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
502 BUG();
503 t->func(t->data);
504 tasklet_unlock(t);
505 continue;
506 }
507 tasklet_unlock(t);
508 }
509
510 local_irq_disable();
48f20a9a 511 t->next = NULL;
909ea964
CL
512 *__this_cpu_read(tasklet_vec.tail) = t;
513 __this_cpu_write(tasklet_vec.tail, &(t->next));
1da177e4
LT
514 __raise_softirq_irqoff(TASKLET_SOFTIRQ);
515 local_irq_enable();
516 }
517}
518
519static void tasklet_hi_action(struct softirq_action *a)
520{
521 struct tasklet_struct *list;
522
523 local_irq_disable();
909ea964
CL
524 list = __this_cpu_read(tasklet_hi_vec.head);
525 __this_cpu_write(tasklet_hi_vec.head, NULL);
526 __this_cpu_write(tasklet_hi_vec.tail, &__get_cpu_var(tasklet_hi_vec).head);
1da177e4
LT
527 local_irq_enable();
528
529 while (list) {
530 struct tasklet_struct *t = list;
531
532 list = list->next;
533
534 if (tasklet_trylock(t)) {
535 if (!atomic_read(&t->count)) {
536 if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
537 BUG();
538 t->func(t->data);
539 tasklet_unlock(t);
540 continue;
541 }
542 tasklet_unlock(t);
543 }
544
545 local_irq_disable();
48f20a9a 546 t->next = NULL;
909ea964
CL
547 *__this_cpu_read(tasklet_hi_vec.tail) = t;
548 __this_cpu_write(tasklet_hi_vec.tail, &(t->next));
1da177e4
LT
549 __raise_softirq_irqoff(HI_SOFTIRQ);
550 local_irq_enable();
551 }
552}
553
554
555void tasklet_init(struct tasklet_struct *t,
556 void (*func)(unsigned long), unsigned long data)
557{
558 t->next = NULL;
559 t->state = 0;
560 atomic_set(&t->count, 0);
561 t->func = func;
562 t->data = data;
563}
564
565EXPORT_SYMBOL(tasklet_init);
566
567void tasklet_kill(struct tasklet_struct *t)
568{
569 if (in_interrupt())
570 printk("Attempt to kill tasklet from interrupt\n");
571
572 while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
79d381c9 573 do {
1da177e4 574 yield();
79d381c9 575 } while (test_bit(TASKLET_STATE_SCHED, &t->state));
1da177e4
LT
576 }
577 tasklet_unlock_wait(t);
578 clear_bit(TASKLET_STATE_SCHED, &t->state);
579}
580
581EXPORT_SYMBOL(tasklet_kill);
582
9ba5f005
PZ
583/*
584 * tasklet_hrtimer
585 */
586
587/*
b9c30322
PZ
588 * The trampoline is called when the hrtimer expires. It schedules a tasklet
589 * to run __tasklet_hrtimer_trampoline() which in turn will call the intended
590 * hrtimer callback, but from softirq context.
9ba5f005
PZ
591 */
592static enum hrtimer_restart __hrtimer_tasklet_trampoline(struct hrtimer *timer)
593{
594 struct tasklet_hrtimer *ttimer =
595 container_of(timer, struct tasklet_hrtimer, timer);
596
b9c30322
PZ
597 tasklet_hi_schedule(&ttimer->tasklet);
598 return HRTIMER_NORESTART;
9ba5f005
PZ
599}
600
601/*
602 * Helper function which calls the hrtimer callback from
603 * tasklet/softirq context
604 */
605static void __tasklet_hrtimer_trampoline(unsigned long data)
606{
607 struct tasklet_hrtimer *ttimer = (void *)data;
608 enum hrtimer_restart restart;
609
610 restart = ttimer->function(&ttimer->timer);
611 if (restart != HRTIMER_NORESTART)
612 hrtimer_restart(&ttimer->timer);
613}
614
615/**
616 * tasklet_hrtimer_init - Init a tasklet/hrtimer combo for softirq callbacks
617 * @ttimer: tasklet_hrtimer which is initialized
25985edc 618 * @function: hrtimer callback function which gets called from softirq context
9ba5f005
PZ
619 * @which_clock: clock id (CLOCK_MONOTONIC/CLOCK_REALTIME)
620 * @mode: hrtimer mode (HRTIMER_MODE_ABS/HRTIMER_MODE_REL)
621 */
622void tasklet_hrtimer_init(struct tasklet_hrtimer *ttimer,
623 enum hrtimer_restart (*function)(struct hrtimer *),
624 clockid_t which_clock, enum hrtimer_mode mode)
625{
626 hrtimer_init(&ttimer->timer, which_clock, mode);
627 ttimer->timer.function = __hrtimer_tasklet_trampoline;
628 tasklet_init(&ttimer->tasklet, __tasklet_hrtimer_trampoline,
629 (unsigned long)ttimer);
630 ttimer->function = function;
631}
632EXPORT_SYMBOL_GPL(tasklet_hrtimer_init);
633
1da177e4
LT
634void __init softirq_init(void)
635{
48f20a9a
OJ
636 int cpu;
637
638 for_each_possible_cpu(cpu) {
639 per_cpu(tasklet_vec, cpu).tail =
640 &per_cpu(tasklet_vec, cpu).head;
641 per_cpu(tasklet_hi_vec, cpu).tail =
642 &per_cpu(tasklet_hi_vec, cpu).head;
643 }
644
962cf36c
CM
645 open_softirq(TASKLET_SOFTIRQ, tasklet_action);
646 open_softirq(HI_SOFTIRQ, tasklet_hi_action);
1da177e4
LT
647}
648
3e339b5d 649static int ksoftirqd_should_run(unsigned int cpu)
1da177e4 650{
3e339b5d
TG
651 return local_softirq_pending();
652}
1da177e4 653
3e339b5d
TG
654static void run_ksoftirqd(unsigned int cpu)
655{
656 local_irq_disable();
657 if (local_softirq_pending()) {
0bed698a
FW
658 /*
659 * We can safely run softirq on inline stack, as we are not deep
660 * in the task stack here.
661 */
3e339b5d
TG
662 __do_softirq();
663 rcu_note_context_switch(cpu);
664 local_irq_enable();
665 cond_resched();
666 return;
1da177e4 667 }
3e339b5d 668 local_irq_enable();
1da177e4
LT
669}
670
671#ifdef CONFIG_HOTPLUG_CPU
672/*
673 * tasklet_kill_immediate is called to remove a tasklet which can already be
674 * scheduled for execution on @cpu.
675 *
676 * Unlike tasklet_kill, this function removes the tasklet
677 * _immediately_, even if the tasklet is in TASKLET_STATE_SCHED state.
678 *
679 * When this function is called, @cpu must be in the CPU_DEAD state.
680 */
681void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu)
682{
683 struct tasklet_struct **i;
684
685 BUG_ON(cpu_online(cpu));
686 BUG_ON(test_bit(TASKLET_STATE_RUN, &t->state));
687
688 if (!test_bit(TASKLET_STATE_SCHED, &t->state))
689 return;
690
691 /* CPU is dead, so no lock needed. */
48f20a9a 692 for (i = &per_cpu(tasklet_vec, cpu).head; *i; i = &(*i)->next) {
1da177e4
LT
693 if (*i == t) {
694 *i = t->next;
48f20a9a
OJ
695 /* If this was the tail element, move the tail ptr */
696 if (*i == NULL)
697 per_cpu(tasklet_vec, cpu).tail = i;
1da177e4
LT
698 return;
699 }
700 }
701 BUG();
702}
703
704static void takeover_tasklets(unsigned int cpu)
705{
1da177e4
LT
706 /* CPU is dead, so no lock needed. */
707 local_irq_disable();
708
709 /* Find end, append list for that CPU. */
e5e41723 710 if (&per_cpu(tasklet_vec, cpu).head != per_cpu(tasklet_vec, cpu).tail) {
909ea964
CL
711 *__this_cpu_read(tasklet_vec.tail) = per_cpu(tasklet_vec, cpu).head;
712 this_cpu_write(tasklet_vec.tail, per_cpu(tasklet_vec, cpu).tail);
e5e41723
CB
713 per_cpu(tasklet_vec, cpu).head = NULL;
714 per_cpu(tasklet_vec, cpu).tail = &per_cpu(tasklet_vec, cpu).head;
715 }
1da177e4
LT
716 raise_softirq_irqoff(TASKLET_SOFTIRQ);
717
e5e41723 718 if (&per_cpu(tasklet_hi_vec, cpu).head != per_cpu(tasklet_hi_vec, cpu).tail) {
909ea964
CL
719 *__this_cpu_read(tasklet_hi_vec.tail) = per_cpu(tasklet_hi_vec, cpu).head;
720 __this_cpu_write(tasklet_hi_vec.tail, per_cpu(tasklet_hi_vec, cpu).tail);
e5e41723
CB
721 per_cpu(tasklet_hi_vec, cpu).head = NULL;
722 per_cpu(tasklet_hi_vec, cpu).tail = &per_cpu(tasklet_hi_vec, cpu).head;
723 }
1da177e4
LT
724 raise_softirq_irqoff(HI_SOFTIRQ);
725
726 local_irq_enable();
727}
728#endif /* CONFIG_HOTPLUG_CPU */
729
0db0628d 730static int cpu_callback(struct notifier_block *nfb,
1da177e4
LT
731 unsigned long action,
732 void *hcpu)
733{
1da177e4 734 switch (action) {
1da177e4 735#ifdef CONFIG_HOTPLUG_CPU
1da177e4 736 case CPU_DEAD:
3e339b5d
TG
737 case CPU_DEAD_FROZEN:
738 takeover_tasklets((unsigned long)hcpu);
1da177e4
LT
739 break;
740#endif /* CONFIG_HOTPLUG_CPU */
3e339b5d 741 }
1da177e4
LT
742 return NOTIFY_OK;
743}
744
0db0628d 745static struct notifier_block cpu_nfb = {
1da177e4
LT
746 .notifier_call = cpu_callback
747};
748
3e339b5d
TG
749static struct smp_hotplug_thread softirq_threads = {
750 .store = &ksoftirqd,
751 .thread_should_run = ksoftirqd_should_run,
752 .thread_fn = run_ksoftirqd,
753 .thread_comm = "ksoftirqd/%u",
754};
755
7babe8db 756static __init int spawn_ksoftirqd(void)
1da177e4 757{
1da177e4 758 register_cpu_notifier(&cpu_nfb);
3e339b5d
TG
759
760 BUG_ON(smpboot_register_percpu_thread(&softirq_threads));
761
1da177e4
LT
762 return 0;
763}
7babe8db 764early_initcall(spawn_ksoftirqd);
78eef01b 765
43a25632
YL
766/*
767 * [ These __weak aliases are kept in a separate compilation unit, so that
768 * GCC does not inline them incorrectly. ]
769 */
770
771int __init __weak early_irq_init(void)
772{
773 return 0;
774}
775
4a046d17
YL
776int __init __weak arch_probe_nr_irqs(void)
777{
b683de2b 778 return NR_IRQS_LEGACY;
4a046d17
YL
779}
780
43a25632
YL
781int __init __weak arch_early_irq_init(void)
782{
783 return 0;
784}