Commit 40e39ce0 authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds

[PATCH] softirqs: fix latency of softirq processing

The attached patch fixes a local_bh_enable() buglet: we first enabled
softirqs then did we do local_softirq_pending() - often this is preemptible
code.  So this task could be preempted and there's no guarantee that
softirq processing will occur (except the periodic timer tick).

The race window is small but existent.  This could result in packet
processing latencies or timer expiration latencies - hard to detect and
annoying bugs.

The fix is to invoke softirqs with softirqs enabled but preemption still
disabled.  Patch is against 2.6.9-rc2-mm1.
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Cc: <davem@davemloft.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent cfc4f957
...@@ -137,11 +137,17 @@ EXPORT_SYMBOL(do_softirq); ...@@ -137,11 +137,17 @@ EXPORT_SYMBOL(do_softirq);
void local_bh_enable(void) void local_bh_enable(void)
{ {
__local_bh_enable();
WARN_ON(irqs_disabled()); WARN_ON(irqs_disabled());
if (unlikely(!in_interrupt() && /*
local_softirq_pending())) * Keep preemption disabled until we are done with
* softirq processing:
*/
preempt_count() -= SOFTIRQ_OFFSET - 1;
if (unlikely(!in_interrupt() && local_softirq_pending()))
invoke_softirq(); invoke_softirq();
dec_preempt_count();
preempt_check_resched(); preempt_check_resched();
} }
EXPORT_SYMBOL(local_bh_enable); EXPORT_SYMBOL(local_bh_enable);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment