ata_piix: parallel scanning on PATA needs an extra locking
commit60c3be387bb6cd39707d3ec0ebc324a0c96181f8
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Sun, 30 Aug 2009 12:56:30 +0000 (30 14:56 +0200)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 1 Sep 2009 03:25:00 +0000 (31 17:25 -1000)
treea4a397a85a3f868f709eecf4d41f36a8ac5e75a1
parentb5af754405e8cb8b14b3f5958581ebf63c3601e9
ata_piix: parallel scanning on PATA needs an extra locking

Commit log for commit 517d3cc15b36392e518abab6bacbb72089658313
("[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>
drivers/ata/ata_piix.c