Hi Bart

On 08/11/2018 12:17 AM, Bart Van Assche wrote:
> void blk_pm_runtime_exit(struct request_queue *q)
> {
>       if (!q->dev)
>               return;
> 
>       pm_runtime_get_sync(q->dev);
>       blk_freeze_queue(q);
>       q->dev = NULL;
>       blk_unfreeze_queue(q);
> }

I'm afraid this will not work.

In following patch:

@@ -972,6 +972,8 @@ int blk_queue_enter(struct request_queue *q, 
blk_mq_req_flags_t flags)
                if (success)
                        return 0;
 
+               blk_pm_request_resume(q);
+
                if (flags & BLK_MQ_REQ_NOWAIT)
                        return -EBUSY;

We could still invoke blk_pm_request_resume even if the queue is frozen.

And we have blk_pm_request_resume later as following:

+static inline void blk_pm_request_resume(struct request_queue *q)
+{
+       if (q->dev && (q->rpm_status == RPM_SUSPENDED ||
+                      q->rpm_status == RPM_SUSPENDING))
+               pm_request_resume(q->dev);
+}

Thanks
Jianchao

Reply via email to