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