[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20070226172855.GB19403@frankl.hpl.hp.com>
Date: Mon, 26 Feb 2007 09:28:55 -0800
From: Stephane Eranian <eranian@....hp.com>
To: Linus Torvalds <torvalds@...ux-foundation.org>
Cc: Jiri Slaby <jirislaby@...il.com>, Uwe Bugla <uwe.bugla@....de>,
akpm@...ux-foundation.org, bunk@...sta.de,
linux-kernel@...r.kernel.org, Andi Kleen <ak@...e.de>,
venkatesh.pallipadi@...el.com
Subject: Re: bug in kernel 2.6.21-rc1-git1: conventional floppy drive cannot be mounted without hanging up the whole system
Hi,
On Mon, Feb 26, 2007 at 07:51:19AM -0800, Linus Torvalds wrote:
>
>
> On Mon, 26 Feb 2007, Jiri Slaby wrote:
> >
> > Ok, this commit is the culprit:
> > Commit: 2ff2d3d74705d34ab71b21f54634fcf50d57bdd5
> > Author: Stephane Eranian <eranian@....hp.com> Tue, 13 Feb 2007 13:26:22 +0100
> >
> > [PATCH] i386: add idle notifier
>
> Interesting. It doesn't touch floppy at all, but it *does* seem to play
> around with irq state.
>
> In particular, the floppy uses IRQF_DISABLED (which means that it doesn't
> want interrupts enabled when in the irq handler), and I get the feeling
> that the poll_idle() stuff made that not work.
>
> That said, the only thing that *really* seems to change (as far as a
> floopy driver could notice) is the added "exit_idle()" in the do_IRQ()
> sequence, and I'm not seeing that one enabling interrupts.
>
> But the idle sequence definitely does (ie now we disable/enable interrupts
> in cpu_idle(). I'm not seeing why that should matter, though.
>
> Stephane, any ideas?
>
I think this may be related to the issue fixed by Venkatesh here:
http://www.ussg.iu.edu/hypermail/linux/kernel/0611.3/1264.html
The same code was used for i386 but I think for both architectures, the patch
is missing default_idle(). I believe deault idle should look as follows:
void default_idle(void)
{
if (!hlt_counter && boot_cpu_data.hlt_works_ok) {
current_thread_info()->status &= ~TS_POLLING;
/*
* TS_POLLING-cleared state must be visible before we
* test NEED_RESCHED:
*/
smp_mb();
local_irq_disable();
if (!need_resched())
safe_halt(); /* enables interrupts racelessly */
else
local_irq_enable();
current_thread_info()->status |= TS_POLLING;
} else {
/* loop is done by the caller */
----> local_irq_enable();
cpu_relax();
}
}
I do not have any machine with floppy drives. Could you try this?
Thanks.
--
-Stephane
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists