From: "Björn Steinbrink" <B.Steinbrink@gmx.de>
To: linux-kernel@vger.kernel.org
Cc: Mike Galbraith <efault@gmx.de>,
danial_thom@yahoo.com, Linus Torvalds <torvalds@osdl.org>,
Andrew Morton <akpm@osdl.org>
Subject: [PATCH] i386: Fix softirq accounting with 4K stacks
Date: Sun, 25 Jun 2006 16:24:40 +0200 [thread overview]
Message-ID: <20060625142440.GD8223@atjola.homenet> (raw)
In-Reply-To: <20060625111238.GB8223@atjola.homenet>
On 2006.06.25 13:12:38 +0200, Björn Steinbrink wrote:
> On 2006.06.25 07:06:33 +0200, Mike Galbraith wrote:
> > On Sat, 2006-06-24 at 21:25 +0200, Björn Steinbrink wrote:
> > > OK, it also depends on IO APIC being enabled and active, ie. noapic on
> > > the kernel command line will fix it as well as disabling
> > > CONFIG_X86_IO_APIC. That doesn't help me at all to understand why it
> > > happens though.
> >
> > Ditto.
> >
> > > The only difference with IO APIC disabled seems to be that the irq
> > > doesn't get ACKed before update_process_times() gets called.
> > > And your "fix" makes it being called outside of the xtime_lock spinlock
> > > and with a slightly different stack usage AFAICT.
> >
> > (it's still under the xtime lock)
>
> No, with IO-APIC enabled, it's using the local APIC timer, thus
> using_apic_timer is 1 and the path right after unlocking in
> timer_interrupt() is taken towards update_process_times().
>
> > > But none of these should make a difference, right?
> >
> > Not that I can see, but then it's pretty dark down here. Anybody got a
> > flashlight I can borrow? ;-)
>
> Guess I found one, not sure if it works correctly though ;)
>
> Using 4K stacks, we have one stack for hard irqs and one for soft irqs,
> both having their own threadinfo and thus preemptcount. Thus the call to
> softirq_count() in account_system_time() will always return 0 when
> called in hard irq context. Additionally preemptcount is always set to
> HARDIRQ_OFFSET in hard irq context, so
> hardirq_count() - hardirq_offset is 0 all the time as well.
>
> But that doesn't fit the fact that I at least get hard irq accounting
> when booting with noapic. And it also doesn't explain why your fix
> works, fixing both, soft and hard irq accounting. Am I missing some
> code path that calls smp_local_timer_interrupt? There's
> smp_apic_timer_interrupt(), but that seems to be unused on i386.
OK, the hardirq_count() thing is not HARDIRQ_OFFSET all the time. When
we interrupt a hard irq, we are already using the hard irq stack and
thus irq_enter() in do_IRQ() works as it should. The zero value for hi
is there with IO-APIC and 8K stacks as well, so that's either right or
an other bug.
Still no idea why your "fix" works, but the following patch also fixes
the problem and is at least a little more like the RightThing.
---
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>
diff -Nurp a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c
--- a/arch/i386/kernel/irq.c 2006-03-20 06:53:29.000000000 +0100
+++ b/arch/i386/kernel/irq.c 2006-06-25 15:49:52.000000000 +0200
@@ -95,6 +95,14 @@ fastcall unsigned int do_IRQ(struct pt_r
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"
next prev parent reply other threads:[~2006-06-25 14:24 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-22 15:26 Measuring tools - top and interrupts Danial Thom
2006-06-22 16:19 ` Randy.Dunlap
2006-06-22 17:16 ` Bernd Eckenfels
2006-06-22 16:21 ` Erik Mouw
2006-06-22 16:58 ` Danial Thom
2006-06-22 17:31 ` Erik Mouw
2006-06-22 23:37 ` Danial Thom
2006-06-23 8:32 ` Mike Galbraith
2006-06-23 20:14 ` Danial Thom
2006-06-23 22:51 ` Mike Galbraith
2006-06-23 9:02 ` Erik Mouw
2006-06-23 17:13 ` Alistair John Strachan
2006-06-23 18:16 ` Danial Thom
2006-06-23 5:34 ` sena seneviratne
2006-06-23 20:42 ` Danial Thom
2006-06-22 17:57 ` Francois Romieu
2006-06-22 22:47 ` Danial Thom
2006-06-22 23:53 ` Francois Romieu
2006-06-23 20:34 ` Danial Thom
2006-06-23 21:19 ` Francois Romieu
2006-06-24 2:07 ` Björn Steinbrink
2006-06-24 4:39 ` sena seneviratne
2006-06-24 5:59 ` Mike Galbraith
2006-06-24 6:26 ` Mike Galbraith
2006-06-24 9:21 ` Björn Steinbrink
2006-06-24 9:51 ` Mike Galbraith
2006-06-24 11:41 ` Mike Galbraith
2006-06-24 15:40 ` Björn Steinbrink
2006-06-24 16:23 ` Mike Galbraith
2006-06-24 19:25 ` Björn Steinbrink
2006-06-25 5:06 ` Mike Galbraith
2006-06-25 11:12 ` Björn Steinbrink
2006-06-25 14:24 ` Björn Steinbrink [this message]
2006-06-25 15:15 ` [PATCH] i386: Fix softirq accounting with 4K stacks Arjan van de Ven
2006-06-25 17:44 ` Mike Galbraith
2006-06-25 17:43 ` Arjan van de Ven
2006-06-25 18:42 ` Björn Steinbrink
2006-06-26 2:23 ` Mike Galbraith
2006-06-26 3:05 ` Mike Galbraith
2006-06-26 17:58 ` Björn Steinbrink
2006-06-27 10:09 ` Mike Galbraith
2006-06-25 20:45 ` Measuring tools - top and interrupts Danial Thom
2006-06-26 2:33 ` Mike Galbraith
2006-06-30 13:41 ` Danial Thom
2006-06-30 18:03 ` Mike Galbraith
-- strict thread matches above, loose matches on Subject: below --
2006-06-26 22:54 [PATCH] i386: Fix softirq accounting with 4K stacks Chuck Ebbert
2006-06-27 0:57 ` Björn Steinbrink
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060625142440.GD8223@atjola.homenet \
--to=b.steinbrink@gmx.de \
--cc=akpm@osdl.org \
--cc=danial_thom@yahoo.com \
--cc=efault@gmx.de \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.