android_kernel_google_msm/drivers/ata
David Jeffery dc3aaeefea libata: prevent HSM state change race between ISR and PIO
commit ce7514526742c0898b837d4395f515b79dfb5a12 upstream.

It is possible for ata_sff_flush_pio_task() to set ap->hsm_task_state to
HSM_ST_IDLE in between the time __ata_sff_port_intr() checks for HSM_ST_IDLE
and before it calls ata_sff_hsm_move() causing ata_sff_hsm_move() to BUG().

This problem is hard to reproduce making this patch hard to verify, but this
fix will prevent the race.

I have not been able to reproduce the problem, but here is a crash dump from
a 2.6.32 kernel.

On examining the ata port's state, its hsm_task_state field has a value of HSM_ST_IDLE:

crash> struct ata_port.hsm_task_state ffff881c1121c000
  hsm_task_state = 0

Normally, this should not be possible as ata_sff_hsm_move() was called from ata_sff_host_intr(),
which checks hsm_task_state and won't call ata_sff_hsm_move() if it has a HSM_ST_IDLE value.

PID: 11053  TASK: ffff8816e846cae0  CPU: 0   COMMAND: "sshd"
 #0 [ffff88008ba03960] machine_kexec at ffffffff81038f3b
 #1 [ffff88008ba039c0] crash_kexec at ffffffff810c5d92
 #2 [ffff88008ba03a90] oops_end at ffffffff8152b510
 #3 [ffff88008ba03ac0] die at ffffffff81010e0b
 #4 [ffff88008ba03af0] do_trap at ffffffff8152ad74
 #5 [ffff88008ba03b50] do_invalid_op at ffffffff8100cf95
 #6 [ffff88008ba03bf0] invalid_op at ffffffff8100bf9b
    [exception RIP: ata_sff_hsm_move+317]
    RIP: ffffffff813a77ad  RSP: ffff88008ba03ca0  RFLAGS: 00010097
    RAX: 0000000000000000  RBX: ffff881c1121dc60  RCX: 0000000000000000
    RDX: ffff881c1121dd10  RSI: ffff881c1121dc60  RDI: ffff881c1121c000
    RBP: ffff88008ba03d00   R8: 0000000000000000   R9: 000000000000002e
    R10: 000000000001003f  R11: 000000000000009b  R12: ffff881c1121c000
    R13: 0000000000000000  R14: 0000000000000050  R15: ffff881c1121dd78
    ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0018
 #7 [ffff88008ba03d08] ata_sff_host_intr at ffffffff813a7fbd
 #8 [ffff88008ba03d38] ata_sff_interrupt at ffffffff813a821e
 #9 [ffff88008ba03d78] handle_IRQ_event at ffffffff810e6ec0
2015-04-14 17:33:54 +08:00
..
acard-ahci.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
ahci.c ahci: disable MSI on SAMSUNG 0xa800 SSD 2015-04-14 17:33:40 +08:00
ahci.h ahci: move AHCI_HFLAGS() macro to ahci.h 2012-03-13 16:35:47 -04:00
ahci_platform.c ata: ahci_platform: Add synopsys ahci controller in DT's compatible list 2012-05-03 14:08:53 -04:00
ata_generic.c ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level> 2011-07-23 17:57:36 -04:00
ata_piix.c ata_piix: Add Device IDs for Intel 9 Series PCH 2014-12-01 18:02:24 +08:00
Kconfig libata: make it clear that sata_inic162x is experimental 2013-08-04 16:25:54 +08:00
libahci.c ahci: disabled FBS prior to issuing software reset 2013-12-04 10:50:15 -08:00
libata-acpi.c Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 2011-08-02 21:17:02 -10:00
libata-core.c libata: allow sata_sil24 to opt-out of tag ordered submission 2015-04-14 17:33:54 +08:00
libata-eh.c libata: make ata_eh_qc_retry() bump scmd->allowed on bogus failures 2013-11-13 12:01:48 +09:00
libata-pmp.c ata: enable quirk from jmicron JMB350 for JMB394 2014-03-11 16:10:00 -07:00
libata-scsi.c libata: fix Null pointer dereference on disk error 2013-01-17 08:50:44 -08:00
libata-sff.c libata: prevent HSM state change race between ISR and PIO 2015-04-14 17:33:54 +08:00
libata-transport.c libata: Fix display of sata speed 2013-12-04 10:50:14 -08:00
libata-transport.h
libata.h libata: make ata_print_id atomic 2012-04-12 15:57:51 -04:00
Makefile libata: remove no longer needed pata_qdi driver 2011-10-14 13:25:24 -04:00
pata_acpi.c ata: remove unnecessary code 2011-07-23 18:07:27 -04:00
pata_ali.c pata_ali: fix "Satelite" typo 2011-10-14 13:10:42 -04:00
pata_amd.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_arasan_cf.c ata/pata_arasan_cf: Move arasan_cf_pm_ops out of #ifdef, #endif macros 2012-05-03 14:08:03 -04:00
pata_artop.c pata_artop: add Power Management support 2011-10-14 13:32:54 -04:00
pata_at32.c
pata_at91.c pata_at91: fix ata_host_activate() failure handling 2014-06-07 16:02:00 -07:00
pata_atiixp.c pata_atiixp: add proper ->prereset method 2011-10-14 13:16:49 -04:00
pata_atp867x.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_bf54x.c [libata] pata_bf54x: Support sg list in bmdma transfer. 2012-01-17 20:49:28 -05:00
pata_cmd64x.c pata_cmd64x: implement sff_irq_check() method 2012-03-13 16:43:11 -04:00
pata_cmd640.c
pata_cs5520.c ata: Convert dev_printk(KERN_<LEVEL> to dev_<level>( 2011-07-23 17:57:36 -04:00
pata_cs5530.c
pata_cs5535.c pata_cs5535: no need to program PIO0 timings during device init 2011-10-14 13:08:05 -04:00
pata_cs5536.c pata_cs5536: forward port changes from cs5536 2012-01-08 19:14:58 -05:00
pata_cypress.c
pata_efar.c pata_efar: fix register naming used in efar_set_piomode() 2011-10-14 13:38:40 -04:00
pata_hpt3x2n.c
pata_hpt3x3.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_hpt37x.c
pata_hpt366.c pata_hpt366: add hpt36x_find_mode() helper 2011-10-14 13:07:18 -04:00
pata_icside.c ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level> 2011-07-23 17:57:36 -04:00
pata_imx.c SATA/PATA: convert drivers/ata/* to use module_platform_driver() 2012-01-08 19:14:58 -05:00
pata_isapnp.c
pata_it821x.c pata_it821x: Fix RAID type display, by adding missing comma 2011-07-23 18:04:25 -04:00
pata_it8213.c pata_it8213: fix register naming used in it8213_set_piomode() 2011-10-14 13:25:17 -04:00
pata_ixp4xx_cf.c SATA/PATA: convert drivers/ata/* to use module_platform_driver() 2012-01-08 19:14:58 -05:00
pata_jmicron.c
pata_legacy.c pata_legacy: correctly mask recovery field for HT6560B 2012-03-13 12:43:13 -04:00
pata_macio.c ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level> 2011-07-23 17:57:36 -04:00
pata_marvell.c
pata_mpc52xx.c drivers/ata/pata_mpc52xx.c: clean up error handling code 2012-03-13 16:41:08 -04:00
pata_mpiix.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_netcell.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_ninja32.c
pata_ns87410.c ata: Convert dev_printk(KERN_<LEVEL> to dev_<level>( 2011-07-23 17:57:36 -04:00
pata_ns87415.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_octeon_cf.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_of_platform.c pata_of_platform: remove direct dependency on OF_IRQ 2012-01-08 19:14:58 -05:00
pata_oldpiix.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_opti.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_optidma.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_palmld.c SATA/PATA: convert drivers/ata/* to use module_platform_driver() 2012-01-08 19:14:58 -05:00
pata_pcmcia.c ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level> 2011-07-23 17:57:36 -04:00
pata_pdc202xx_old.c
pata_pdc2027x.c pata_pdc2027x: add Power Management support 2011-10-14 13:32:52 -04:00
pata_piccolo.c
pata_platform.c SATA/PATA: convert drivers/ata/* to use module_platform_driver() 2012-01-08 19:14:58 -05:00
pata_pxa.c SATA/PATA: convert drivers/ata/* to use module_platform_driver() 2012-01-08 19:14:58 -05:00
pata_radisys.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_rb532_cf.c SATA/PATA: convert drivers/ata/* to use module_platform_driver() 2012-01-08 19:14:58 -05:00
pata_rdc.c pata_rdc: add Power Management support 2011-10-14 13:38:36 -04:00
pata_rz1000.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_samsung_cf.c ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level> 2011-07-23 17:57:36 -04:00
pata_sc1200.c pata_sc1200: do not use c99 style comments 2011-10-14 13:01:42 -04:00
pata_scc.c pata_scc: propagate return value of scc_wait_after_reset 2014-09-25 11:49:11 +08:00
pata_sch.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_serverworks.c pata_serverworks: disable 64-KB DMA transfers on Broadcom OSB4 IDE Controller 2015-02-02 17:04:47 +08:00
pata_sil680.c pata_sil680: minor CodingStyle fixups 2011-10-14 12:46:45 -04:00
pata_sis.c pata_sis: code style cleanups for consistency 2011-10-08 00:07:16 -04:00
pata_sl82c105.c pata_sl82c105: add Power Management support 2011-10-14 13:32:53 -04:00
pata_triflex.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
pata_via.c pata_via: add via_fixup() 2011-10-14 13:22:54 -04:00
pdc_adma.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
sata_dwc_460ex.c sata_dwc_460ex: fix resource leak on error path 2015-04-14 17:33:50 +08:00
sata_fsl.c sata_fsl: fix error handling of irq_of_parse_and_map 2015-04-14 17:33:39 +08:00
sata_inic162x.c libata: make it clear that sata_inic162x is experimental 2013-08-04 16:25:54 +08:00
sata_mv.c sata_mv: silence an uninitialized variable warning 2012-04-12 15:57:22 -04:00
sata_nv.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
sata_promise.c sata_promise: fix hardreset lockdep error 2013-01-17 08:50:44 -08:00
sata_promise.h
sata_qstor.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
sata_sil.c sata_sil: apply MOD15WRITE quirk to TOSHIBA MK2561GSYN 2014-03-11 16:10:00 -07:00
sata_sil24.c libata: allow sata_sil24 to opt-out of tag ordered submission 2015-04-14 17:33:54 +08:00
sata_sis.c sata_sis.c: trivial spelling fix 2011-11-09 01:36:49 -05:00
sata_svw.c sata_svw: check DMA start bit before reset 2012-12-03 11:47:11 -08:00
sata_sx4.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
sata_uli.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
sata_via.c ata: sata_via: Use dev_dbg 2011-07-23 17:57:36 -04:00
sata_vsc.c ata: Add and use ata_print_version_once 2011-07-23 17:57:36 -04:00
sis.h