[PATCH] i386: Fix softirq accounting with 4K stacks
authorBjörn Steinbrink <B.Steinbrink@gmx.de>
Sun, 25 Jun 2006 14:24:40 +0000 (16:24 +0200)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 25 Jun 2006 18:32:44 +0000 (11:32 -0700)
Copy the softirq bits in preempt_count from the current context into the
hardirq context when using 4K stacks to make the softirq_count macro work
correctly and thereby fix softirq cpu time accounting.

Signed-off-by: Björn Steinbrink <B.Steinbrink@gmx.de>
Acked-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/i386/kernel/irq.c

index 248e922ee13a14b0cf0e97ce5261f92db141bba6..49ce4c31b713fc56a690d701389bc047e72a5a50 100644 (file)
@@ -95,6 +95,14 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs)
                irqctx->tinfo.task = curctx->tinfo.task;
                irqctx->tinfo.previous_esp = current_stack_pointer;
 
+               /*
+                * Copy the softirq bits in preempt_count so that the
+                * softirq checks work in the hardirq context.
+                */
+               irqctx->tinfo.preempt_count =
+                       irqctx->tinfo.preempt_count & ~SOFTIRQ_MASK |
+                       curctx->tinfo.preempt_count & SOFTIRQ_MASK;
+
                asm volatile(
                        "       xchgl   %%ebx,%%esp      \n"
                        "       call    __do_IRQ         \n"