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.