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

Ming Lei
2017-09-21T23:53:28Z

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:
> > On Thu, Sep 21, 2017 at 10:43:26PM +0000, Bart Van Assche wrote:
> > > On Fri, 2017-09-22 at 06:06 +0800, Ming Lei wrote:
> > > > On Thu, Sep 21, 2017 at 02:22:55PM -0700, Bart Van Assche wrote:
> > > > > + } 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