linux-stable/drivers
Bartlomiej Zolnierkiewicz 60c3be387b ata_piix: parallel scanning on PATA needs an extra locking
Commit log for commit 517d3cc15b
("[libata] ata_piix: Enable parallel scan") says:

    This patch turns on parallel scanning for the ata_piix driver.
    This driver is used on most netbooks (no AHCI for cheap storage it seems).
    The scan is the dominating time factor in the kernel boot for these
    devices; with this flag it gets cut in half for the device I used
    for testing (eeepc).
    Alan took a look at the driver source and concluded that it ought to be safe
    to do for this driver.  Alan has also checked with the hardware team.

and it is all true but once we put all things together additional
constraints for PATA controllers show up (some hardware registers
have per-host not per-port atomicity) and we risk misprogramming
the controller.

I used the following test to check whether the issue is real:

  @@ -736,8 +736,20 @@ static void piix_set_piomode(struct ata_
   			(timings[pio][1] << 8);
   	}
   	pci_write_config_word(dev, master_port, master_data);
  -	if (is_slave)
  +	if (is_slave) {
  +		if (ap->port_no == 0) {
  +			u8 tmp = slave_data;
  +
  +			while (slave_data == tmp) {
  +				pci_read_config_byte(dev, slave_port, &tmp);
  +				msleep(50);
  +			}
  +
  +			dev_printk(KERN_ERR, &dev->dev, "PATA parallel scan "
  +				   "race detected\n");
  +		}
   		pci_write_config_byte(dev, slave_port, slave_data);
  +	}

   	/* Ensure the UDMA bit is off - it will be turned back on if
   	   UDMA is selected */

and it indeed triggered the error message.

Lets fix all such races by adding an extra locking to ->set_piomode
and ->set_dmamode methods for PATA controllers.

[ Alan: would be better to take the host lock in libata-core for these
  cases so that we fix all the adapters in one swoop.  "Looks fine as a
  temproary quickfix tho" ]

Cc: Arjan van de Ven <arjan@linux.intel.com>
Acked-by: Alan Cox <alan@linux.intel.com>
Cc: Jeff Garzik <jgarzik@redhat.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2009-08-31 17:25:00 -10:00
..
accessibility
acpi ACPI: don't free non-existent backlight in acpi video module 2009-08-28 15:17:07 -04:00
amba
ata ata_piix: parallel scanning on PATA needs an extra locking 2009-08-31 17:25:00 -10:00
atm
auxdisplay
base PM / Driver Core: Kill dev_pm_ops platform warning for now 2009-08-10 23:41:18 +02:00
block
bluetooth
cdrom
char tty: make sure to flush any pending work when halting the ldisc 2009-08-25 09:12:43 -07:00
clocksource sh: CMT suspend/resume 2009-08-15 12:58:45 +09:00
connector
cpufreq [CPUFREQ] Make cpufreq suspend code conditional on powerpc. 2009-08-04 14:32:11 -04:00
cpuidle
crypto
dca
dio
dma Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx 2009-07-30 16:46:31 -07:00
edac amd64_edac: print debug statements only on error 2009-08-04 12:10:06 +02:00
eisa
firewire
firmware
gpio
gpu Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel 2009-08-31 17:22:10 -10:00
hid
hwmon
i2c i2c-stu300: I2C STU300 stability updates 2009-08-20 22:27:58 +01:00
ide
idle
ieee1394
ieee802154
infiniband
input Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input 2009-08-24 12:25:27 -07:00
isdn Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 2009-08-04 15:38:34 -07:00
leds leds: after setting inverted attribute, we must update the LED 2009-08-26 20:06:53 -07:00
lguest lguest and virtio: cleanup struct definitions to Linux style. 2009-07-30 16:03:46 +09:30
macintosh m68k: count can reach 51, not 50 2009-08-26 23:14:49 +02:00
mca
md Merge branch 'for-linus' of git://neil.brown.name/md 2009-08-18 13:54:08 -07:00
media V4L/DVB (12441): siano: read buffer overflow 2009-08-13 20:39:14 -03:00
memstick
message
mfd mfd: twl4030 irq fixes 2009-08-04 20:31:32 +02:00
misc cb710: use SG_MITER_TO_SG/SG_MITER_FROM_SG 2009-07-31 12:28:46 +02:00
mmc drivers/mmc: correct error-handling code 2009-08-07 10:39:56 -07:00
mtd [ARM] Orion NAND: Make asm volatile avoid GCC pushing ldrd out of the loop 2009-08-24 11:56:00 -04:00
net virtio: net refill on out-of-memory 2009-08-26 12:22:32 -07:00
nubus
of
oprofile
parisc parisc: hppb.c - fix printk format strings 2009-08-02 15:42:39 +02:00
parport
pci PCI: check saved state before restore 2009-08-20 09:08:45 -07:00
pcmcia
platform toshiba_acpi: return on a fail path 2009-08-28 15:17:07 -04:00
pnp
power Merge git://git.infradead.org/users/cbou/battery-2.6.31 2009-07-30 16:45:53 -07:00
pps pps: fix incorrect verdict check 2009-08-26 20:06:52 -07:00
ps3
rapidio
regulator
rtc rtc: mark if rtc-cmos drivers were successfully registered 2009-07-29 19:10:35 -07:00
s390 [S390] drivers/s390: put NULL test before dereference 2009-08-23 18:10:00 +02:00
sbus
scsi [SCSI] mpt2sas: fix config request and diag reset deadlock 2009-08-14 09:16:05 -05:00
serial ARM: S3C64XX: serial: Fix a typo in Kconfig 2009-08-14 00:43:46 +01:00
sh
sn
spi spi_s3c24xx: fix transfer setup code 2009-08-18 16:31:13 -07:00
ssb
staging Staging: rspiusb: Fix buffer overflow 2009-08-07 16:12:03 -07:00
tc
telephony
thermal thermal_sys: check get_temp return value 2009-08-26 20:06:52 -07:00
uio
usb USB: fix oops on disconnect in cdc-acm 2009-08-07 16:05:14 -07:00
uwb
video xenfb: connect to backend before registering fb 2009-08-27 12:31:18 -07:00
virtio virtio: refactor find_vqs 2009-07-30 16:03:45 +09:30
vlynq
w1 drivers/w1/masters/omap_hdq.c: fix missing mutex unlock 2009-08-07 10:39:55 -07:00
watchdog [WATCHDOG] ar7_wdt: fix path to ar7-specific headers 2009-08-15 13:05:01 +00:00
xen
zorro
Kconfig
Makefile