linux-uconsole/drivers/scsi
Ming Lei 410306a0f2 SCSI: fix queue cleanup race before queue initialization is done
commit 8dc765d438 upstream.

c2856ae2f3 ("blk-mq: quiesce queue before freeing queue") has
already fixed this race, however the implied synchronize_rcu()
in blk_mq_quiesce_queue() can slow down LUN probe a lot, so caused
performance regression.

Then 1311326cf4 ("blk-mq: avoid to synchronize rcu inside blk_cleanup_queue()")
tried to quiesce queue for avoiding unnecessary synchronize_rcu()
only when queue initialization is done, because it is usual to see
lots of inexistent LUNs which need to be probed.

However, turns out it isn't safe to quiesce queue only when queue
initialization is done. Because when one SCSI command is completed,
the user of sending command can be waken up immediately, then the
scsi device may be removed, meantime the run queue in scsi_end_request()
is still in-progress, so kernel panic can be caused.

In Red Hat QE lab, there are several reports about this kind of kernel
panic triggered during kernel booting.

This patch tries to address the issue by grabing one queue usage
counter during freeing one request and the following run queue.

Fixes: 1311326cf4 ("blk-mq: avoid to synchronize rcu inside blk_cleanup_queue()")
Cc: Andrew Jones <drjones@redhat.com>
Cc: Bart Van Assche <bart.vanassche@wdc.com>
Cc: linux-scsi@vger.kernel.org
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: James E.J. Bottomley <jejb@linux.vnet.ibm.com>
Cc: stable <stable@vger.kernel.org>
Cc: jianchao.wang <jianchao.w.wang@oracle.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-11-21 09:19:18 +01:00
..
aacraid scsi: aacraid: fix a signedness bug 2018-08-27 13:17:00 -04:00
aic7xxx SCSI fixes on 20180613 2018-06-14 16:35:32 +09:00
aic94xx scsi: aic94xx: fix an error code in aic94xx_init() 2018-08-08 21:17:56 -04:00
arcmsr scsi: arcmsr: Update driver version to v1.40.00.09-20180709 2018-07-12 22:34:59 -04:00
arm treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
be2iscsi scsi: be2iscsi: Update copyright 2018-06-19 22:02:25 -04:00
bfa scsi: bfa: remove ScsiResult macro 2018-07-10 22:42:47 -04:00
bnx2fc treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
bnx2i scsi: bnx2i: add error handling for ioremap_nocache 2018-06-19 22:02:25 -04:00
csiostor scsi: csiostor: fix incorrect port capabilities 2018-08-27 12:26:10 -04:00
cxgbi scsi: cxgb4i: silence overflow warning in t4_uld_rx_handler() 2018-04-09 21:32:45 -04:00
cxlflash SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
device_handler Merge branch 'fixes' into misc 2018-04-03 17:38:39 -07:00
dpt
esas2r treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
fcoe SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
fnic treewide: Use array_size() in vmalloc() 2018-06-12 16:19:22 -07:00
hisi_sas scsi: hisi_sas: Add SATA FIS check for v3 hw 2018-07-19 21:57:40 -04:00
ibmvscsi scsi: ibmvscsi: change strncpy+truncation to strlcpy 2018-07-30 23:17:53 -04:00
ibmvscsi_tgt scsi: ibmvscsis: Ensure partition name is properly NUL terminated 2018-09-17 02:50:37 -04:00
isci treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
libfc SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
libsas scsi: read host_busy via scsi_host_busy() 2018-06-26 12:53:26 -04:00
lpfc scsi: lpfc: Correct race with abort on completion path 2018-11-13 11:08:37 -08:00
megaraid scsi: megaraid_sas: fix a missing-check bug 2018-11-13 11:08:32 -08:00
mpt3sas SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
mvsas scsi: mvsas: fix wrong endianness of sgpio api 2018-03-01 21:07:48 -05:00
osd osd: Convert to new IDA API 2018-08-21 23:54:17 -04:00
pcmcia scsi: remove the fdomain and fdomain_cs drivers 2018-03-19 22:54:47 -04:00
pm8001 treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
qedf scsi: qedf: Send the driver state to MFW 2018-07-10 22:25:23 -04:00
qedi scsi: qedi: Initialize the stats mutex lock 2018-09-28 02:28:05 -04:00
qla2xxx scsi: qla2xxx: Initialize port speed to avoid setting lower speed 2018-11-21 09:19:17 +01:00
qla4xxx treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
smartpqi scsi: smartpqi: bump driver version to 1.1.4-130 2018-06-19 22:02:25 -04:00
snic scsi: snic: fix printing time intervals 2018-07-12 23:01:16 -04:00
sym53c8xx_2 scsi: sym53c8xx: remove some redundant variables 2018-08-02 16:23:26 -04:00
ufs scsi: ufs: Schedule clk gating work on correct queue 2018-11-13 11:08:32 -08:00
.gitignore scsi: scsi_devinfo: Add scsi_devinfo_tbl.c 2017-10-25 05:40:22 -04:00
3w-9xxx.c scsi: 3ware: fix return 0 on the error path of probe 2018-07-30 23:17:53 -04:00
3w-9xxx.h scsi: 3w-9xxx: rework lock timeouts 2017-12-04 20:32:53 -05:00
3w-sas.c scsi: 3ware: fix return 0 on the error path of probe 2018-07-30 23:17:53 -04:00
3w-sas.h
3w-xxxx.c scsi: 3ware: fix return 0 on the error path of probe 2018-07-30 23:17:53 -04:00
3w-xxxx.h
53c700.c scsi: 53c700: move bus reset to host reset 2017-08-25 17:21:11 -04:00
53c700.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
53c700.scr
53c700_d.h_shipped
a100u2w.c scsi: a100u2w: Replace mdelay() with msleep() 2018-07-30 23:17:53 -04:00
a100u2w.h
a2091.c scsi: drop bus reset for wd33c93-compatible boards 2017-08-25 17:21:10 -04:00
a2091.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
a3000.c scsi: drop bus reset for wd33c93-compatible boards 2017-08-25 17:21:10 -04:00
a3000.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
a4000t.c
advansys.c scsi: read host_busy via scsi_host_busy() 2018-06-26 12:53:26 -04:00
aha152x.c scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
aha152x.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
aha1542.c treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
aha1542.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
aha1740.c scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
aha1740.h scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
am53c974.c scsi: am53c974: Use module_pci_driver 2018-05-01 23:29:41 -04:00
atari_scsi.c scsi: NCR5380: Move bus reset to host reset 2017-08-25 17:21:11 -04:00
atp870u.c scsi: atp870u: Replace mdelay() with msleep() 2018-07-30 23:17:53 -04:00
atp870u.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
BusLogic.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
BusLogic.h
bvme6000_scsi.c
ch.c scsi: core: check for equality of result byte values 2018-06-26 12:27:06 -04:00
constants.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
dc395x.c scsi: core: check for equality of result byte values 2018-06-26 12:27:06 -04:00
dc395x.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
dmx3191d.c scsi: NCR5380: Move bus reset to host reset 2017-08-25 17:21:11 -04:00
dpt_i2o.c scsi: dpt_i2o: Remove VLA usage 2018-05-18 12:03:51 -04:00
dpti.h scsi: dpt_i2o: stop using scsi_unregister 2018-03-15 00:25:37 -04:00
esp_scsi.c scsi: esp_scsi: Track residual for PIO transfers 2018-11-13 11:08:32 -08:00
esp_scsi.h scsi: esp_scsi: Track residual for PIO transfers 2018-11-13 11:08:32 -08:00
FlashPoint.c
g_NCR5380.c scsi: NCR5380: Move bus reset to host reset 2017-08-25 17:21:11 -04:00
gdth.c scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
gdth.h scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
gdth_ioctl.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
gdth_proc.c scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
gdth_proc.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
gvp11.c scsi: drop bus reset for wd33c93-compatible boards 2017-08-25 17:21:10 -04:00
gvp11.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hosts.c Revert "scsi: core: avoid host-wide host_busy counter for scsi_mq" 2018-08-27 13:17:00 -04:00
hpsa.c scsi: hpsa: limit transfer length to 1MB, not 512kB 2018-08-27 12:26:10 -04:00
hpsa.h scsi: hpsa: correct enclosure sas address 2018-07-10 22:25:03 -04:00
hpsa_cmd.h scsi: hpsa: update discovery polling 2017-10-25 04:55:18 -04:00
hptiop.c scsi: hptiop: Simplify reset handling 2017-08-25 17:21:10 -04:00
hptiop.h
imm.c scsi: don't add scsi command result bytes 2018-06-26 12:27:07 -04:00
imm.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
initio.c
initio.h
ipr.c scsi: ipr: System hung while dlpar adding primary ipr adapter back 2018-09-21 12:35:39 -04:00
ipr.h scsi: ipr: System hung while dlpar adding primary ipr adapter back 2018-09-21 12:35:39 -04:00
ips.c scsi: ips: fix firmware timestamps for 32-bit 2018-04-20 19:40:17 -04:00
ips.h scsi: ips: fix firmware timestamps for 32-bit 2018-04-20 19:40:17 -04:00
iscsi_boot_sysfs.c
iscsi_tcp.c scsi: iscsi_tcp: don't set a bounce limit 2018-04-19 00:00:44 -04:00
iscsi_tcp.h
jazz_esp.c scsi: jazz_esp, sun3x_esp: Pass struct device pointer in dma calls 2018-03-12 22:05:43 -04:00
Kconfig scsi: core: Update SCSI_MQ_DEFAULT help text to match default 2018-08-27 12:26:10 -04:00
lasi700.c parisc/scsi/lasi700: Fix section mismatches 2017-08-22 16:34:36 +02:00
libiscsi.c SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
libiscsi_tcp.c scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
mac53c94.c treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
mac53c94.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mac_esp.c scsi: esp_scsi: Track residual for PIO transfers 2018-11-13 11:08:32 -08:00
mac_scsi.c scsi: NCR5380: Move bus reset to host reset 2017-08-25 17:21:11 -04:00
Makefile SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
megaraid.c scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
megaraid.h scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
mesh.c scsi: don't add scsi command result bytes 2018-06-26 12:27:07 -04:00
mesh.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mvme16x_scsi.c
mvme147.c scsi: mvme147: stop using scsi_module.c 2018-03-19 22:54:47 -04:00
mvme147.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mvumi.c SCSI misc on 20180610 2018-06-10 13:01:12 -07:00
mvumi.h
ncr53c8xx.c scsi: ncr53c8xx: remove ScsiResult macro 2018-07-10 22:42:47 -04:00
ncr53c8xx.h
NCR5380.c SCSI misc on 20171114 2017-11-14 16:23:44 -08:00
NCR5380.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
nsp32.c scsi: nsp32: fix logic bug in error handling 2017-10-16 22:38:44 -04:00
nsp32.h
nsp32_debug.c scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
nsp32_io.h
osst.c treewide: Use array_size() in vmalloc() 2018-06-12 16:19:22 -07:00
osst.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
osst_detect.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
osst_options.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pmcraid.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
pmcraid.h scsi: pmcraid: Use sgl_alloc_order() and sgl_free_order() 2018-02-13 21:49:15 -05:00
ppa.c scsi: ppa: mark expected switch fall-throughs 2017-12-04 20:32:52 -05:00
ppa.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ps3rom.c
qla1280.c timer: Remove init_timer_on_stack() in favor of timer_setup_on_stack() 2017-10-05 15:01:17 +02:00
qla1280.h timer: Remove init_timer_on_stack() in favor of timer_setup_on_stack() 2017-10-05 15:01:17 +02:00
qlogicfas.c scsi: qlogicfas: move bus_reset to host_reset 2017-08-25 17:21:11 -04:00
qlogicfas408.c scsi: qlogicfas: move bus_reset to host_reset 2017-08-25 17:21:11 -04:00
qlogicfas408.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
qlogicpti.c scsi: read host_busy via scsi_host_busy() 2018-06-26 12:53:26 -04:00
qlogicpti.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
raid_class.c scsi: raid_class: Add 'JBOD' RAID level 2018-02-12 11:43:25 -05:00
script_asm.pl
scsi.c scsi: read host_busy via scsi_host_busy() 2018-06-26 12:53:26 -04:00
scsi.h scsi: core: remove Scsi_Cmnd typedef 2018-06-19 22:02:25 -04:00
scsi_common.c scsi: core: doc. fixes to scsi_common.c 2017-12-11 21:39:39 -05:00
scsi_debug.c SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
scsi_debugfs.c scsi: devinfo: use const_ilog2 for array indices 2018-04-20 19:14:28 -04:00
scsi_debugfs.h
scsi_devinfo.c scsi: devinfo: BLIST_RETRY_ASC_C1 for Fujitsu ETERNUS 2018-04-20 19:14:36 -04:00
scsi_dh.c scsi: scsi_dh: replace too broad "TP9" string with the exact models 2018-04-18 19:34:08 -04:00
scsi_error.c SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
scsi_ioctl.c scsi: core: check for equality of result byte values 2018-06-26 12:27:06 -04:00
scsi_lib.c SCSI: fix queue cleanup race before queue initialization is done 2018-11-21 09:19:18 +01:00
scsi_lib_dma.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
scsi_logging.c
scsi_logging.h SCSI misc on 20171114 2017-11-14 16:23:44 -08:00
scsi_netlink.c
scsi_pm.c
scsi_priv.h scsi: dh: Remove scsi_dh_remove_device() 2017-12-07 21:13:45 -05:00
scsi_proc.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
scsi_sas_internal.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
scsi_scan.c scsi: core: check for equality of result byte values 2018-06-26 12:27:06 -04:00
scsi_sysctl.c
scsi_sysfs.c scsi: core: Avoid that SCSI device removal through sysfs triggers a deadlock 2018-08-02 15:53:36 -04:00
scsi_trace.c
scsi_transport_api.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
scsi_transport_fc.c SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
scsi_transport_iscsi.c block: remove parent device reference from struct bsg_class_device 2018-05-29 13:00:25 -06:00
scsi_transport_sas.c SCSI misc on 20180610 2018-06-10 13:01:12 -07:00
scsi_transport_spi.c scsi: core: check for equality of result byte values 2018-06-26 12:27:06 -04:00
scsi_transport_srp.c for-4.18/block-20180603 2018-06-04 07:58:06 -07:00
scsicam.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sd.c scsi: sd: don't crash the host on invalid commands 2018-09-21 12:42:57 -04:00
sd.h block: move dif_prepare/dif_complete functions to block layer 2018-07-30 08:27:02 -06:00
sd_dif.c block: move dif_prepare/dif_complete functions to block layer 2018-07-30 08:27:02 -06:00
sd_zbc.c SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
sense_codes.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ses.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
sg.c SCSI misc on 20180815 2018-08-15 22:06:26 -07:00
sgiwd93.c scsi: drop bus reset for wd33c93-compatible boards 2017-08-25 17:21:10 -04:00
sim710.c
sni_53c710.c
sr.c scsi: sr: Avoid that opening a CD-ROM hangs with runtime power management enabled 2018-08-03 13:53:51 -04:00
sr.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sr_ioctl.c block: Switch struct packet_command to use struct scsi_sense_hdr 2018-08-02 15:22:13 -06:00
sr_vendor.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
st.c scsi: st: remove redundant pointer STbuffer 2018-08-08 21:15:54 -04:00
st.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
st_options.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
stex.c
storvsc_drv.c use the new async probing feature for the hyperv drivers 2018-07-03 13:02:28 +02:00
sun3_scsi.c scsi: NCR5380: Move bus reset to host reset 2017-08-25 17:21:11 -04:00
sun3_scsi_vme.c
sun3x_esp.c scsi: jazz_esp, sun3x_esp: Pass struct device pointer in dma calls 2018-03-12 22:05:43 -04:00
sun_esp.c
virtio_scsi.c scsi: virtio_scsi: fix pi_bytes{out,in} on 4 KiB block size devices 2018-07-26 15:49:43 -06:00
vmw_pvscsi.c scsi: vmw_pvscsi: Return DID_RESET for status SAM_STAT_COMMAND_TERMINATED 2018-08-03 13:56:22 -04:00
vmw_pvscsi.h
wd33c93.c scsi: drop bus reset for wd33c93-compatible boards 2017-08-25 17:21:10 -04:00
wd33c93.h
wd719x.c scsi: wd719x: Use module_pci_driver 2018-05-01 23:30:12 -04:00
wd719x.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xen-scsifront.c scsi: xen-scsifront: add error handling for xenbus_printf 2018-06-19 14:54:41 +02:00
zalon.c parisc/scsi/zalon: Fix section mismatches 2017-08-22 16:34:36 +02:00
zorro7xx.c
zorro_esp.c scsi: zorro_esp: New driver for Amiga Zorro NCR53C9x boards 2018-04-19 00:00:44 -04:00