Skip to contentSkip to conversation

softirqs: fix latency of softirq processing

PATCH New Ingo Molnar 1 participant 1 message Sep 17, 2004

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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.

Ingo

kernel/softirq.c renamed from kernel/softirq.c.orig +11 -4
@@ -137,12 +137,19 @@ EXPORT_SYMBOL(do_softirq);
 
 void local_bh_enable(void)
 {
-	__local_bh_enable();
 	WARN_ON(irqs_disabled());
-	if (unlikely(!in_interrupt() &&
-		     local_softirq_pending()))
+	if (unlikely(!in_interrupt() && local_softirq_pending())) {
+		/*
+		 * Keep preemption disabled until we are done with
+		 * softirq processing:
+	 	 */
+		preempt_count() -= SOFTIRQ_OFFSET - 1;
 		invoke_softirq();
-	preempt_check_resched();
+		preempt_enable();
+	} else {
+		__local_bh_enable();
+		preempt_check_resched();
+	}
 }
 EXPORT_SYMBOL(local_bh_enable);