aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorJupyung Lee <jupyung@gmail.com>2009-11-10 03:31:54 -0500
committerThomas Gleixner <tglx@linutronix.de>2009-11-10 06:03:40 -0500
commitca0b4bfa5994856bbcf4227e29f9c73722efaef2 (patch)
tree226512d39685b7be6d5960bd00ac7ab94abc5e32 /include/linux
parent3c8167f96df4c45c659ad6df520e3449587a7d5d (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')
0 files changed, 0 insertions, 0 deletions