linux/drivers/scsi
Webb Scales 25163bd516 hpsa: rework controller command submission
Allow driver initiated commands to have a timeout.  It does not
yet try to do anything with timeouts on such commands.

We are sending a reset in order to get rid of a command we want to abort.
If we make it return on the same reply queue as the command we want to abort,
the completion of the aborted command will not race with the completion of
the reset command.

Rename hpsa_scsi_do_simple_cmd_core() to hpsa_scsi_do_simple_cmd(), since
this function is the interface for issuing commands to the controller and
not the "core" of that implementation.  Add a parameter to it which allows
the caller to specify the reply queue to be used.  Modify existing callers
to specify the default reply queue.

Rename __hpsa_scsi_do_simple_cmd_core() to hpsa_scsi_do_simple_cmd_core(),
since this routine is the "core" implementation of the "do simple command"
function and there is no longer any other function with a similar name.
Modify the existing callers of this routine (other than
hpsa_scsi_do_simple_cmd()) to instead call hpsa_scsi_do_simple_cmd(), since
it will now accept the reply_queue paramenter, and it provides a controller
lock-up check.  (Also, tweak two related message strings to make them
distinct from each other.)

Submitting a command to a locked up controller always results in a timeout,
so check for controller lock-up before submitting.

This is to enable fixing a race between command completions and
abort completions on different reply queues in a subsequent patch.
We want to be able to specify which reply queue an abort completion
should occur on so that it cannot race the completion of the command
it is trying to abort.

The following race was possible in theory:

  1. Abort command is sent to hardware.
  2. Command to be aborted simultaneously completes on another
     reply queue.
  3. Hardware receives abort command, decides command has already
     completed and indicates this to the driver via another different
     reply queue.
  4. driver processes abort completion finds that the hardware does not know
     about the command, concludes that therefore the command cannot complete,
     returns SUCCESS indicating to the mid-layer that the scsi_cmnd may be
     re-used.
  5. Command from step 2 is processed and completed back to scsi mid
     layer (after we already promised that would never happen.)

Fix by forcing aborts to complete on the same reply queue as the command
they are aborting.

Piggybacking device rescanning functionality onto the lockup
detection thread is not a good idea because if the controller
locks up during device rescanning, then the thread could get
stuck, then the lockup isn't detected.  Use separate work
queues for device rescanning and lockup detection.

Detect controller lockup in abort handler.

After a lockup is detected, return DO_NO_CONNECT which results in immediate
termination of commands rather than DID_ERR which results in retries.

Modify detect_controller_lockup() to return the result, to remove the need for
a separate check.

Reviewed-by: Scott Teel <scott.teel@pmcs.com>
Reviewed-by: Kevin Barnett <kevin.barnett@pmcs.com>
Signed-off-by: Webb Scales <webbnh@hp.com>
Signed-off-by: Don Brace <don.brace@pmcs.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
2015-05-31 11:22:04 -07:00
..
aacraid aacraid: aac_src_intr_message() can be static 2015-05-25 08:46:25 -07:00
aic7xxx aic7xxx: replace kmalloc/memset by kzalloc 2015-04-09 13:22:10 -07:00
aic94xx Merge remote-tracking branch 'scsi-queue/drivers-for-3.19' into for-linus 2014-12-18 05:56:29 -08:00
arcmsr scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
arm scsi: replace seq_printf with seq_puts 2015-02-02 09:57:45 -08:00
be2iscsi be2iscsi : Bump the driver version 2015-05-25 08:57:53 -07:00
bfa bfs: bfad_worker cleanup 2015-04-17 09:04:09 -04:00
bnx2fc Merge remote-tracking branch 'scsi-queue/drivers-for-3.19' into for-linus 2014-12-18 05:56:29 -08:00
bnx2i scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
csiostor csiostor: fix an error code in csio_hw_init() 2015-05-25 08:46:26 -07:00
cxgbi cxgb4i: set the initial sequence number 2015-05-25 08:46:25 -07:00
device_handler scsi: fix device handler detach oops 2015-02-02 13:45:28 +01:00
dpt
esas2r SCSI misc on 20150209 2015-02-11 10:28:45 -08:00
fcoe Merge remote-tracking branch 'scsi-queue/drivers-for-3.19' into for-linus 2014-12-18 05:56:29 -08:00
fnic fnic: IOMMU Fault occurs when IO and abort IO is out of order 2014-12-30 13:31:45 +01:00
ibmvscsi ibmvfc: remove unused tag variable 2014-12-04 09:58:33 +01:00
isci Merge remote-tracking branch 'scsi-queue/drivers-for-3.19' into for-linus 2014-12-18 05:56:29 -08:00
libfc scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
libsas Merge branch 'for-4.0-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2015-03-24 17:08:29 -07:00
lpfc lpfc: Fix breakage on big endian kernels 2015-05-11 09:53:03 -07:00
megaraid megaraid_sas : swap whole register in megasas_register_aen 2015-05-25 08:46:31 -07:00
mpt2sas mpt2sas: Bump driver version to 20.100.00.00 2015-01-13 16:27:29 +01:00
mpt3sas mpt2sas, mpt3sas: set cpu affinity for each MSIX vectors 2015-01-13 16:27:28 +01:00
mvsas mvsas: fix panic on expander attached SATA devices 2015-04-17 10:19:07 -07:00
osd Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2015-04-14 09:50:27 -07:00
pcmcia scsi: print single-character strings with seq_putc 2015-02-02 09:57:46 -08:00
pm8001 Merge remote-tracking branch 'scsi-queue/drivers-for-3.19' into for-linus 2014-12-18 05:56:29 -08:00
qla2xxx Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending 2015-04-24 10:22:09 -07:00
qla4xxx scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
sym53c8xx_2 scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
ufs ufs-qcom: Switch dependency to ARCH_QCOM 2015-05-25 08:46:26 -07:00
.gitignore
3w-9xxx.c 3w-9xxx: fix command completion race 2015-04-27 10:10:19 -07:00
3w-9xxx.h 3w-9xxx: fix command completion race 2015-04-27 10:10:19 -07:00
3w-sas.c 3w-sas: fix command completion race 2015-04-27 10:04:39 -07:00
3w-sas.h 3w-sas: fix command completion race 2015-04-27 10:04:39 -07:00
3w-xxxx.c 3w-xxxx: fix command completion race 2015-04-27 10:05:55 -07:00
3w-xxxx.h 3w-xxxx: fix command completion race 2015-04-27 10:05:55 -07:00
53c700_d.h_shipped
53c700.c scsi: remove scsi_set_tag_type 2014-12-04 09:57:13 +01:00
53c700.h
53c700.scr
a100u2w.c scsi: use pci_zalloc_consistent 2014-08-08 15:57:29 -07:00
a100u2w.h
a2091.c zorro: ZTWO_VADDR() should return "void __iomem *" 2013-11-26 11:09:07 +01:00
a2091.h
a3000.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
a3000.h
a4000t.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
advansys.c advansys: Update to version 3.5 and remove compilation warning 2015-05-25 23:01:34 -07:00
aha152x.c aha152x: replace seq_printf with seq_puts 2015-02-02 09:57:45 -08:00
aha152x.h
aha1542.c aha1542: Allocate memory before taking a lock 2015-04-27 10:00:30 -07:00
aha1542.h aha1542: fix include guard and remove useless changelog 2015-04-09 18:08:31 -07:00
aha1740.c scsi: correct return values for .eh_abort_handler implementations 2014-11-12 11:16:08 +01:00
aha1740.h
am53c974.c am53c974: Fix crash during modprobe 2015-04-17 10:13:56 -07:00
atari_NCR5380.c ncr5380: Harmonize jiffies conversion with msecs_to_jiffies 2015-03-09 10:45:26 -04:00
atari_scsi.c ncr5380: Drop owner assignment from platform_drivers 2015-03-09 07:18:14 -04:00
atp870u.c scsi: merge consecutive seq_puts calls 2015-02-02 09:57:45 -08:00
atp870u.h
BusLogic.c scsi: replace seq_printf with seq_puts 2015-02-02 09:57:45 -08:00
BusLogic.h [SCSI] BusLogic: Port driver to 64-bit. 2013-06-26 18:32:47 -07:00
bvme6000_scsi.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
ch.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2015-04-14 09:50:27 -07:00
constants.c scsi: Conditionally compile in constants.c 2015-01-09 15:44:31 +01:00
dc395x.c scsi: print single-character strings with seq_putc 2015-02-02 09:57:46 -08:00
dc395x.h
dmx3191d.c dmx3191d: Use NO_IRQ 2014-11-20 09:11:11 +01:00
dpt_i2o.c scsi: replace seq_printf with seq_puts 2015-02-02 09:57:45 -08:00
dpti.h scsi: use 64-bit LUNs 2014-07-17 22:07:37 +02:00
dtc.c ncr5380: Drop legacy scsi.h include 2014-11-20 09:11:10 +01:00
dtc.h ncr5380: Remove *_RELEASE macros 2014-11-20 09:11:10 +01:00
eata_generic.h
eata_pio.c scsi: replace seq_printf with seq_puts 2015-02-02 09:57:45 -08:00
eata_pio.h
eata.c scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
esp_scsi.c esp_scsi: remove check for ESP_MAX_TAGS 2015-01-09 15:44:23 +01:00
esp_scsi.h esp_scsi: correctly detect am53c974 2014-11-24 16:13:16 +01:00
fdomain.c
fdomain.h
FlashPoint.c [SCSI] BusLogic: Port driver to 64-bit. 2013-06-26 18:32:47 -07:00
g_NCR5380_mmio.c
g_NCR5380.c ncr5380: Harmonize jiffies conversion with msecs_to_jiffies 2015-03-09 10:45:26 -04:00
g_NCR5380.h ncr5380: Remove *_RELEASE macros 2014-11-20 09:11:10 +01:00
gdth_ioctl.h
gdth_proc.c scsi: replace seq_printf with seq_puts 2015-02-02 09:57:45 -08:00
gdth_proc.h
gdth.c scsi: rename SERVICE_ACTION_IN to SERVICE_ACTION_IN_16 2014-11-24 20:01:40 +01:00
gdth.h
gvp11.c zorro: ZTWO_VADDR() should return "void __iomem *" 2013-11-26 11:09:07 +01:00
gvp11.h
hosts.c scsi: remove ordered_tag host template field 2014-11-12 11:19:41 +01:00
hpsa_cmd.h hpsa: rework controller command submission 2015-05-31 11:22:04 -07:00
hpsa.c hpsa: rework controller command submission 2015-05-31 11:22:04 -07:00
hpsa.h hpsa: add masked physical devices into h->dev[] array 2015-05-31 11:20:24 -07:00
hptiop.c scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
hptiop.h
imm.c
imm.h
in2000.c scsi: print single-character strings with seq_putc 2015-02-02 09:57:46 -08:00
in2000.h
initio.c [SCSI] remove deprecated IRQF_DISABLED from SCSI 2014-03-19 15:04:44 -07:00
initio.h
ipr.c SCSI misc on 20150416 2015-04-16 19:02:04 -04:00
ipr.h ipr: Driver version 2.6.1 2015-04-09 14:19:23 -07:00
ips.c scsi: print single-character strings with seq_putc 2015-02-02 09:57:46 -08:00
ips.h
iscsi_boot_sysfs.c [SCSI] iscsi_boot_sysfs: Fix a memory leak in iscsi_boot_destroy_kset() 2014-03-15 10:19:19 -07:00
iscsi_tcp.c scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
iscsi_tcp.h net: Fix use after free by removing length arg from sk_data_ready callbacks. 2014-04-11 16:15:36 -04:00
jazz_esp.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
Kconfig advansys: Update to version 3.5 and remove compilation warning 2015-05-25 23:01:34 -07:00
lasi700.c
libiscsi_tcp.c [SCSI] libiscsi: Reduce locking contention in fast path 2014-03-15 10:19:18 -07:00
libiscsi.c scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
mac53c94.c powerpc: Move Power Macintosh drivers to generic byteswappers 2015-03-23 14:29:40 +11:00
mac53c94.h
mac_esp.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
mac_scsi.c ncr5380: Drop owner assignment from platform_drivers 2015-03-09 07:18:14 -04:00
Makefile scsi: Conditionally compile in constants.c 2015-01-09 15:44:31 +01:00
megaraid.c scsi: replace seq_printf with seq_puts 2015-02-02 09:57:45 -08:00
megaraid.h [SCSI] megaraid: simplify internal command handling 2014-03-27 08:26:31 -07:00
mesh.c powerpc: Move Power Macintosh drivers to generic byteswappers 2015-03-23 14:29:40 +11:00
mesh.h
mvme16x_scsi.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
mvme147.c
mvme147.h
mvumi.c PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
mvumi.h
ncr53c8xx.c scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
ncr53c8xx.h scsi: Remove CONFIG_SCSI_MULTI_LUN 2014-07-17 22:07:35 +02:00
NCR53c406a.c NCR53c406a: don't call free_dma() by default 2014-07-25 17:16:56 -04:00
NCR5380.c ncr5380: Harmonize jiffies conversion with msecs_to_jiffies 2015-03-09 10:45:26 -04:00
NCR5380.h atari_NCR5380: Move static co-routine variables to host data 2014-11-20 09:11:20 +01:00
NCR_D700.c
NCR_D700.h
NCR_Q720.c
NCR_Q720.h
nsp32_debug.c
nsp32_io.h
nsp32.c scsi: print single-character strings with seq_putc 2015-02-02 09:57:46 -08:00
nsp32.h
osst_detect.h
osst_options.h
osst.c scsi: remove scsi_driver owner field 2014-11-24 20:01:28 +01:00
osst.h
pas16.c ncr5380: Drop legacy scsi.h include 2014-11-20 09:11:10 +01:00
pas16.h ncr5380: Remove *_RELEASE macros 2014-11-20 09:11:10 +01:00
pmcraid.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2015-02-10 20:01:30 -08:00
pmcraid.h
ppa.c
ppa.h
ps3rom.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2014-12-12 10:08:06 -08:00
qla1280.c scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
qla1280.h
qlogicfas408.c
qlogicfas408.h
qlogicfas.c qlogicfas: don't call free_dma() 2014-07-25 17:16:55 -04:00
qlogicpti.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
qlogicpti.h
raid_class.c
script_asm.pl
scsi_debug.c scsi: use %*pb[l] to print bitmaps including cpumasks and nodemasks 2015-02-13 21:21:38 -08:00
scsi_devinfo.c SCSI: add 1024 max sectors black list flag 2015-04-27 09:38:06 -07:00
scsi_error.c libata-eh: Set 'information' field for autosense 2015-03-27 11:59:22 -04:00
scsi_ioctl.c scsi: return EAGAIN when resetting a device under EH 2014-11-12 11:16:12 +01:00
scsi_lib_dma.c
scsi_lib.c Defer processing of REQ_PREEMPT requests for blocked devices 2015-04-08 09:41:41 -07:00
scsi_logging.c scsi_logging: return void for dev_printk() functions 2015-02-04 08:00:24 -08:00
scsi_logging.h scsi: simplify scsi_log_(send|completion) 2014-11-12 11:16:05 +01:00
scsi_module.c
scsi_netlink.c net: Use netlink_ns_capable to verify the permisions of netlink messages 2014-04-24 13:44:54 -04:00
scsi_pm.c SCSI / PM: Replace CONFIG_PM_RUNTIME with CONFIG_PM 2014-12-15 15:11:06 +01:00
scsi_priv.h SCSI / PM: Replace CONFIG_PM_RUNTIME with CONFIG_PM 2014-12-15 15:11:06 +01:00
scsi_proc.c scsi: print single-character strings with seq_putc 2015-02-02 09:57:46 -08:00
scsi_sas_internal.h
scsi_scan.c scsi_scan: fix queue depth initialisation problem 2015-05-25 08:46:24 -07:00
scsi_sysctl.c scsi: convert use of typedef ctl_table to struct ctl_table 2014-06-06 16:08:16 -07:00
scsi_sysfs.c scsi: remove ->change_queue_type method 2014-12-04 09:55:45 +01:00
scsi_trace.c scsi: print single-character strings with seq_putc 2015-02-02 09:57:46 -08:00
scsi_transport_api.h
scsi_transport_fc.c scsi_transport_fc: Add support for 25Gbit speed 2015-04-10 07:40:32 -07:00
scsi_transport_iscsi.c iscsi class: Fix freeing of skb in get host error path 2014-08-04 13:16:14 +02:00
scsi_transport_sas.c scsi: use 64-bit LUNs 2014-07-17 22:07:37 +02:00
scsi_transport_spi.c scsi: remove MSG_*_TAG defines 2014-12-04 09:58:33 +01:00
scsi_transport_srp.c Main set of InfiniBand/RDMA updates for 3.17 merge window: 2014-08-14 11:09:05 -06:00
scsi_typedefs.h
scsi.c scsi: proper state checking and module refcount handling in scsi_device_get 2015-03-19 06:43:15 -07:00
scsi.h
scsicam.c scsi: PC partition tables are little endian 2014-11-12 11:15:54 +01:00
sd_dif.c sd: Fix missing ATO tag check 2015-04-16 10:37:12 -07:00
sd.c sd: fix an error return in probe() 2015-05-25 08:46:24 -07:00
sd.h scsi: introduce sdev_prefix_printk() 2014-11-12 11:15:57 +01:00
ses.c ses: Add power_status to SES device slot 2015-01-09 15:44:19 +01:00
sg.c sg_start_req(): use import_iovec() 2015-04-11 22:27:14 -04:00
sgiwd93.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
sim710.c
sni_53c710.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
sr_ioctl.c sr: reduce debug noise in sr_do_ioctl 2015-01-20 19:43:24 +01:00
sr_vendor.c scsi: Implement sr_printk() 2014-07-17 22:07:39 +02:00
sr.c scsi: remove scsi_driver owner field 2014-11-24 20:01:28 +01:00
sr.h scsi: introduce sdev_prefix_printk() 2014-11-12 11:15:57 +01:00
st_options.h
st.c mm: gup: use get_user_pages_unlocked 2015-02-11 17:06:05 -08:00
st.h
stex.c scsi: don't force tagged_supported in drivers 2014-11-12 11:19:44 +01:00
storvsc_drv.c storvsc: Set the SRB flags correctly when no data transfer is needed 2015-05-11 09:46:41 -07:00
sun3_scsi_vme.c scsi/NCR5380: merge sun3_scsi_vme.c into sun3_scsi.c 2014-05-28 12:16:28 +02:00
sun3_scsi.c ncr5380: Drop owner assignment from platform_drivers 2015-03-09 07:18:14 -04:00
sun3_scsi.h sun3_scsi: Move macro definitions 2014-11-20 09:11:15 +01:00
sun3x_esp.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
sun_esp.c scsi: drop owner assignment from platform_drivers 2014-10-20 16:21:33 +02:00
sym53c416.c
sym53c416.h
t128.c ncr5380: Drop legacy scsi.h include 2014-11-20 09:11:10 +01:00
t128.h ncr5380: Remove *_RELEASE macros 2014-11-20 09:11:10 +01:00
u14-34f.c scsi: drop reason argument from ->change_queue_depth 2014-11-24 14:45:27 +01:00
ultrastor.c
ultrastor.h
virtio_scsi.c virtio_scsi: don't select CONFIG_BLK_DEV_INTEGRITY 2015-05-25 09:14:47 -07:00
vmw_pvscsi.c vmw_pscsi: simplify ->change_queue_depth 2014-11-24 14:45:28 +01:00
vmw_pvscsi.h PCI: Move PCI_VENDOR_ID_VMWARE to pci_ids.h 2014-09-24 11:52:09 -06:00
wd33c93.c scsi: print single-character strings with seq_putc 2015-02-02 09:57:46 -08:00
wd33c93.h
wd719x.c wd719x: add missing .module to wd719x_template 2015-02-15 10:34:39 -08:00
wd719x.h wd719x: Introduce Western Digital WD7193/7197/7296 PCI SCSI card driver 2014-11-25 15:42:54 +01:00
wd7000.c scsi: replace seq_printf with seq_puts 2015-02-02 09:57:45 -08:00
xen-scsifront.c xenbus_client: Extend interface to support multi-page ring 2015-04-15 10:56:47 +01:00
zalon.c
zorro7xx.c zorro: ZTWO_VADDR() should return "void __iomem *" 2013-11-26 11:09:07 +01:00