Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | Date | Wed, 23 Dec 2009 08:49:38 -0800 (PST) | From | Linus Torvalds <> | Subject | Re: [Fdutils] DMA cache consistency bug introduced in 2.6.28 |
| |
On Wed, 23 Dec 2009, Andi Kleen wrote: > > I suspect it's a system where the APIC timer stops in deeper idle > states and it supports them. In this case CPU #0 does timer broadcasts > when needed to wake the other CPUs up from deep C, but for that it has > to run with HPET. At least the other ones can still enjoy the LAPIC > timer.
Ahh, ok, that makes sense. I was assuming the broadcast timer would act in that capacity, but..
> This might suggest that Mark's floppy controller doesn't like > deep C? Mark, did you try booting with processor.max_cstate=1 > and HPET enabled?
We have indeed had historical issues with floppy and sleep states before.
I do note another issue, though - the floppy driver itself seems totally broken when it comes to using interleaved sectors. Alain, that "place logical sectors" code is simply _broken_ - the "while" kicks in only if the first sector we test is busy _and_ we were at the last sector so that we increment past F_SECT_PER_TRACK.
So shouldn't that sector layout be something like the appended?
Linus --- drivers/block/floppy.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 3266b4f..9c9148c 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -2237,13 +2237,10 @@ static void setup_format_params(int track) for (count = 1; count <= F_SECT_PER_TRACK; ++count) { here[n].sect = count; n = (n + il) % F_SECT_PER_TRACK; - if (here[n].sect) { /* sector busy, find next free sector */ + while (here[n].sect) { /* sector busy, find next free sector */ ++n; - if (n >= F_SECT_PER_TRACK) { + if (n >= F_SECT_PER_TRACK) n -= F_SECT_PER_TRACK; - while (here[n].sect) - ++n; - } } } if (_floppy->stretch & FD_SECTBASEMASK) {
| ![\](/images/icornerr.gif) |