Thread (14 messages) 14 messages, 2 authors, 2017-09-22

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

From: Ming Lei <hidden>
Date: 2017-09-21 23:53:28

On Thu, Sep 21, 2017 at 11:32:33PM +0000, Bart Van Assche wrote:
On Fri, 2017-09-22 at 07:25 +0800, Ming Lei wrote:
quoted
On Thu, Sep 21, 2017 at 10:43:26PM +0000, Bart Van Assche wrote:
quoted
On Fri, 2017-09-22 at 06:06 +0800, Ming Lei wrote:
quoted
On Thu, Sep 21, 2017 at 02:22:55PM -0700, Bart Van Assche wrote:
quoted
+	} else {
 		scsi_run_queue(q);
+		while (atomic_read(&sdev->device_busy)) {
+			msleep_interruptible(200);
+			scsi_run_queue(q);
+		}
Are you sure only blk-mq need to drain queue? We need
to do that for block legacy too.
The code above your comment drains the queue for the legacy block layer.
That is just draining the requests dispatched to SCSI layer, and there
might be lots of requests in block I/O scheduler queue or requeue or
whatever.
There is no requeue list for the legacy block layer. There is only a requeue
list for blk-mq.

Waiting for I/O requests that are in scheduler queues is not the purpose of
scsi_quiesce_device(). The purpose of that function is to wait for requests
that have already been started. The sdev->device_busy counter represents the
number of started requests so waiting until that counter has reached zero is
sufficient.
Then that is simply not enough since the issue is that request pool can
be used up easily when SCSI device is quiesced, then no request is left
for RQF_PREEMPT(PM), and I/O hang is triggered.

It has been discussed for long time, I am sorry you still don't
understand it.

-- 
Ming
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help