diff options
author | Björn Steinbrink <B.Steinbrink@gmx.de> | 2006-06-25 10:24:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-25 14:32:44 -0400 |
commit | a5d157e0675ac11188a8d429a062b1938bb2d353 (patch) | |
tree | 152d75b3ecda85427a92808ec363bc4d1c9bd243 /arch/i386 | |
parent | 1d77062b1402aef5b26e1d3776991126e8026bde (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.c | 8 |
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" |