xref: /linux/kernel/softirq.c (revision f3d9478b2ce468c3115b02ecae7e975990697f15)
1 /*
2  *	linux/kernel/softirq.c
3  *
4  *	Copyright (C) 1992 Linus Torvalds
5  *
6  * Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903)
7  */
8 
9 #include <linux/module.h>
10 #include <linux/kernel_stat.h>
11 #include <linux/interrupt.h>
12 #include <linux/init.h>
13 #include <linux/mm.h>
14 #include <linux/notifier.h>
15 #include <linux/percpu.h>
16 #include <linux/cpu.h>
17 #include <linux/kthread.h>
18 #include <linux/rcupdate.h>
19 #include <linux/smp.h>
20 
21 #include <asm/irq.h>
22 /*
23    - No shared variables, all the data are CPU local.
24    - If a softirq needs serialization, let it serialize itself
25      by its own spinlocks.
26    - Even if softirq is serialized, only local cpu is marked for
27      execution. Hence, we get something sort of weak cpu binding.
28      Though it is still not clear, will it result in better locality
29      or will not.
30 
31    Examples:
32    - NET RX softirq. It is multithreaded and does not require
33      any global serialization.
34    - NET TX softirq. It kicks software netdevice queues, hence
35      it is logically serialized per device, but this serialization
36      is invisible to common code.
37    - Tasklets: serialized wrt itself.
38  */
39 
40 #ifndef __ARCH_IRQ_STAT
41 irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned;
42 EXPORT_SYMBOL(irq_stat);
43 #endif
44 
45 static struct softirq_action softirq_vec[32] __cacheline_aligned_in_smp;
46 
47 static DEFINE_PER_CPU(struct task_struct *, ksoftirqd);
48 
49 /*
50  * we cannot loop indefinitely here to avoid userspace starvation,
51  * but we also don't want to introduce a worst case 1/HZ latency
52  * to the pending events, so lets the scheduler to balance
53  * the softirq load for us.
54  */
55 static inline void wakeup_softirqd(void)
56 {
57 	/* Interrupts are disabled: no need to stop preemption */
58 	struct task_struct *tsk = __get_cpu_var(ksoftirqd);
59 
60 	if (tsk && tsk->state != TASK_RUNNING)
61 		wake_up_process(tsk);
62 }
63 
64 /*
65  * We restart softirq processing MAX_SOFTIRQ_RESTART times,
66  * and we fall back to softirqd after that.
67  *
68  * This number has been established via experimentation.
69  * The two things to balance is latency against fairness -
70  * we want to handle softirqs as soon as possible, but they
71  * should not be able to lock up the box.
72  */
73 #define MAX_SOFTIRQ_RESTART 10
74 
75 asmlinkage void __do_softirq(void)
76 {
77 	struct softirq_action *h;
78 	__u32 pending;
79 	int max_restart = MAX_SOFTIRQ_RESTART;
80 	int cpu;
81 
82 	pending = local_softirq_pending();
83 
84 	local_bh_disable();
85 	cpu = smp_processor_id();
86 restart:
87 	/* Reset the pending bitmask before enabling irqs */
88 	set_softirq_pending(0);
89 
90 	local_irq_enable();
91 
92 	h = softirq_vec;
93 
94 	do {
95 		if (pending & 1) {
96 			h->action(h);
97 			rcu_bh_qsctr_inc(cpu);
98 		}
99 		h++;
100 		pending >>= 1;
101 	} while (pending);
102 
103 	local_irq_disable();
104 
105 	pending = local_softirq_pending();
106 	if (pending && --max_restart)
107 		goto restart;
108 
109 	if (pending)
110 		wakeup_softirqd();
111 
112 	__local_bh_enable();
113 }
114 
115 #ifndef __ARCH_HAS_DO_SOFTIRQ
116 
117 asmlinkage void do_softirq(void)
118 {
119 	__u32 pending;
120 	unsigned long flags;
121 
122 	if (in_interrupt())
123 		return;
124 
125 	local_irq_save(flags);
126 
127 	pending = local_softirq_pending();
128 
129 	if (pending)
130 		__do_softirq();
131 
132 	local_irq_restore(flags);
133 }
134 
135 EXPORT_SYMBOL(do_softirq);
136 
137 #endif
138 
139 void local_bh_enable(void)
140 {
141 	WARN_ON(irqs_disabled());
142 	/*
143 	 * Keep preemption disabled until we are done with
144 	 * softirq processing:
145  	 */
146  	sub_preempt_count(SOFTIRQ_OFFSET - 1);
147 
148 	if (unlikely(!in_interrupt() && local_softirq_pending()))
149 		do_softirq();
150 
151 	dec_preempt_count();
152 	preempt_check_resched();
153 }
154 EXPORT_SYMBOL(local_bh_enable);
155 
156 #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED
157 # define invoke_softirq()	__do_softirq()
158 #else
159 # define invoke_softirq()	do_softirq()
160 #endif
161 
162 /*
163  * Exit an interrupt context. Process softirqs if needed and possible:
164  */
165 void irq_exit(void)
166 {
167 	account_system_vtime(current);
168 	sub_preempt_count(IRQ_EXIT_OFFSET);
169 	if (!in_interrupt() && local_softirq_pending())
170 		invoke_softirq();
171 	preempt_enable_no_resched();
172 }
173 
174 /*
175  * This function must run with irqs disabled!
176  */
177 inline fastcall void raise_softirq_irqoff(unsigned int nr)
178 {
179 	__raise_softirq_irqoff(nr);
180 
181 	/*
182 	 * If we're in an interrupt or softirq, we're done
183 	 * (this also catches softirq-disabled code). We will
184 	 * actually run the softirq once we return from
185 	 * the irq or softirq.
186 	 *
187 	 * Otherwise we wake up ksoftirqd to make sure we
188 	 * schedule the softirq soon.
189 	 */
190 	if (!in_interrupt())
191 		wakeup_softirqd();
192 }
193 
194 EXPORT_SYMBOL(raise_softirq_irqoff);
195 
196 void fastcall raise_softirq(unsigned int nr)
197 {
198 	unsigned long flags;
199 
200 	local_irq_save(flags);
201 	raise_softirq_irqoff(nr);
202 	local_irq_restore(flags);
203 }
204 
205 void open_softirq(int nr, void (*action)(struct softirq_action*), void *data)
206 {
207 	softirq_vec[nr].data = data;
208 	softirq_vec[nr].action = action;
209 }
210 
211 EXPORT_SYMBOL(open_softirq);
212 
213 /* Tasklets */
214 struct tasklet_head
215 {
216 	struct tasklet_struct *list;
217 };
218 
219 /* Some compilers disobey section attribute on statics when not
220    initialized -- RR */
221 static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec) = { NULL };
222 static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec) = { NULL };
223 
224 void fastcall __tasklet_schedule(struct tasklet_struct *t)
225 {
226 	unsigned long flags;
227 
228 	local_irq_save(flags);
229 	t->next = __get_cpu_var(tasklet_vec).list;
230 	__get_cpu_var(tasklet_vec).list = t;
231 	raise_softirq_irqoff(TASKLET_SOFTIRQ);
232 	local_irq_restore(flags);
233 }
234 
235 EXPORT_SYMBOL(__tasklet_schedule);
236 
237 void fastcall __tasklet_hi_schedule(struct tasklet_struct *t)
238 {
239 	unsigned long flags;
240 
241 	local_irq_save(flags);
242 	t->next = __get_cpu_var(tasklet_hi_vec).list;
243 	__get_cpu_var(tasklet_hi_vec).list = t;
244 	raise_softirq_irqoff(HI_SOFTIRQ);
245 	local_irq_restore(flags);
246 }
247 
248 EXPORT_SYMBOL(__tasklet_hi_schedule);
249 
250 static void tasklet_action(struct softirq_action *a)
251 {
252 	struct tasklet_struct *list;
253 
254 	local_irq_disable();
255 	list = __get_cpu_var(tasklet_vec).list;
256 	__get_cpu_var(tasklet_vec).list = NULL;
257 	local_irq_enable();
258 
259 	while (list) {
260 		struct tasklet_struct *t = list;
261 
262 		list = list->next;
263 
264 		if (tasklet_trylock(t)) {
265 			if (!atomic_read(&t->count)) {
266 				if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
267 					BUG();
268 				t->func(t->data);
269 				tasklet_unlock(t);
270 				continue;
271 			}
272 			tasklet_unlock(t);
273 		}
274 
275 		local_irq_disable();
276 		t->next = __get_cpu_var(tasklet_vec).list;
277 		__get_cpu_var(tasklet_vec).list = t;
278 		__raise_softirq_irqoff(TASKLET_SOFTIRQ);
279 		local_irq_enable();
280 	}
281 }
282 
283 static void tasklet_hi_action(struct softirq_action *a)
284 {
285 	struct tasklet_struct *list;
286 
287 	local_irq_disable();
288 	list = __get_cpu_var(tasklet_hi_vec).list;
289 	__get_cpu_var(tasklet_hi_vec).list = NULL;
290 	local_irq_enable();
291 
292 	while (list) {
293 		struct tasklet_struct *t = list;
294 
295 		list = list->next;
296 
297 		if (tasklet_trylock(t)) {
298 			if (!atomic_read(&t->count)) {
299 				if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
300 					BUG();
301 				t->func(t->data);
302 				tasklet_unlock(t);
303 				continue;
304 			}
305 			tasklet_unlock(t);
306 		}
307 
308 		local_irq_disable();
309 		t->next = __get_cpu_var(tasklet_hi_vec).list;
310 		__get_cpu_var(tasklet_hi_vec).list = t;
311 		__raise_softirq_irqoff(HI_SOFTIRQ);
312 		local_irq_enable();
313 	}
314 }
315 
316 
317 void tasklet_init(struct tasklet_struct *t,
318 		  void (*func)(unsigned long), unsigned long data)
319 {
320 	t->next = NULL;
321 	t->state = 0;
322 	atomic_set(&t->count, 0);
323 	t->func = func;
324 	t->data = data;
325 }
326 
327 EXPORT_SYMBOL(tasklet_init);
328 
329 void tasklet_kill(struct tasklet_struct *t)
330 {
331 	if (in_interrupt())
332 		printk("Attempt to kill tasklet from interrupt\n");
333 
334 	while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
335 		do
336 			yield();
337 		while (test_bit(TASKLET_STATE_SCHED, &t->state));
338 	}
339 	tasklet_unlock_wait(t);
340 	clear_bit(TASKLET_STATE_SCHED, &t->state);
341 }
342 
343 EXPORT_SYMBOL(tasklet_kill);
344 
345 void __init softirq_init(void)
346 {
347 	open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
348 	open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
349 }
350 
351 static int ksoftirqd(void * __bind_cpu)
352 {
353 	set_user_nice(current, 19);
354 	current->flags |= PF_NOFREEZE;
355 
356 	set_current_state(TASK_INTERRUPTIBLE);
357 
358 	while (!kthread_should_stop()) {
359 		preempt_disable();
360 		if (!local_softirq_pending()) {
361 			preempt_enable_no_resched();
362 			schedule();
363 			preempt_disable();
364 		}
365 
366 		__set_current_state(TASK_RUNNING);
367 
368 		while (local_softirq_pending()) {
369 			/* Preempt disable stops cpu going offline.
370 			   If already offline, we'll be on wrong CPU:
371 			   don't process */
372 			if (cpu_is_offline((long)__bind_cpu))
373 				goto wait_to_die;
374 			do_softirq();
375 			preempt_enable_no_resched();
376 			cond_resched();
377 			preempt_disable();
378 		}
379 		preempt_enable();
380 		set_current_state(TASK_INTERRUPTIBLE);
381 	}
382 	__set_current_state(TASK_RUNNING);
383 	return 0;
384 
385 wait_to_die:
386 	preempt_enable();
387 	/* Wait for kthread_stop */
388 	set_current_state(TASK_INTERRUPTIBLE);
389 	while (!kthread_should_stop()) {
390 		schedule();
391 		set_current_state(TASK_INTERRUPTIBLE);
392 	}
393 	__set_current_state(TASK_RUNNING);
394 	return 0;
395 }
396 
397 #ifdef CONFIG_HOTPLUG_CPU
398 /*
399  * tasklet_kill_immediate is called to remove a tasklet which can already be
400  * scheduled for execution on @cpu.
401  *
402  * Unlike tasklet_kill, this function removes the tasklet
403  * _immediately_, even if the tasklet is in TASKLET_STATE_SCHED state.
404  *
405  * When this function is called, @cpu must be in the CPU_DEAD state.
406  */
407 void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu)
408 {
409 	struct tasklet_struct **i;
410 
411 	BUG_ON(cpu_online(cpu));
412 	BUG_ON(test_bit(TASKLET_STATE_RUN, &t->state));
413 
414 	if (!test_bit(TASKLET_STATE_SCHED, &t->state))
415 		return;
416 
417 	/* CPU is dead, so no lock needed. */
418 	for (i = &per_cpu(tasklet_vec, cpu).list; *i; i = &(*i)->next) {
419 		if (*i == t) {
420 			*i = t->next;
421 			return;
422 		}
423 	}
424 	BUG();
425 }
426 
427 static void takeover_tasklets(unsigned int cpu)
428 {
429 	struct tasklet_struct **i;
430 
431 	/* CPU is dead, so no lock needed. */
432 	local_irq_disable();
433 
434 	/* Find end, append list for that CPU. */
435 	for (i = &__get_cpu_var(tasklet_vec).list; *i; i = &(*i)->next);
436 	*i = per_cpu(tasklet_vec, cpu).list;
437 	per_cpu(tasklet_vec, cpu).list = NULL;
438 	raise_softirq_irqoff(TASKLET_SOFTIRQ);
439 
440 	for (i = &__get_cpu_var(tasklet_hi_vec).list; *i; i = &(*i)->next);
441 	*i = per_cpu(tasklet_hi_vec, cpu).list;
442 	per_cpu(tasklet_hi_vec, cpu).list = NULL;
443 	raise_softirq_irqoff(HI_SOFTIRQ);
444 
445 	local_irq_enable();
446 }
447 #endif /* CONFIG_HOTPLUG_CPU */
448 
449 static int cpu_callback(struct notifier_block *nfb,
450 				  unsigned long action,
451 				  void *hcpu)
452 {
453 	int hotcpu = (unsigned long)hcpu;
454 	struct task_struct *p;
455 
456 	switch (action) {
457 	case CPU_UP_PREPARE:
458 		BUG_ON(per_cpu(tasklet_vec, hotcpu).list);
459 		BUG_ON(per_cpu(tasklet_hi_vec, hotcpu).list);
460 		p = kthread_create(ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);
461 		if (IS_ERR(p)) {
462 			printk("ksoftirqd for %i failed\n", hotcpu);
463 			return NOTIFY_BAD;
464 		}
465 		kthread_bind(p, hotcpu);
466   		per_cpu(ksoftirqd, hotcpu) = p;
467  		break;
468 	case CPU_ONLINE:
469 		wake_up_process(per_cpu(ksoftirqd, hotcpu));
470 		break;
471 #ifdef CONFIG_HOTPLUG_CPU
472 	case CPU_UP_CANCELED:
473 		/* Unbind so it can run.  Fall thru. */
474 		kthread_bind(per_cpu(ksoftirqd, hotcpu),
475 			     any_online_cpu(cpu_online_map));
476 	case CPU_DEAD:
477 		p = per_cpu(ksoftirqd, hotcpu);
478 		per_cpu(ksoftirqd, hotcpu) = NULL;
479 		kthread_stop(p);
480 		takeover_tasklets(hotcpu);
481 		break;
482 #endif /* CONFIG_HOTPLUG_CPU */
483  	}
484 	return NOTIFY_OK;
485 }
486 
487 static struct notifier_block cpu_nfb = {
488 	.notifier_call = cpu_callback
489 };
490 
491 __init int spawn_ksoftirqd(void)
492 {
493 	void *cpu = (void *)(long)smp_processor_id();
494 	cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);
495 	cpu_callback(&cpu_nfb, CPU_ONLINE, cpu);
496 	register_cpu_notifier(&cpu_nfb);
497 	return 0;
498 }
499 
500 #ifdef CONFIG_SMP
501 /*
502  * Call a function on all processors
503  */
504 int on_each_cpu(void (*func) (void *info), void *info, int retry, int wait)
505 {
506 	int ret = 0;
507 
508 	preempt_disable();
509 	ret = smp_call_function(func, info, retry, wait);
510 	local_irq_disable();
511 	func(info);
512 	local_irq_enable();
513 	preempt_enable();
514 	return ret;
515 }
516 EXPORT_SYMBOL(on_each_cpu);
517 #endif
518