diff options
| author | Jupyung Lee <jupyung@gmail.com> | 2009-11-10 03:31:54 -0500 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2009-11-10 06:03:40 -0500 |
| commit | ca0b4bfa5994856bbcf4227e29f9c73722efaef2 (patch) | |
| tree | 226512d39685b7be6d5960bd00ac7ab94abc5e32 /include/linux/flex_array.h | |
| parent | 3c8167f96df4c45c659ad6df520e3449587a7d5d (diff) | |
softirqs: Add missing preemption point in ksoftirqd
In its current implementation, ksoftirq() includes a series of primitives
related with kernel preemption and irq on/off, in the following order:
preempt_disable() ... (1)
local_irq_disable() ... (2)
__preempt_enable_no_resched() ... (3)
local_irq_enable() ... (4)
A problem arises if a task is woken up between (1) and (2) because it
is not given a chance to preempt the currently running process until
interrupts are enabled at (4). At this point the the kernel is
preemptible, but there is no explicit reschedule point.
This is only true for a preempt-rt enabled kernel as !preempt-rt has
preemption disabled at that point via local_bh_disable().
A simple suggestion to resolve the problem is to add a reschedule point,
preempt_check_resched(), just after (4).
[ tglx: Modified: delete __preempt_enable_no_resched() and add
preempt_enable() after local_irq_enable() ]
Signed-off-by: Jupyung Lee <jupyung@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/flex_array.h')
0 files changed, 0 insertions, 0 deletions
