Re: [PATCH] idle using PNI monitor/mwait (take 2)

From: Jamie Lokier
Date: Sat Sep 06 2003 - 04:59:52 EST


Nakajima, Jun wrote:
> > The result is a halted CPU even though need_resched is set, and the
> > idle loop isn't broken until the next interrupt, often a timer tick.
>
> I'm aware of the window, but did not realize that it could cause high
> latency spikes. Is that still the case with 2.6 where we have higher HZ
> (1000)? Anyway, I think it's a cheap way of removing such spikes.

HZ is irrelevant. If you receive an interrupt, and typical wakeup
latency is 0.05ms, then waiting until the next timer tick in 1ms is a spike.
Some applications tolerate that, some don't.

> > So you can remove it from your loop.
> Okay we'll remove local_irq_enable() at entry. So in that case we can
> remove the local_irq_enable() below as well?
>
> static void poll_idle (void)
> {
> int oldval;
>
> => local_irq_enable();

I misunderstood you and now you misunderstood me :)

It's ok to _disable_ irqs for the reasons I gave. I thought of that
because you pointed to the _disable_ in your quote of default_idle.

The _enable_ is there for a different reason.

Scheduling is not allowed with interrupts disabled. So we know that
when schedule() returns, local irqs are enabled. So poll_idle() doesn't
need to enable them. I suggest this change:

- remove the local_irq_enable() from poll_idle().

- add local_irq_enable() at the start of cpu_idle(), before the loop.

-- Jamie

diff -urN --exclude-from=dontdiff orig-2.6.0-test4/arch/i386/kernel/process.c idle_irqs-2.6.0-test4/arch/i386/kernel/process.c
--- orig-2.6.0-test4/arch/i386/kernel/process.c 2003-09-02 23:05:06.000000000 +0100
+++ idle_irqs-2.6.0-test4/arch/i386/kernel/process.c 2003-09-06 10:50:59.000000000 +0100
@@ -105,8 +105,6 @@
{
int oldval;

- local_irq_enable();
-
/*
* Deal with another CPU just having chosen a thread to
* run here:
@@ -136,6 +134,8 @@
*/
void cpu_idle (void)
{
+ local_irq_enable();
+
/* endless idle loop with no priority at all */
while (1) {
while (!need_resched()) {
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/