From: Linus Torvalds Date: Sat, 3 Jan 2004 10:25:13 +0000 (-0800) Subject: Fix IDE "PIO WRITE wait for ready" test under extreme interrupt load. X-Git-Tag: v2.6.1-rc2~2^2~2^2 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=11f963511c5a94c5969fdbb5e6f4da2190592d6f;p=history.git Fix IDE "PIO WRITE wait for ready" test under extreme interrupt load. From Daniel Tram Lux: under extreme irq load on an underpowered CPU, the timeout loop may not make any progress, and decide that a timeout occurred before it has actually tested the status register. The minimal fix for now is to just have a final test _after_ the timeout to remove the problem. The real fix would likely be to not have irqs enabled between reading the status and the timeout. --- diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 06d6292cf70f..a239bbaf5074 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -647,6 +647,15 @@ int ide_wait_stat (ide_startstop_t *startstop, ide_drive_t *drive, u8 good, u8 b timeout += jiffies; while ((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) { if (time_after(jiffies, timeout)) { + /* + * One last read after the timeout in case + * heavy interrupt load made us not make any + * progress during the timeout.. + */ + stat = hwif->INB(IDE_STATUS_REG); + if (!(stat & BUSY_STAT)) + break; + local_irq_restore(flags); *startstop = DRIVER(drive)->error(drive, "status timeout", stat); return 1;