[PATCH v2 4/4] scsi-mq: Reduce suspend latency

Bart Van Assche
2017-09-21T21:22:55Z

Avoid that it can take 200 ms too long to wait for ongoing requests
to finish. Note: blk_mq_freeze_queue() uses a wait queue to wait
for ongoing requests to finish.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Ming Lei <ming.lei@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
---
drivers/scsi/scsi_lib.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index e76fd6e89a81..34e5f0f95d01 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2901,10 +2901,15 @@ scsi_device_quiesce(struct scsi_device *sdev)
if (err)
return err;

- scsi_run_queue(q);
- while (atomic_read(&sdev->device_busy)) {
- msleep_interruptible(200);
+ if (q->mq_ops) {
+ blk_mq_freeze_queue(q);
+ blk_mq_unfreeze_queue(q);
+ } else {
scsi_run_queue(q);
+ while (atomic_read(&sdev->device_busy)) {
+ msleep_interruptible(200);
+ scsi_run_queue(q);
+ }
}
return 0;
}
--
2.14.1