diff options
author | Jens Axboe <axboe@kernel.dk> | 2018-11-01 18:36:27 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-11-07 15:42:32 -0500 |
commit | f664a3cc17b7d0a2bc3b3ab96181e1029b0ec0e6 (patch) | |
tree | d49b6866c48f12638ae5e8dcbddf97d0074243e4 | |
parent | 3a7ea2c483a53fc89e336f69c6ee1d7defe00811 (diff) |
scsi: kill off the legacy IO path
This removes the legacy (non-mq) IO path for SCSI.
Cc: linux-scsi@vger.kernel.org
Acked-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Tested-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Omar Sandoval <osandov@fb.com>
Acked-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | Documentation/scsi/scsi-parameters.txt | 5 | ||||
-rw-r--r-- | drivers/scsi/Kconfig | 12 | ||||
-rw-r--r-- | drivers/scsi/cxlflash/main.c | 6 | ||||
-rw-r--r-- | drivers/scsi/hosts.c | 29 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qedi/qedi_main.c | 3 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 30 | ||||
-rw-r--r-- | drivers/scsi/scsi.c | 5 | ||||
-rw-r--r-- | drivers/scsi/scsi_debug.c | 3 | ||||
-rw-r--r-- | drivers/scsi/scsi_error.c | 2 | ||||
-rw-r--r-- | drivers/scsi/scsi_lib.c | 603 | ||||
-rw-r--r-- | drivers/scsi/scsi_priv.h | 1 | ||||
-rw-r--r-- | drivers/scsi/scsi_scan.c | 10 | ||||
-rw-r--r-- | drivers/scsi/scsi_sysfs.c | 8 | ||||
-rw-r--r-- | drivers/scsi/ufs/ufshcd.c | 6 | ||||
-rw-r--r-- | include/scsi/scsi_host.h | 18 | ||||
-rw-r--r-- | include/scsi/scsi_tcq.h | 14 |
17 files changed, 77 insertions, 680 deletions
diff --git a/Documentation/scsi/scsi-parameters.txt b/Documentation/scsi/scsi-parameters.txt index 92999d4e0cb8..25a4b4cf04a6 100644 --- a/Documentation/scsi/scsi-parameters.txt +++ b/Documentation/scsi/scsi-parameters.txt | |||
@@ -97,11 +97,6 @@ parameters may be changed at runtime by the command | |||
97 | allowing boot to proceed. none ignores them, expecting | 97 | allowing boot to proceed. none ignores them, expecting |
98 | user space to do the scan. | 98 | user space to do the scan. |
99 | 99 | ||
100 | scsi_mod.use_blk_mq= | ||
101 | [SCSI] use blk-mq I/O path by default | ||
102 | See SCSI_MQ_DEFAULT in drivers/scsi/Kconfig. | ||
103 | Format: <y/n> | ||
104 | |||
105 | sim710= [SCSI,HW] | 100 | sim710= [SCSI,HW] |
106 | See header of drivers/scsi/sim710.c. | 101 | See header of drivers/scsi/sim710.c. |
107 | 102 | ||
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index f07444d30b21..dfdc6940de2f 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
@@ -50,18 +50,6 @@ config SCSI_NETLINK | |||
50 | default n | 50 | default n |
51 | depends on NET | 51 | depends on NET |
52 | 52 | ||
53 | config SCSI_MQ_DEFAULT | ||
54 | bool "SCSI: use blk-mq I/O path by default" | ||
55 | default y | ||
56 | depends on SCSI | ||
57 | ---help--- | ||
58 | This option enables the blk-mq based I/O path for SCSI devices by | ||
59 | default. With this option the scsi_mod.use_blk_mq module/boot | ||
60 | option defaults to Y, without it to N, but it can still be | ||
61 | overridden either way. | ||
62 | |||
63 | If unsure say Y. | ||
64 | |||
65 | config SCSI_PROC_FS | 53 | config SCSI_PROC_FS |
66 | bool "legacy /proc/scsi/ support" | 54 | bool "legacy /proc/scsi/ support" |
67 | depends on SCSI && PROC_FS | 55 | depends on SCSI && PROC_FS |
diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c index 6637116529aa..abdc9eac4173 100644 --- a/drivers/scsi/cxlflash/main.c +++ b/drivers/scsi/cxlflash/main.c | |||
@@ -3088,12 +3088,6 @@ static ssize_t hwq_mode_store(struct device *dev, | |||
3088 | return -EINVAL; | 3088 | return -EINVAL; |
3089 | } | 3089 | } |
3090 | 3090 | ||
3091 | if ((mode == HWQ_MODE_TAG) && !shost_use_blk_mq(shost)) { | ||
3092 | dev_info(cfgdev, "SCSI-MQ is not enabled, use a different " | ||
3093 | "HWQ steering mode.\n"); | ||
3094 | return -EINVAL; | ||
3095 | } | ||
3096 | |||
3097 | afu->hwq_mode = mode; | 3091 | afu->hwq_mode = mode; |
3098 | 3092 | ||
3099 | return count; | 3093 | return count; |
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index ea4b0bb0c1cd..cc71136ba300 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c | |||
@@ -222,18 +222,9 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev, | |||
222 | if (error) | 222 | if (error) |
223 | goto fail; | 223 | goto fail; |
224 | 224 | ||
225 | if (shost_use_blk_mq(shost)) { | 225 | error = scsi_mq_setup_tags(shost); |
226 | error = scsi_mq_setup_tags(shost); | 226 | if (error) |
227 | if (error) | 227 | goto fail; |
228 | goto fail; | ||
229 | } else { | ||
230 | shost->bqt = blk_init_tags(shost->can_queue, | ||
231 | shost->hostt->tag_alloc_policy); | ||
232 | if (!shost->bqt) { | ||
233 | error = -ENOMEM; | ||
234 | goto fail; | ||
235 | } | ||
236 | } | ||
237 | 228 | ||
238 | if (!shost->shost_gendev.parent) | 229 | if (!shost->shost_gendev.parent) |
239 | shost->shost_gendev.parent = dev ? dev : &platform_bus; | 230 | shost->shost_gendev.parent = dev ? dev : &platform_bus; |
@@ -309,8 +300,7 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev, | |||
309 | pm_runtime_disable(&shost->shost_gendev); | 300 | pm_runtime_disable(&shost->shost_gendev); |
310 | pm_runtime_set_suspended(&shost->shost_gendev); | 301 | pm_runtime_set_suspended(&shost->shost_gendev); |
311 | pm_runtime_put_noidle(&shost->shost_gendev); | 302 | pm_runtime_put_noidle(&shost->shost_gendev); |
312 | if (shost_use_blk_mq(shost)) | 303 | scsi_mq_destroy_tags(shost); |
313 | scsi_mq_destroy_tags(shost); | ||
314 | fail: | 304 | fail: |
315 | return error; | 305 | return error; |
316 | } | 306 | } |
@@ -344,13 +334,8 @@ static void scsi_host_dev_release(struct device *dev) | |||
344 | kfree(dev_name(&shost->shost_dev)); | 334 | kfree(dev_name(&shost->shost_dev)); |
345 | } | 335 | } |
346 | 336 | ||
347 | if (shost_use_blk_mq(shost)) { | 337 | if (shost->tag_set.tags) |
348 | if (shost->tag_set.tags) | 338 | scsi_mq_destroy_tags(shost); |
349 | scsi_mq_destroy_tags(shost); | ||
350 | } else { | ||
351 | if (shost->bqt) | ||
352 | blk_free_tags(shost->bqt); | ||
353 | } | ||
354 | 339 | ||
355 | kfree(shost->shost_data); | 340 | kfree(shost->shost_data); |
356 | 341 | ||
@@ -472,8 +457,6 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) | |||
472 | else | 457 | else |
473 | shost->dma_boundary = 0xffffffff; | 458 | shost->dma_boundary = 0xffffffff; |
474 | 459 | ||
475 | shost->use_blk_mq = scsi_use_blk_mq || shost->hostt->force_blk_mq; | ||
476 | |||
477 | device_initialize(&shost->shost_gendev); | 460 | device_initialize(&shost->shost_gendev); |
478 | dev_set_name(&shost->shost_gendev, "host%d", shost->host_no); | 461 | dev_set_name(&shost->shost_gendev, "host%d", shost->host_no); |
479 | shost->shost_gendev.bus = &scsi_bus_type; | 462 | shost->shost_gendev.bus = &scsi_bus_type; |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 4fa6703a9ec9..baed2b891efb 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -3914,7 +3914,7 @@ int lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba, | |||
3914 | uint32_t tag; | 3914 | uint32_t tag; |
3915 | uint16_t hwq; | 3915 | uint16_t hwq; |
3916 | 3916 | ||
3917 | if (cmnd && shost_use_blk_mq(cmnd->device->host)) { | 3917 | if (cmnd) { |
3918 | tag = blk_mq_unique_tag(cmnd->request); | 3918 | tag = blk_mq_unique_tag(cmnd->request); |
3919 | hwq = blk_mq_unique_tag_to_hwq(tag); | 3919 | hwq = blk_mq_unique_tag_to_hwq(tag); |
3920 | 3920 | ||
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c index 105b0e4d7818..311eb22068e1 100644 --- a/drivers/scsi/qedi/qedi_main.c +++ b/drivers/scsi/qedi/qedi_main.c | |||
@@ -644,8 +644,7 @@ static struct qedi_ctx *qedi_host_alloc(struct pci_dev *pdev) | |||
644 | qedi->max_active_conns = ISCSI_MAX_SESS_PER_HBA; | 644 | qedi->max_active_conns = ISCSI_MAX_SESS_PER_HBA; |
645 | qedi->max_sqes = QEDI_SQ_SIZE; | 645 | qedi->max_sqes = QEDI_SQ_SIZE; |
646 | 646 | ||
647 | if (shost_use_blk_mq(shost)) | 647 | shost->nr_hw_queues = MIN_NUM_CPUS_MSIX(qedi); |
648 | shost->nr_hw_queues = MIN_NUM_CPUS_MSIX(qedi); | ||
649 | 648 | ||
650 | pci_set_drvdata(pdev, qedi); | 649 | pci_set_drvdata(pdev, qedi); |
651 | 650 | ||
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 518f15141170..4ea9f2b4e04f 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -857,13 +857,9 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) | |||
857 | } | 857 | } |
858 | 858 | ||
859 | if (ha->mqenable) { | 859 | if (ha->mqenable) { |
860 | if (shost_use_blk_mq(vha->host)) { | 860 | tag = blk_mq_unique_tag(cmd->request); |
861 | tag = blk_mq_unique_tag(cmd->request); | 861 | hwq = blk_mq_unique_tag_to_hwq(tag); |
862 | hwq = blk_mq_unique_tag_to_hwq(tag); | 862 | qpair = ha->queue_pair_map[hwq]; |
863 | qpair = ha->queue_pair_map[hwq]; | ||
864 | } else if (vha->vp_idx && vha->qpair) { | ||
865 | qpair = vha->qpair; | ||
866 | } | ||
867 | 863 | ||
868 | if (qpair) | 864 | if (qpair) |
869 | return qla2xxx_mqueuecommand(host, cmd, qpair); | 865 | return qla2xxx_mqueuecommand(host, cmd, qpair); |
@@ -3153,7 +3149,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
3153 | goto probe_failed; | 3149 | goto probe_failed; |
3154 | } | 3150 | } |
3155 | 3151 | ||
3156 | if (ha->mqenable && shost_use_blk_mq(host)) { | 3152 | if (ha->mqenable) { |
3157 | /* number of hardware queues supported by blk/scsi-mq*/ | 3153 | /* number of hardware queues supported by blk/scsi-mq*/ |
3158 | host->nr_hw_queues = ha->max_qpairs; | 3154 | host->nr_hw_queues = ha->max_qpairs; |
3159 | 3155 | ||
@@ -3265,25 +3261,17 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
3265 | base_vha->mgmt_svr_loop_id, host->sg_tablesize); | 3261 | base_vha->mgmt_svr_loop_id, host->sg_tablesize); |
3266 | 3262 | ||
3267 | if (ha->mqenable) { | 3263 | if (ha->mqenable) { |
3268 | bool mq = false; | ||
3269 | bool startit = false; | 3264 | bool startit = false; |
3270 | 3265 | ||
3271 | if (QLA_TGT_MODE_ENABLED()) { | 3266 | if (QLA_TGT_MODE_ENABLED()) |
3272 | mq = true; | ||
3273 | startit = false; | 3267 | startit = false; |
3274 | } | ||
3275 | 3268 | ||
3276 | if ((ql2x_ini_mode == QLA2XXX_INI_MODE_ENABLED) && | 3269 | if (ql2x_ini_mode == QLA2XXX_INI_MODE_ENABLED) |
3277 | shost_use_blk_mq(host)) { | ||
3278 | mq = true; | ||
3279 | startit = true; | 3270 | startit = true; |
3280 | } | ||
3281 | 3271 | ||
3282 | if (mq) { | 3272 | /* Create start of day qpairs for Block MQ */ |
3283 | /* Create start of day qpairs for Block MQ */ | 3273 | for (i = 0; i < ha->max_qpairs; i++) |
3284 | for (i = 0; i < ha->max_qpairs; i++) | 3274 | qla2xxx_create_qpair(base_vha, 5, 0, startit); |
3285 | qla2xxx_create_qpair(base_vha, 5, 0, startit); | ||
3286 | } | ||
3287 | } | 3275 | } |
3288 | 3276 | ||
3289 | if (ha->flags.running_gold_fw) | 3277 | if (ha->flags.running_gold_fw) |
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index fc1356d101b0..7675ff0ca2ea 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
@@ -780,11 +780,8 @@ MODULE_LICENSE("GPL"); | |||
780 | module_param(scsi_logging_level, int, S_IRUGO|S_IWUSR); | 780 | module_param(scsi_logging_level, int, S_IRUGO|S_IWUSR); |
781 | MODULE_PARM_DESC(scsi_logging_level, "a bit mask of logging levels"); | 781 | MODULE_PARM_DESC(scsi_logging_level, "a bit mask of logging levels"); |
782 | 782 | ||
783 | #ifdef CONFIG_SCSI_MQ_DEFAULT | 783 | /* This should go away in the future, it doesn't do anything anymore */ |
784 | bool scsi_use_blk_mq = true; | 784 | bool scsi_use_blk_mq = true; |
785 | #else | ||
786 | bool scsi_use_blk_mq = false; | ||
787 | #endif | ||
788 | module_param_named(use_blk_mq, scsi_use_blk_mq, bool, S_IWUSR | S_IRUGO); | 785 | module_param_named(use_blk_mq, scsi_use_blk_mq, bool, S_IWUSR | S_IRUGO); |
789 | 786 | ||
790 | static int __init init_scsi(void) | 787 | static int __init init_scsi(void) |
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 60bcc6df97a9..4740f1e9dd17 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c | |||
@@ -5881,8 +5881,7 @@ static int sdebug_driver_probe(struct device *dev) | |||
5881 | } | 5881 | } |
5882 | /* Decide whether to tell scsi subsystem that we want mq */ | 5882 | /* Decide whether to tell scsi subsystem that we want mq */ |
5883 | /* Following should give the same answer for each host */ | 5883 | /* Following should give the same answer for each host */ |
5884 | if (shost_use_blk_mq(hpnt)) | 5884 | hpnt->nr_hw_queues = submit_queues; |
5885 | hpnt->nr_hw_queues = submit_queues; | ||
5886 | 5885 | ||
5887 | sdbg_host->shost = hpnt; | 5886 | sdbg_host->shost = hpnt; |
5888 | *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host; | 5887 | *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host; |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index c736d61b1648..fff128aa9ec2 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -308,7 +308,7 @@ enum blk_eh_timer_return scsi_times_out(struct request *req) | |||
308 | * error handler. In that case we can return immediately as no | 308 | * error handler. In that case we can return immediately as no |
309 | * further action is required. | 309 | * further action is required. |
310 | */ | 310 | */ |
311 | if (req->q->mq_ops && !blk_mq_mark_complete(req)) | 311 | if (!blk_mq_mark_complete(req)) |
312 | return rtn; | 312 | return rtn; |
313 | if (scsi_abort_command(scmd) != SUCCESS) { | 313 | if (scsi_abort_command(scmd) != SUCCESS) { |
314 | set_host_byte(scmd, DID_TIME_OUT); | 314 | set_host_byte(scmd, DID_TIME_OUT); |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 8b0345924a92..651be30ba96a 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -168,8 +168,6 @@ static void scsi_mq_requeue_cmd(struct scsi_cmnd *cmd) | |||
168 | static void __scsi_queue_insert(struct scsi_cmnd *cmd, int reason, bool unbusy) | 168 | static void __scsi_queue_insert(struct scsi_cmnd *cmd, int reason, bool unbusy) |
169 | { | 169 | { |
170 | struct scsi_device *device = cmd->device; | 170 | struct scsi_device *device = cmd->device; |
171 | struct request_queue *q = device->request_queue; | ||
172 | unsigned long flags; | ||
173 | 171 | ||
174 | SCSI_LOG_MLQUEUE(1, scmd_printk(KERN_INFO, cmd, | 172 | SCSI_LOG_MLQUEUE(1, scmd_printk(KERN_INFO, cmd, |
175 | "Inserting command %p into mlqueue\n", cmd)); | 173 | "Inserting command %p into mlqueue\n", cmd)); |
@@ -190,26 +188,20 @@ static void __scsi_queue_insert(struct scsi_cmnd *cmd, int reason, bool unbusy) | |||
190 | * before blk_cleanup_queue() finishes. | 188 | * before blk_cleanup_queue() finishes. |
191 | */ | 189 | */ |
192 | cmd->result = 0; | 190 | cmd->result = 0; |
193 | if (q->mq_ops) { | 191 | |
194 | /* | 192 | /* |
195 | * Before a SCSI command is dispatched, | 193 | * Before a SCSI command is dispatched, |
196 | * get_device(&sdev->sdev_gendev) is called and the host, | 194 | * get_device(&sdev->sdev_gendev) is called and the host, |
197 | * target and device busy counters are increased. Since | 195 | * target and device busy counters are increased. Since |
198 | * requeuing a request causes these actions to be repeated and | 196 | * requeuing a request causes these actions to be repeated and |
199 | * since scsi_device_unbusy() has already been called, | 197 | * since scsi_device_unbusy() has already been called, |
200 | * put_device(&device->sdev_gendev) must still be called. Call | 198 | * put_device(&device->sdev_gendev) must still be called. Call |
201 | * put_device() after blk_mq_requeue_request() to avoid that | 199 | * put_device() after blk_mq_requeue_request() to avoid that |
202 | * removal of the SCSI device can start before requeueing has | 200 | * removal of the SCSI device can start before requeueing has |
203 | * happened. | 201 | * happened. |
204 | */ | 202 | */ |
205 | blk_mq_requeue_request(cmd->request, true); | 203 | blk_mq_requeue_request(cmd->request, true); |
206 | put_device(&device->sdev_gendev); | 204 | put_device(&device->sdev_gendev); |
207 | return; | ||
208 | } | ||
209 | spin_lock_irqsave(q->queue_lock, flags); | ||
210 | blk_requeue_request(q, cmd->request); | ||
211 | kblockd_schedule_work(&device->requeue_work); | ||
212 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
213 | } | 205 | } |
214 | 206 | ||
215 | /* | 207 | /* |
@@ -370,10 +362,7 @@ void scsi_device_unbusy(struct scsi_device *sdev) | |||
370 | 362 | ||
371 | static void scsi_kick_queue(struct request_queue *q) | 363 | static void scsi_kick_queue(struct request_queue *q) |
372 | { | 364 | { |
373 | if (q->mq_ops) | 365 | blk_mq_run_hw_queues(q, false); |
374 | blk_mq_run_hw_queues(q, false); | ||
375 | else | ||
376 | blk_run_queue(q); | ||
377 | } | 366 | } |
378 | 367 | ||
379 | /* | 368 | /* |
@@ -534,10 +523,7 @@ static void scsi_run_queue(struct request_queue *q) | |||
534 | if (!list_empty(&sdev->host->starved_list)) | 523 | if (!list_empty(&sdev->host->starved_list)) |
535 | scsi_starved_list_run(sdev->host); | 524 | scsi_starved_list_run(sdev->host); |
536 | 525 | ||
537 | if (q->mq_ops) | 526 | blk_mq_run_hw_queues(q, false); |
538 | blk_mq_run_hw_queues(q, false); | ||
539 | else | ||
540 | blk_run_queue(q); | ||
541 | } | 527 | } |
542 | 528 | ||
543 | void scsi_requeue_run_queue(struct work_struct *work) | 529 | void scsi_requeue_run_queue(struct work_struct *work) |
@@ -550,42 +536,6 @@ void scsi_requeue_run_queue(struct work_struct *work) | |||
550 | scsi_run_queue(q); | 536 | scsi_run_queue(q); |
551 | } | 537 | } |
552 | 538 | ||
553 | /* | ||
554 | * Function: scsi_requeue_command() | ||
555 | * | ||
556 | * Purpose: Handle post-processing of completed commands. | ||
557 | * | ||
558 | * Arguments: q - queue to operate on | ||
559 | * cmd - command that may need to be requeued. | ||
560 | * | ||
561 | * Returns: Nothing | ||
562 | * | ||
563 | * Notes: After command completion, there may be blocks left | ||
564 | * over which weren't finished by the previous command | ||
565 | * this can be for a number of reasons - the main one is | ||
566 | * I/O errors in the middle of the request, in which case | ||
567 | * we need to request the blocks that come after the bad | ||
568 | * sector. | ||
569 | * Notes: Upon return, cmd is a stale pointer. | ||
570 | */ | ||
571 | static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd) | ||
572 | { | ||
573 | struct scsi_device *sdev = cmd->device; | ||
574 | struct request *req = cmd->request; | ||
575 | unsigned long flags; | ||
576 | |||
577 | spin_lock_irqsave(q->queue_lock, flags); | ||
578 | blk_unprep_request(req); | ||
579 | req->special = NULL; | ||
580 | scsi_put_command(cmd); | ||
581 | blk_requeue_request(q, req); | ||
582 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
583 | |||
584 | scsi_run_queue(q); | ||
585 | |||
586 | put_device(&sdev->sdev_gendev); | ||
587 | } | ||
588 | |||
589 | void scsi_run_host_queues(struct Scsi_Host *shost) | 539 | void scsi_run_host_queues(struct Scsi_Host *shost) |
590 | { | 540 | { |
591 | struct scsi_device *sdev; | 541 | struct scsi_device *sdev; |
@@ -626,42 +576,6 @@ static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd) | |||
626 | scsi_del_cmd_from_list(cmd); | 576 | scsi_del_cmd_from_list(cmd); |
627 | } | 577 | } |
628 | 578 | ||
629 | /* | ||
630 | * Function: scsi_release_buffers() | ||
631 | * | ||
632 | * Purpose: Free resources allocate for a scsi_command. | ||
633 | * | ||
634 | * Arguments: cmd - command that we are bailing. | ||
635 | * | ||
636 | * Lock status: Assumed that no lock is held upon entry. | ||
637 | * | ||
638 | * Returns: Nothing | ||
639 | * | ||
640 | * Notes: In the event that an upper level driver rejects a | ||
641 | * command, we must release resources allocated during | ||
642 | * the __init_io() function. Primarily this would involve | ||
643 | * the scatter-gather table. | ||
644 | */ | ||
645 | static void scsi_release_buffers(struct scsi_cmnd *cmd) | ||
646 | { | ||
647 | if (cmd->sdb.table.nents) | ||
648 | sg_free_table_chained(&cmd->sdb.table, false); | ||
649 | |||
650 | memset(&cmd->sdb, 0, sizeof(cmd->sdb)); | ||
651 | |||
652 | if (scsi_prot_sg_count(cmd)) | ||
653 | sg_free_table_chained(&cmd->prot_sdb->table, false); | ||
654 | } | ||
655 | |||
656 | static void scsi_release_bidi_buffers(struct scsi_cmnd *cmd) | ||
657 | { | ||
658 | struct scsi_data_buffer *bidi_sdb = cmd->request->next_rq->special; | ||
659 | |||
660 | sg_free_table_chained(&bidi_sdb->table, false); | ||
661 | kmem_cache_free(scsi_sdb_cache, bidi_sdb); | ||
662 | cmd->request->next_rq->special = NULL; | ||
663 | } | ||
664 | |||
665 | /* Returns false when no more bytes to process, true if there are more */ | 579 | /* Returns false when no more bytes to process, true if there are more */ |
666 | static bool scsi_end_request(struct request *req, blk_status_t error, | 580 | static bool scsi_end_request(struct request *req, blk_status_t error, |
667 | unsigned int bytes, unsigned int bidi_bytes) | 581 | unsigned int bytes, unsigned int bidi_bytes) |
@@ -687,37 +601,22 @@ static bool scsi_end_request(struct request *req, blk_status_t error, | |||
687 | destroy_rcu_head(&cmd->rcu); | 601 | destroy_rcu_head(&cmd->rcu); |
688 | } | 602 | } |
689 | 603 | ||
690 | if (req->mq_ctx) { | 604 | /* |
691 | /* | 605 | * In the MQ case the command gets freed by __blk_mq_end_request, |
692 | * In the MQ case the command gets freed by __blk_mq_end_request, | 606 | * so we have to do all cleanup that depends on it earlier. |
693 | * so we have to do all cleanup that depends on it earlier. | 607 | * |
694 | * | 608 | * We also can't kick the queues from irq context, so we |
695 | * We also can't kick the queues from irq context, so we | 609 | * will have to defer it to a workqueue. |
696 | * will have to defer it to a workqueue. | 610 | */ |
697 | */ | 611 | scsi_mq_uninit_cmd(cmd); |
698 | scsi_mq_uninit_cmd(cmd); | ||
699 | |||
700 | __blk_mq_end_request(req, error); | ||
701 | |||
702 | if (scsi_target(sdev)->single_lun || | ||
703 | !list_empty(&sdev->host->starved_list)) | ||
704 | kblockd_schedule_work(&sdev->requeue_work); | ||
705 | else | ||
706 | blk_mq_run_hw_queues(q, true); | ||
707 | } else { | ||
708 | unsigned long flags; | ||
709 | |||
710 | if (bidi_bytes) | ||
711 | scsi_release_bidi_buffers(cmd); | ||
712 | scsi_release_buffers(cmd); | ||
713 | scsi_put_command(cmd); | ||
714 | 612 | ||
715 | spin_lock_irqsave(q->queue_lock, flags); | 613 | __blk_mq_end_request(req, error); |
716 | blk_finish_request(req, error); | ||
717 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
718 | 614 | ||
719 | scsi_run_queue(q); | 615 | if (scsi_target(sdev)->single_lun || |
720 | } | 616 | !list_empty(&sdev->host->starved_list)) |
617 | kblockd_schedule_work(&sdev->requeue_work); | ||
618 | else | ||
619 | blk_mq_run_hw_queues(q, true); | ||
721 | 620 | ||
722 | put_device(&sdev->sdev_gendev); | 621 | put_device(&sdev->sdev_gendev); |
723 | return false; | 622 | return false; |
@@ -766,13 +665,7 @@ static void scsi_io_completion_reprep(struct scsi_cmnd *cmd, | |||
766 | struct request_queue *q) | 665 | struct request_queue *q) |
767 | { | 666 | { |
768 | /* A new command will be prepared and issued. */ | 667 | /* A new command will be prepared and issued. */ |
769 | if (q->mq_ops) { | 668 | scsi_mq_requeue_cmd(cmd); |
770 | scsi_mq_requeue_cmd(cmd); | ||
771 | } else { | ||
772 | /* Unprep request and put it back at head of the queue. */ | ||
773 | scsi_release_buffers(cmd); | ||
774 | scsi_requeue_command(q, cmd); | ||
775 | } | ||
776 | } | 669 | } |
777 | 670 | ||
778 | /* Helper for scsi_io_completion() when special action required. */ | 671 | /* Helper for scsi_io_completion() when special action required. */ |
@@ -1147,9 +1040,7 @@ static int scsi_init_sgtable(struct request *req, struct scsi_data_buffer *sdb) | |||
1147 | */ | 1040 | */ |
1148 | int scsi_init_io(struct scsi_cmnd *cmd) | 1041 | int scsi_init_io(struct scsi_cmnd *cmd) |
1149 | { | 1042 | { |
1150 | struct scsi_device *sdev = cmd->device; | ||
1151 | struct request *rq = cmd->request; | 1043 | struct request *rq = cmd->request; |
1152 | bool is_mq = (rq->mq_ctx != NULL); | ||
1153 | int error = BLKPREP_KILL; | 1044 | int error = BLKPREP_KILL; |
1154 | 1045 | ||
1155 | if (WARN_ON_ONCE(!blk_rq_nr_phys_segments(rq))) | 1046 | if (WARN_ON_ONCE(!blk_rq_nr_phys_segments(rq))) |
@@ -1160,17 +1051,6 @@ int scsi_init_io(struct scsi_cmnd *cmd) | |||
1160 | goto err_exit; | 1051 | goto err_exit; |
1161 | 1052 | ||
1162 | if (blk_bidi_rq(rq)) { | 1053 | if (blk_bidi_rq(rq)) { |
1163 | if (!rq->q->mq_ops) { | ||
1164 | struct scsi_data_buffer *bidi_sdb = | ||
1165 | kmem_cache_zalloc(scsi_sdb_cache, GFP_ATOMIC); | ||
1166 | if (!bidi_sdb) { | ||
1167 | error = BLKPREP_DEFER; | ||
1168 | goto err_exit; | ||
1169 | } | ||
1170 | |||
1171 | rq->next_rq->special = bidi_sdb; | ||
1172 | } | ||
1173 | |||
1174 | error = scsi_init_sgtable(rq->next_rq, rq->next_rq->special); | 1054 | error = scsi_init_sgtable(rq->next_rq, rq->next_rq->special); |
1175 | if (error) | 1055 | if (error) |
1176 | goto err_exit; | 1056 | goto err_exit; |
@@ -1210,14 +1090,7 @@ int scsi_init_io(struct scsi_cmnd *cmd) | |||
1210 | 1090 | ||
1211 | return BLKPREP_OK; | 1091 | return BLKPREP_OK; |
1212 | err_exit: | 1092 | err_exit: |
1213 | if (is_mq) { | 1093 | scsi_mq_free_sgtables(cmd); |
1214 | scsi_mq_free_sgtables(cmd); | ||
1215 | } else { | ||
1216 | scsi_release_buffers(cmd); | ||
1217 | cmd->request->special = NULL; | ||
1218 | scsi_put_command(cmd); | ||
1219 | put_device(&sdev->sdev_gendev); | ||
1220 | } | ||
1221 | return error; | 1094 | return error; |
1222 | } | 1095 | } |
1223 | EXPORT_SYMBOL(scsi_init_io); | 1096 | EXPORT_SYMBOL(scsi_init_io); |
@@ -1423,75 +1296,6 @@ scsi_prep_state_check(struct scsi_device *sdev, struct request *req) | |||
1423 | return ret; | 1296 | return ret; |
1424 | } | 1297 | } |
1425 | 1298 | ||
1426 | static int | ||
1427 | scsi_prep_return(struct request_queue *q, struct request *req, int ret) | ||
1428 | { | ||
1429 | struct scsi_device *sdev = q->queuedata; | ||
1430 | |||
1431 | switch (ret) { | ||
1432 | case BLKPREP_KILL: | ||
1433 | case BLKPREP_INVALID: | ||
1434 | scsi_req(req)->result = DID_NO_CONNECT << 16; | ||
1435 | /* release the command and kill it */ | ||
1436 | if (req->special) { | ||
1437 | struct scsi_cmnd *cmd = req->special; | ||
1438 | scsi_release_buffers(cmd); | ||
1439 | scsi_put_command(cmd); | ||
1440 | put_device(&sdev->sdev_gendev); | ||
1441 | req->special = NULL; | ||
1442 | } | ||
1443 | break; | ||
1444 | case BLKPREP_DEFER: | ||
1445 | /* | ||
1446 | * If we defer, the blk_peek_request() returns NULL, but the | ||
1447 | * queue must be restarted, so we schedule a callback to happen | ||
1448 | * shortly. | ||
1449 | */ | ||
1450 | if (atomic_read(&sdev->device_busy) == 0) | ||
1451 | blk_delay_queue(q, SCSI_QUEUE_DELAY); | ||
1452 | break; | ||
1453 | default: | ||
1454 | req->rq_flags |= RQF_DONTPREP; | ||
1455 | } | ||
1456 | |||
1457 | return ret; | ||
1458 | } | ||
1459 | |||
1460 | static int scsi_prep_fn(struct request_queue *q, struct request *req) | ||
1461 | { | ||
1462 | struct scsi_device *sdev = q->queuedata; | ||
1463 | struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req); | ||
1464 | int ret; | ||
1465 | |||
1466 | ret = scsi_prep_state_check(sdev, req); | ||
1467 | if (ret != BLKPREP_OK) | ||
1468 | goto out; | ||
1469 | |||
1470 | if (!req->special) { | ||
1471 | /* Bail if we can't get a reference to the device */ | ||
1472 | if (unlikely(!get_device(&sdev->sdev_gendev))) { | ||
1473 | ret = BLKPREP_DEFER; | ||
1474 | goto out; | ||
1475 | } | ||
1476 | |||
1477 | scsi_init_command(sdev, cmd); | ||
1478 | req->special = cmd; | ||
1479 | } | ||
1480 | |||
1481 | cmd->tag = req->tag; | ||
1482 | cmd->request = req; | ||
1483 | cmd->prot_op = SCSI_PROT_NORMAL; | ||
1484 | |||
1485 | ret = scsi_setup_cmnd(sdev, req); | ||
1486 | out: | ||
1487 | return scsi_prep_return(q, req, ret); | ||
1488 | } | ||
1489 | |||
1490 | static void scsi_unprep_fn(struct request_queue *q, struct request *req) | ||
1491 | { | ||
1492 | scsi_uninit_cmd(blk_mq_rq_to_pdu(req)); | ||
1493 | } | ||
1494 | |||
1495 | /* | 1299 | /* |
1496 | * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else | 1300 | * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else |
1497 | * return 0. | 1301 | * return 0. |
@@ -1511,14 +1315,8 @@ static inline int scsi_dev_queue_ready(struct request_queue *q, | |||
1511 | /* | 1315 | /* |
1512 | * unblock after device_blocked iterates to zero | 1316 | * unblock after device_blocked iterates to zero |
1513 | */ | 1317 | */ |
1514 | if (atomic_dec_return(&sdev->device_blocked) > 0) { | 1318 | if (atomic_dec_return(&sdev->device_blocked) > 0) |
1515 | /* | ||
1516 | * For the MQ case we take care of this in the caller. | ||
1517 | */ | ||
1518 | if (!q->mq_ops) | ||
1519 | blk_delay_queue(q, SCSI_QUEUE_DELAY); | ||
1520 | goto out_dec; | 1319 | goto out_dec; |
1521 | } | ||
1522 | SCSI_LOG_MLQUEUE(3, sdev_printk(KERN_INFO, sdev, | 1320 | SCSI_LOG_MLQUEUE(3, sdev_printk(KERN_INFO, sdev, |
1523 | "unblocking device at zero depth\n")); | 1321 | "unblocking device at zero depth\n")); |
1524 | } | 1322 | } |
@@ -1653,13 +1451,13 @@ out_dec: | |||
1653 | * needs to return 'not busy'. Otherwise, request stacking drivers | 1451 | * needs to return 'not busy'. Otherwise, request stacking drivers |
1654 | * may hold requests forever. | 1452 | * may hold requests forever. |
1655 | */ | 1453 | */ |
1656 | static int scsi_lld_busy(struct request_queue *q) | 1454 | static bool scsi_mq_lld_busy(struct request_queue *q) |
1657 | { | 1455 | { |
1658 | struct scsi_device *sdev = q->queuedata; | 1456 | struct scsi_device *sdev = q->queuedata; |
1659 | struct Scsi_Host *shost; | 1457 | struct Scsi_Host *shost; |
1660 | 1458 | ||
1661 | if (blk_queue_dying(q)) | 1459 | if (blk_queue_dying(q)) |
1662 | return 0; | 1460 | return false; |
1663 | 1461 | ||
1664 | shost = sdev->host; | 1462 | shost = sdev->host; |
1665 | 1463 | ||
@@ -1670,48 +1468,9 @@ static int scsi_lld_busy(struct request_queue *q) | |||
1670 | * in SCSI layer. | 1468 | * in SCSI layer. |
1671 | */ | 1469 | */ |
1672 | if (scsi_host_in_recovery(shost) || scsi_device_is_busy(sdev)) | 1470 | if (scsi_host_in_recovery(shost) || scsi_device_is_busy(sdev)) |
1673 | return 1; | 1471 | return true; |
1674 | |||
1675 | return 0; | ||
1676 | } | ||
1677 | |||
1678 | static bool scsi_mq_lld_busy(struct request_queue *q) | ||
1679 | { | ||
1680 | return scsi_lld_busy(q); | ||
1681 | } | ||
1682 | |||
1683 | /* | ||
1684 | * Kill a request for a dead device | ||
1685 | */ | ||
1686 | static void scsi_kill_request(struct request *req, struct request_queue *q) | ||
1687 | { | ||
1688 | struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req); | ||
1689 | struct scsi_device *sdev; | ||
1690 | struct scsi_target *starget; | ||
1691 | struct Scsi_Host *shost; | ||
1692 | |||
1693 | blk_start_request(req); | ||
1694 | |||
1695 | scmd_printk(KERN_INFO, cmd, "killing request\n"); | ||
1696 | |||
1697 | sdev = cmd->device; | ||
1698 | starget = scsi_target(sdev); | ||
1699 | shost = sdev->host; | ||
1700 | scsi_init_cmd_errh(cmd); | ||
1701 | cmd->result = DID_NO_CONNECT << 16; | ||
1702 | atomic_inc(&cmd->device->iorequest_cnt); | ||
1703 | |||
1704 | /* | ||
1705 | * SCSI request completion path will do scsi_device_unbusy(), | ||
1706 | * bump busy counts. To bump the counters, we need to dance | ||
1707 | * with the locks as normal issue path does. | ||
1708 | */ | ||
1709 | atomic_inc(&sdev->device_busy); | ||
1710 | atomic_inc(&shost->host_busy); | ||
1711 | if (starget->can_queue > 0) | ||
1712 | atomic_inc(&starget->target_busy); | ||
1713 | 1472 | ||
1714 | blk_complete_request(req); | 1473 | return false; |
1715 | } | 1474 | } |
1716 | 1475 | ||
1717 | static void scsi_softirq_done(struct request *rq) | 1476 | static void scsi_softirq_done(struct request *rq) |
@@ -1834,158 +1593,6 @@ static int scsi_dispatch_cmd(struct scsi_cmnd *cmd) | |||
1834 | return 0; | 1593 | return 0; |
1835 | } | 1594 | } |
1836 | 1595 | ||
1837 | /** | ||
1838 | * scsi_done - Invoke completion on finished SCSI command. | ||
1839 | * @cmd: The SCSI Command for which a low-level device driver (LLDD) gives | ||
1840 | * ownership back to SCSI Core -- i.e. the LLDD has finished with it. | ||
1841 | * | ||
1842 | * Description: This function is the mid-level's (SCSI Core) interrupt routine, | ||
1843 | * which regains ownership of the SCSI command (de facto) from a LLDD, and | ||
1844 | * calls blk_complete_request() for further processing. | ||
1845 | * | ||
1846 | * This function is interrupt context safe. | ||
1847 | */ | ||
1848 | static void scsi_done(struct scsi_cmnd *cmd) | ||
1849 | { | ||
1850 | trace_scsi_dispatch_cmd_done(cmd); | ||
1851 | blk_complete_request(cmd->request); | ||
1852 | } | ||
1853 | |||
1854 | /* | ||
1855 | * Function: scsi_request_fn() | ||
1856 | * | ||
1857 | * Purpose: Main strategy routine for SCSI. | ||
1858 | * | ||
1859 | * Arguments: q - Pointer to actual queue. | ||
1860 | * | ||
1861 | * Returns: Nothing | ||
1862 | * | ||
1863 | * Lock status: request queue lock assumed to be held when called. | ||
1864 | * | ||
1865 | * Note: See sd_zbc.c sd_zbc_write_lock_zone() for write order | ||
1866 | * protection for ZBC disks. | ||
1867 | */ | ||
1868 | static void scsi_request_fn(struct request_queue *q) | ||
1869 | __releases(q->queue_lock) | ||
1870 | __acquires(q->queue_lock) | ||
1871 | { | ||
1872 | struct scsi_device *sdev = q->queuedata; | ||
1873 | struct Scsi_Host *shost; | ||
1874 | struct scsi_cmnd *cmd; | ||
1875 | struct request *req; | ||
1876 | |||
1877 | /* | ||
1878 | * To start with, we keep looping until the queue is empty, or until | ||
1879 | * the host is no longer able to accept any more requests. | ||
1880 | */ | ||
1881 | shost = sdev->host; | ||
1882 | for (;;) { | ||
1883 | int rtn; | ||
1884 | /* | ||
1885 | * get next queueable request. We do this early to make sure | ||
1886 | * that the request is fully prepared even if we cannot | ||
1887 | * accept it. | ||
1888 | */ | ||
1889 | req = blk_peek_request(q); | ||
1890 | if (!req) | ||
1891 | break; | ||
1892 | |||
1893 | if (unlikely(!scsi_device_online(sdev))) { | ||
1894 | sdev_printk(KERN_ERR, sdev, | ||
1895 | "rejecting I/O to offline device\n"); | ||
1896 | scsi_kill_request(req, q); | ||
1897 | continue; | ||
1898 | } | ||
1899 | |||
1900 | if (!scsi_dev_queue_ready(q, sdev)) | ||
1901 | break; | ||
1902 | |||
1903 | /* | ||
1904 | * Remove the request from the request list. | ||
1905 | */ | ||
1906 | if (!(blk_queue_tagged(q) && !blk_queue_start_tag(q, req))) | ||
1907 | blk_start_request(req); | ||
1908 | |||
1909 | spin_unlock_irq(q->queue_lock); | ||
1910 | cmd = blk_mq_rq_to_pdu(req); | ||
1911 | if (cmd != req->special) { | ||
1912 | printk(KERN_CRIT "impossible request in %s.\n" | ||
1913 | "please mail a stack trace to " | ||
1914 | "linux-scsi@vger.kernel.org\n", | ||
1915 | __func__); | ||
1916 | blk_dump_rq_flags(req, "foo"); | ||
1917 | BUG(); | ||
1918 | } | ||
1919 | |||
1920 | /* | ||
1921 | * We hit this when the driver is using a host wide | ||
1922 | * tag map. For device level tag maps the queue_depth check | ||
1923 | * in the device ready fn would prevent us from trying | ||
1924 | * to allocate a tag. Since the map is a shared host resource | ||
1925 | * we add the dev to the starved list so it eventually gets | ||
1926 | * a run when a tag is freed. | ||
1927 | */ | ||
1928 | if (blk_queue_tagged(q) && !(req->rq_flags & RQF_QUEUED)) { | ||
1929 | spin_lock_irq(shost->host_lock); | ||
1930 | if (list_empty(&sdev->starved_entry)) | ||
1931 | list_add_tail(&sdev->starved_entry, | ||
1932 | &shost->starved_list); | ||
1933 | spin_unlock_irq(shost->host_lock); | ||
1934 | goto not_ready; | ||
1935 | } | ||
1936 | |||
1937 | if (!scsi_target_queue_ready(shost, sdev)) | ||
1938 | goto not_ready; | ||
1939 | |||
1940 | if (!scsi_host_queue_ready(q, shost, sdev)) | ||
1941 | goto host_not_ready; | ||
1942 | |||
1943 | if (sdev->simple_tags) | ||
1944 | cmd->flags |= SCMD_TAGGED; | ||
1945 | else | ||
1946 | cmd->flags &= ~SCMD_TAGGED; | ||
1947 | |||
1948 | /* | ||
1949 | * Finally, initialize any error handling parameters, and set up | ||
1950 | * the timers for timeouts. | ||
1951 | */ | ||
1952 | scsi_init_cmd_errh(cmd); | ||
1953 | |||
1954 | /* | ||
1955 | * Dispatch the command to the low-level driver. | ||
1956 | */ | ||
1957 | cmd->scsi_done = scsi_done; | ||
1958 | rtn = scsi_dispatch_cmd(cmd); | ||
1959 | if (rtn) { | ||
1960 | scsi_queue_insert(cmd, rtn); | ||
1961 | spin_lock_irq(q->queue_lock); | ||
1962 | goto out_delay; | ||
1963 | } | ||
1964 | spin_lock_irq(q->queue_lock); | ||
1965 | } | ||
1966 | |||
1967 | return; | ||
1968 | |||
1969 | host_not_ready: | ||
1970 | if (scsi_target(sdev)->can_queue > 0) | ||
1971 | atomic_dec(&scsi_target(sdev)->target_busy); | ||
1972 | not_ready: | ||
1973 | /* | ||
1974 | * lock q, handle tag, requeue req, and decrement device_busy. We | ||
1975 | * must return with queue_lock held. | ||
1976 | * | ||
1977 | * Decrementing device_busy without checking it is OK, as all such | ||
1978 | * cases (host limits or settings) should run the queue at some | ||
1979 | * later time. | ||
1980 | */ | ||
1981 | spin_lock_irq(q->queue_lock); | ||
1982 | blk_requeue_request(q, req); | ||
1983 | atomic_dec(&sdev->device_busy); | ||
1984 | out_delay: | ||
1985 | if (!atomic_read(&sdev->device_busy) && !scsi_device_blocked(sdev)) | ||
1986 | blk_delay_queue(q, SCSI_QUEUE_DELAY); | ||
1987 | } | ||
1988 | |||
1989 | static inline blk_status_t prep_to_mq(int ret) | 1596 | static inline blk_status_t prep_to_mq(int ret) |
1990 | { | 1597 | { |
1991 | switch (ret) { | 1598 | switch (ret) { |
@@ -2248,77 +1855,6 @@ void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q) | |||
2248 | } | 1855 | } |
2249 | EXPORT_SYMBOL_GPL(__scsi_init_queue); | 1856 | EXPORT_SYMBOL_GPL(__scsi_init_queue); |
2250 | 1857 | ||
2251 | static int scsi_old_init_rq(struct request_queue *q, struct request *rq, | ||
2252 | gfp_t gfp) | ||
2253 | { | ||
2254 | struct Scsi_Host *shost = q->rq_alloc_data; | ||
2255 | const bool unchecked_isa_dma = shost->unchecked_isa_dma; | ||
2256 | struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq); | ||
2257 | |||
2258 | memset(cmd, 0, sizeof(*cmd)); | ||
2259 | |||
2260 | if (unchecked_isa_dma) | ||
2261 | cmd->flags |= SCMD_UNCHECKED_ISA_DMA; | ||
2262 | cmd->sense_buffer = scsi_alloc_sense_buffer(unchecked_isa_dma, gfp, | ||
2263 | NUMA_NO_NODE); | ||
2264 | if (!cmd->sense_buffer) | ||
2265 | goto fail; | ||
2266 | cmd->req.sense = cmd->sense_buffer; | ||
2267 | |||
2268 | if (scsi_host_get_prot(shost) >= SHOST_DIX_TYPE0_PROTECTION) { | ||
2269 | cmd->prot_sdb = kmem_cache_zalloc(scsi_sdb_cache, gfp); | ||
2270 | if (!cmd->prot_sdb) | ||
2271 | goto fail_free_sense; | ||
2272 | } | ||
2273 | |||
2274 | return 0; | ||
2275 | |||
2276 | fail_free_sense: | ||
2277 | scsi_free_sense_buffer(unchecked_isa_dma, cmd->sense_buffer); | ||
2278 | fail: | ||
2279 | return -ENOMEM; | ||
2280 | } | ||
2281 | |||
2282 | static void scsi_old_exit_rq(struct request_queue *q, struct request *rq) | ||
2283 | { | ||
2284 | struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq); | ||
2285 | |||
2286 | if (cmd->prot_sdb) | ||
2287 | kmem_cache_free(scsi_sdb_cache, cmd->prot_sdb); | ||
2288 | scsi_free_sense_buffer(cmd->flags & SCMD_UNCHECKED_ISA_DMA, | ||
2289 | cmd->sense_buffer); | ||
2290 | } | ||
2291 | |||
2292 | struct request_queue *scsi_old_alloc_queue(struct scsi_device *sdev) | ||
2293 | { | ||
2294 | struct Scsi_Host *shost = sdev->host; | ||
2295 | struct request_queue *q; | ||
2296 | |||
2297 | q = blk_alloc_queue_node(GFP_KERNEL, NUMA_NO_NODE, NULL); | ||
2298 | if (!q) | ||
2299 | return NULL; | ||
2300 | q->cmd_size = sizeof(struct scsi_cmnd) + shost->hostt->cmd_size; | ||
2301 | q->rq_alloc_data = shost; | ||
2302 | q->request_fn = scsi_request_fn; | ||
2303 | q->init_rq_fn = scsi_old_init_rq; | ||
2304 | q->exit_rq_fn = scsi_old_exit_rq; | ||
2305 | q->initialize_rq_fn = scsi_initialize_rq; | ||
2306 | |||
2307 | if (blk_init_allocated_queue(q) < 0) { | ||
2308 | blk_cleanup_queue(q); | ||
2309 | return NULL; | ||
2310 | } | ||
2311 | |||
2312 | __scsi_init_queue(shost, q); | ||
2313 | blk_queue_flag_set(QUEUE_FLAG_SCSI_PASSTHROUGH, q); | ||
2314 | blk_queue_prep_rq(q, scsi_prep_fn); | ||
2315 | blk_queue_unprep_rq(q, scsi_unprep_fn); | ||
2316 | blk_queue_softirq_done(q, scsi_softirq_done); | ||
2317 | blk_queue_rq_timed_out(q, scsi_times_out); | ||
2318 | blk_queue_lld_busy(q, scsi_lld_busy); | ||
2319 | return q; | ||
2320 | } | ||
2321 | |||
2322 | static const struct blk_mq_ops scsi_mq_ops = { | 1858 | static const struct blk_mq_ops scsi_mq_ops = { |
2323 | .get_budget = scsi_mq_get_budget, | 1859 | .get_budget = scsi_mq_get_budget, |
2324 | .put_budget = scsi_mq_put_budget, | 1860 | .put_budget = scsi_mq_put_budget, |
@@ -2386,10 +1922,7 @@ struct scsi_device *scsi_device_from_queue(struct request_queue *q) | |||
2386 | { | 1922 | { |
2387 | struct scsi_device *sdev = NULL; | 1923 | struct scsi_device *sdev = NULL; |
2388 | 1924 | ||
2389 | if (q->mq_ops) { | 1925 | if (q->mq_ops == &scsi_mq_ops) |
2390 | if (q->mq_ops == &scsi_mq_ops) | ||
2391 | sdev = q->queuedata; | ||
2392 | } else if (q->request_fn == scsi_request_fn) | ||
2393 | sdev = q->queuedata; | 1926 | sdev = q->queuedata; |
2394 | if (!sdev || !get_device(&sdev->sdev_gendev)) | 1927 | if (!sdev || !get_device(&sdev->sdev_gendev)) |
2395 | sdev = NULL; | 1928 | sdev = NULL; |
@@ -2993,39 +2526,6 @@ void sdev_evt_send_simple(struct scsi_device *sdev, | |||
2993 | EXPORT_SYMBOL_GPL(sdev_evt_send_simple); | 2526 | EXPORT_SYMBOL_GPL(sdev_evt_send_simple); |
2994 | 2527 | ||
2995 | /** | 2528 | /** |
2996 | * scsi_request_fn_active() - number of kernel threads inside scsi_request_fn() | ||
2997 | * @sdev: SCSI device to count the number of scsi_request_fn() callers for. | ||
2998 | */ | ||
2999 | static int scsi_request_fn_active(struct scsi_device *sdev) | ||
3000 | { | ||
3001 | struct request_queue *q = sdev->request_queue; | ||
3002 | int request_fn_active; | ||
3003 | |||
3004 | WARN_ON_ONCE(sdev->host->use_blk_mq); | ||
3005 | |||
3006 | spin_lock_irq(q->queue_lock); | ||
3007 | request_fn_active = q->request_fn_active; | ||
3008 | spin_unlock_irq(q->queue_lock); | ||
3009 | |||
3010 | return request_fn_active; | ||
3011 | } | ||
3012 | |||
3013 | /** | ||
3014 | * scsi_wait_for_queuecommand() - wait for ongoing queuecommand() calls | ||
3015 | * @sdev: SCSI device pointer. | ||
3016 | * | ||
3017 | * Wait until the ongoing shost->hostt->queuecommand() calls that are | ||
3018 | * invoked from scsi_request_fn() have finished. | ||
3019 | */ | ||
3020 | static void scsi_wait_for_queuecommand(struct scsi_device *sdev) | ||
3021 | { | ||
3022 | WARN_ON_ONCE(sdev->host->use_blk_mq); | ||
3023 | |||
3024 | while (scsi_request_fn_active(sdev)) | ||
3025 | msleep(20); | ||
3026 | } | ||
3027 | |||
3028 | /** | ||
3029 | * scsi_device_quiesce - Block user issued commands. | 2529 | * scsi_device_quiesce - Block user issued commands. |
3030 | * @sdev: scsi device to quiesce. | 2530 | * @sdev: scsi device to quiesce. |
3031 | * | 2531 | * |
@@ -3148,7 +2648,6 @@ EXPORT_SYMBOL(scsi_target_resume); | |||
3148 | int scsi_internal_device_block_nowait(struct scsi_device *sdev) | 2648 | int scsi_internal_device_block_nowait(struct scsi_device *sdev) |
3149 | { | 2649 | { |
3150 | struct request_queue *q = sdev->request_queue; | 2650 | struct request_queue *q = sdev->request_queue; |
3151 | unsigned long flags; | ||
3152 | int err = 0; | 2651 | int err = 0; |
3153 | 2652 | ||
3154 | err = scsi_device_set_state(sdev, SDEV_BLOCK); | 2653 | err = scsi_device_set_state(sdev, SDEV_BLOCK); |
@@ -3164,14 +2663,7 @@ int scsi_internal_device_block_nowait(struct scsi_device *sdev) | |||
3164 | * block layer from calling the midlayer with this device's | 2663 | * block layer from calling the midlayer with this device's |
3165 | * request queue. | 2664 | * request queue. |
3166 | */ | 2665 | */ |
3167 | if (q->mq_ops) { | 2666 | blk_mq_quiesce_queue_nowait(q); |
3168 | blk_mq_quiesce_queue_nowait(q); | ||
3169 | } else { | ||
3170 | spin_lock_irqsave(q->queue_lock, flags); | ||
3171 | blk_stop_queue(q); | ||
3172 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
3173 | } | ||
3174 | |||
3175 | return 0; | 2667 | return 0; |
3176 | } | 2668 | } |
3177 | EXPORT_SYMBOL_GPL(scsi_internal_device_block_nowait); | 2669 | EXPORT_SYMBOL_GPL(scsi_internal_device_block_nowait); |
@@ -3202,12 +2694,8 @@ static int scsi_internal_device_block(struct scsi_device *sdev) | |||
3202 | 2694 | ||
3203 | mutex_lock(&sdev->state_mutex); | 2695 | mutex_lock(&sdev->state_mutex); |
3204 | err = scsi_internal_device_block_nowait(sdev); | 2696 | err = scsi_internal_device_block_nowait(sdev); |
3205 | if (err == 0) { | 2697 | if (err == 0) |
3206 | if (q->mq_ops) | 2698 | blk_mq_quiesce_queue(q); |
3207 | blk_mq_quiesce_queue(q); | ||
3208 | else | ||
3209 | scsi_wait_for_queuecommand(sdev); | ||
3210 | } | ||
3211 | mutex_unlock(&sdev->state_mutex); | 2699 | mutex_unlock(&sdev->state_mutex); |
3212 | 2700 | ||
3213 | return err; | 2701 | return err; |
@@ -3216,15 +2704,8 @@ static int scsi_internal_device_block(struct scsi_device *sdev) | |||
3216 | void scsi_start_queue(struct scsi_device *sdev) | 2704 | void scsi_start_queue(struct scsi_device *sdev) |
3217 | { | 2705 | { |
3218 | struct request_queue *q = sdev->request_queue; | 2706 | struct request_queue *q = sdev->request_queue; |
3219 | unsigned long flags; | ||
3220 | 2707 | ||
3221 | if (q->mq_ops) { | 2708 | blk_mq_unquiesce_queue(q); |
3222 | blk_mq_unquiesce_queue(q); | ||
3223 | } else { | ||
3224 | spin_lock_irqsave(q->queue_lock, flags); | ||
3225 | blk_start_queue(q); | ||
3226 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
3227 | } | ||
3228 | } | 2709 | } |
3229 | 2710 | ||
3230 | /** | 2711 | /** |
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h index 99f1db5e467e..5f21547b2ad2 100644 --- a/drivers/scsi/scsi_priv.h +++ b/drivers/scsi/scsi_priv.h | |||
@@ -92,7 +92,6 @@ extern void scsi_queue_insert(struct scsi_cmnd *cmd, int reason); | |||
92 | extern void scsi_io_completion(struct scsi_cmnd *, unsigned int); | 92 | extern void scsi_io_completion(struct scsi_cmnd *, unsigned int); |
93 | extern void scsi_run_host_queues(struct Scsi_Host *shost); | 93 | extern void scsi_run_host_queues(struct Scsi_Host *shost); |
94 | extern void scsi_requeue_run_queue(struct work_struct *work); | 94 | extern void scsi_requeue_run_queue(struct work_struct *work); |
95 | extern struct request_queue *scsi_old_alloc_queue(struct scsi_device *sdev); | ||
96 | extern struct request_queue *scsi_mq_alloc_queue(struct scsi_device *sdev); | 95 | extern struct request_queue *scsi_mq_alloc_queue(struct scsi_device *sdev); |
97 | extern void scsi_start_queue(struct scsi_device *sdev); | 96 | extern void scsi_start_queue(struct scsi_device *sdev); |
98 | extern int scsi_mq_setup_tags(struct Scsi_Host *shost); | 97 | extern int scsi_mq_setup_tags(struct Scsi_Host *shost); |
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 78ca63dfba4a..dd0d516f65e2 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -266,10 +266,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, | |||
266 | */ | 266 | */ |
267 | sdev->borken = 1; | 267 | sdev->borken = 1; |
268 | 268 | ||
269 | if (shost_use_blk_mq(shost)) | 269 | sdev->request_queue = scsi_mq_alloc_queue(sdev); |
270 | sdev->request_queue = scsi_mq_alloc_queue(sdev); | ||
271 | else | ||
272 | sdev->request_queue = scsi_old_alloc_queue(sdev); | ||
273 | if (!sdev->request_queue) { | 270 | if (!sdev->request_queue) { |
274 | /* release fn is set up in scsi_sysfs_device_initialise, so | 271 | /* release fn is set up in scsi_sysfs_device_initialise, so |
275 | * have to free and put manually here */ | 272 | * have to free and put manually here */ |
@@ -280,11 +277,6 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, | |||
280 | WARN_ON_ONCE(!blk_get_queue(sdev->request_queue)); | 277 | WARN_ON_ONCE(!blk_get_queue(sdev->request_queue)); |
281 | sdev->request_queue->queuedata = sdev; | 278 | sdev->request_queue->queuedata = sdev; |
282 | 279 | ||
283 | if (!shost_use_blk_mq(sdev->host)) { | ||
284 | blk_queue_init_tags(sdev->request_queue, | ||
285 | sdev->host->cmd_per_lun, shost->bqt, | ||
286 | shost->hostt->tag_alloc_policy); | ||
287 | } | ||
288 | scsi_change_queue_depth(sdev, sdev->host->cmd_per_lun ? | 280 | scsi_change_queue_depth(sdev, sdev->host->cmd_per_lun ? |
289 | sdev->host->cmd_per_lun : 1); | 281 | sdev->host->cmd_per_lun : 1); |
290 | 282 | ||
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 3aee9464a7bf..6a9040faed00 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -367,7 +367,6 @@ store_shost_eh_deadline(struct device *dev, struct device_attribute *attr, | |||
367 | 367 | ||
368 | static DEVICE_ATTR(eh_deadline, S_IRUGO | S_IWUSR, show_shost_eh_deadline, store_shost_eh_deadline); | 368 | static DEVICE_ATTR(eh_deadline, S_IRUGO | S_IWUSR, show_shost_eh_deadline, store_shost_eh_deadline); |
369 | 369 | ||
370 | shost_rd_attr(use_blk_mq, "%d\n"); | ||
371 | shost_rd_attr(unique_id, "%u\n"); | 370 | shost_rd_attr(unique_id, "%u\n"); |
372 | shost_rd_attr(cmd_per_lun, "%hd\n"); | 371 | shost_rd_attr(cmd_per_lun, "%hd\n"); |
373 | shost_rd_attr(can_queue, "%hd\n"); | 372 | shost_rd_attr(can_queue, "%hd\n"); |
@@ -386,6 +385,13 @@ show_host_busy(struct device *dev, struct device_attribute *attr, char *buf) | |||
386 | } | 385 | } |
387 | static DEVICE_ATTR(host_busy, S_IRUGO, show_host_busy, NULL); | 386 | static DEVICE_ATTR(host_busy, S_IRUGO, show_host_busy, NULL); |
388 | 387 | ||
388 | static ssize_t | ||
389 | show_use_blk_mq(struct device *dev, struct device_attribute *attr, char *buf) | ||
390 | { | ||
391 | return sprintf(buf, "1\n"); | ||
392 | } | ||
393 | static DEVICE_ATTR(use_blk_mq, S_IRUGO, show_use_blk_mq, NULL); | ||
394 | |||
389 | static struct attribute *scsi_sysfs_shost_attrs[] = { | 395 | static struct attribute *scsi_sysfs_shost_attrs[] = { |
390 | &dev_attr_use_blk_mq.attr, | 396 | &dev_attr_use_blk_mq.attr, |
391 | &dev_attr_unique_id.attr, | 397 | &dev_attr_unique_id.attr, |
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 23d7cca36ff0..fb308ea8e9a5 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c | |||
@@ -8100,12 +8100,6 @@ int ufshcd_alloc_host(struct device *dev, struct ufs_hba **hba_handle) | |||
8100 | goto out_error; | 8100 | goto out_error; |
8101 | } | 8101 | } |
8102 | 8102 | ||
8103 | /* | ||
8104 | * Do not use blk-mq at this time because blk-mq does not support | ||
8105 | * runtime pm. | ||
8106 | */ | ||
8107 | host->use_blk_mq = false; | ||
8108 | |||
8109 | hba = shost_priv(host); | 8103 | hba = shost_priv(host); |
8110 | hba->host = host; | 8104 | hba->host = host; |
8111 | hba->dev = dev; | 8105 | hba->dev = dev; |
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 5ea06d310a25..aa760df8c6b3 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
@@ -11,7 +11,6 @@ | |||
11 | #include <linux/blk-mq.h> | 11 | #include <linux/blk-mq.h> |
12 | #include <scsi/scsi.h> | 12 | #include <scsi/scsi.h> |
13 | 13 | ||
14 | struct request_queue; | ||
15 | struct block_device; | 14 | struct block_device; |
16 | struct completion; | 15 | struct completion; |
17 | struct module; | 16 | struct module; |
@@ -22,7 +21,6 @@ struct scsi_target; | |||
22 | struct Scsi_Host; | 21 | struct Scsi_Host; |
23 | struct scsi_host_cmd_pool; | 22 | struct scsi_host_cmd_pool; |
24 | struct scsi_transport_template; | 23 | struct scsi_transport_template; |
25 | struct blk_queue_tags; | ||
26 | 24 | ||
27 | 25 | ||
28 | /* | 26 | /* |
@@ -547,14 +545,8 @@ struct Scsi_Host { | |||
547 | struct scsi_host_template *hostt; | 545 | struct scsi_host_template *hostt; |
548 | struct scsi_transport_template *transportt; | 546 | struct scsi_transport_template *transportt; |
549 | 547 | ||
550 | /* | 548 | /* Area to keep a shared tag map */ |
551 | * Area to keep a shared tag map (if needed, will be | 549 | struct blk_mq_tag_set tag_set; |
552 | * NULL if not). | ||
553 | */ | ||
554 | union { | ||
555 | struct blk_queue_tag *bqt; | ||
556 | struct blk_mq_tag_set tag_set; | ||
557 | }; | ||
558 | 550 | ||
559 | atomic_t host_busy; /* commands actually active on low-level */ | 551 | atomic_t host_busy; /* commands actually active on low-level */ |
560 | atomic_t host_blocked; | 552 | atomic_t host_blocked; |
@@ -648,7 +640,6 @@ struct Scsi_Host { | |||
648 | /* The controller does not support WRITE SAME */ | 640 | /* The controller does not support WRITE SAME */ |
649 | unsigned no_write_same:1; | 641 | unsigned no_write_same:1; |
650 | 642 | ||
651 | unsigned use_blk_mq:1; | ||
652 | unsigned use_cmd_list:1; | 643 | unsigned use_cmd_list:1; |
653 | 644 | ||
654 | /* Host responded with short (<36 bytes) INQUIRY result */ | 645 | /* Host responded with short (<36 bytes) INQUIRY result */ |
@@ -742,11 +733,6 @@ static inline int scsi_host_in_recovery(struct Scsi_Host *shost) | |||
742 | shost->tmf_in_progress; | 733 | shost->tmf_in_progress; |
743 | } | 734 | } |
744 | 735 | ||
745 | static inline bool shost_use_blk_mq(struct Scsi_Host *shost) | ||
746 | { | ||
747 | return shost->use_blk_mq; | ||
748 | } | ||
749 | |||
750 | extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *); | 736 | extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *); |
751 | extern void scsi_flush_work(struct Scsi_Host *); | 737 | extern void scsi_flush_work(struct Scsi_Host *); |
752 | 738 | ||
diff --git a/include/scsi/scsi_tcq.h b/include/scsi/scsi_tcq.h index e192a0caa850..6053d46e794e 100644 --- a/include/scsi/scsi_tcq.h +++ b/include/scsi/scsi_tcq.h | |||
@@ -23,19 +23,15 @@ static inline struct scsi_cmnd *scsi_host_find_tag(struct Scsi_Host *shost, | |||
23 | int tag) | 23 | int tag) |
24 | { | 24 | { |
25 | struct request *req = NULL; | 25 | struct request *req = NULL; |
26 | u16 hwq; | ||
26 | 27 | ||
27 | if (tag == SCSI_NO_TAG) | 28 | if (tag == SCSI_NO_TAG) |
28 | return NULL; | 29 | return NULL; |
29 | 30 | ||
30 | if (shost_use_blk_mq(shost)) { | 31 | hwq = blk_mq_unique_tag_to_hwq(tag); |
31 | u16 hwq = blk_mq_unique_tag_to_hwq(tag); | 32 | if (hwq < shost->tag_set.nr_hw_queues) { |
32 | 33 | req = blk_mq_tag_to_rq(shost->tag_set.tags[hwq], | |
33 | if (hwq < shost->tag_set.nr_hw_queues) { | 34 | blk_mq_unique_tag_to_tag(tag)); |
34 | req = blk_mq_tag_to_rq(shost->tag_set.tags[hwq], | ||
35 | blk_mq_unique_tag_to_tag(tag)); | ||
36 | } | ||
37 | } else { | ||
38 | req = blk_map_queue_find_tag(shost->bqt, tag); | ||
39 | } | 35 | } |
40 | 36 | ||
41 | if (!req) | 37 | if (!req) |