aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386
diff options
context:
space:
mode:
authorBjörn Steinbrink <B.Steinbrink@gmx.de>2006-06-25 10:24:40 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-25 14:32:44 -0400
commita5d157e0675ac11188a8d429a062b1938bb2d353 (patch)
tree152d75b3ecda85427a92808ec363bc4d1c9bd243 /arch/i386
parent1d77062b1402aef5b26e1d3776991126e8026bde (diff)
[PATCH] i386: Fix softirq accounting with 4K stacks
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>
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/kernel/irq.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c
index 248e922ee13a..49ce4c31b713 100644
--- a/arch/i386/kernel/irq.c
+++ b/arch/i386/kernel/irq.c
@@ -95,6 +95,14 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs)
95 irqctx->tinfo.task = curctx->tinfo.task; 95 irqctx->tinfo.task = curctx->tinfo.task;
96 irqctx->tinfo.previous_esp = current_stack_pointer; 96 irqctx->tinfo.previous_esp = current_stack_pointer;
97 97
98 /*
99 * Copy the softirq bits in preempt_count so that the
100 * softirq checks work in the hardirq context.
101 */
102 irqctx->tinfo.preempt_count =
103 irqctx->tinfo.preempt_count & ~SOFTIRQ_MASK |
104 curctx->tinfo.preempt_count & SOFTIRQ_MASK;
105
98 asm volatile( 106 asm volatile(
99 " xchgl %%ebx,%%esp \n" 107 " xchgl %%ebx,%%esp \n"
100 " call __do_IRQ \n" 108 " call __do_IRQ \n"