On Thu, 2018-07-26 at 10:45 +0800, jianchao.wang wrote:
> On 07/26/2018 06:26 AM, Bart Van Assche wrote:
> > @@ -102,9 +109,11 @@ int blk_pre_runtime_suspend(struct request_queue *q)
> >             return ret;
> >  
> >     blk_pm_runtime_lock(q);
> > +   blk_set_preempt_only(q);
> 
> We only stop non-RQF_PM request entering when RPM_SUSPENDING and RPM_RESUMING.
> blk_pre_runtime_suspend should only _check_ whether runtime suspend is 
> allowed.
> So we should not set preempt_only here.
> 
> > +   percpu_ref_switch_to_atomic_sync(&q->q_usage_counter);
> >  
> >     spin_lock_irq(q->queue_lock);
> > -   if (q->nr_pending) {
> > +   if (!percpu_ref_is_zero(&q->q_usage_counter)) {
> >             ret = -EBUSY;
> >             pm_runtime_mark_last_busy(q->dev);
> >     } else {
> > @@ -112,6 +121,7 @@ int blk_pre_runtime_suspend(struct request_queue *q)
> >     }
> >     spin_unlock_irq(q->queue_lock);
> >  
> > +   percpu_ref_switch_to_percpu(&q->q_usage_counter);
> >     blk_pm_runtime_unlock(q);

Hello Jianchao,

There is only one caller of blk_post_runtime_suspend(), namely
sdev_runtime_suspend(). That function calls pm->runtime_suspend() before
it calls blk_post_runtime_suspend(). I think it would be wrong to set the
PREEMPT_ONLY flag from inside blk_post_runtime_suspend() because that could
cause pm->runtime_suspend() while a request is in progress.

Bart.

Reply via email to