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