Thread (12 messages) 12 messages, 2 authors, 2018-09-20

Re: [PATCH v8 6/8] block: Schedule runtime resume earlier

From: Ming Lei <hidden>
Date: 2018-09-20 07:19:00

On Wed, Sep 19, 2018 at 02:39:35PM -0700, Bart Van Assche wrote:
On Wed, 2018-09-19 at 12:05 +0800, Ming Lei wrote:
quoted
Looks this patch may introduce the following race between queue
freeze and
runtime suspend:

-------------------------------------------------------------------
-------
CPU0				CPU1				
		CPU2
-------------------------------------------------------------------
-------

blk_freeze_queue()

					blk_mq_alloc_request()
						blk_queue_enter()
							blk_pm_request_
resume()
							wait_event()

									
			blk_pre_runtime_suspend()
									
				->blk_set_pm_only
									
			...
									
			blk_post_runtime_suspend()

...
blk_mq_unfreeze_queue()
-------------------------------------------------------------------
-------
- CPU0: queue is frozen

- CPU1: one new request comes, and see queue is frozen, but queue
isn't
runtime-suspended yet, then blk_pm_request_resume() does nothing. So
this
allocation is blocked in wait_event().

- CPU2: runtime suspend comes, and queue becomes runtime-suspended
now

- CPU0: queue is unfreeze, but the new request allocation in CPU1 may
never
be done because the queue is runtime suspended, and wait_event()
won't return.
And the expected result is that the queue becomes active and the
allocation on
CPU1 is done immediately.
Hello Ming,

Just like for the scenario Jianchao reported, I will address this by
only allowing the suspend to proceed if q_usage_counter == 0.
Hi Bart,

But .q_usage_counter has been zero already in the case I described,
no one grabs a queue ref before starting runtime suspend.

Also, if there is in-progress PM request, the .q_usage_counter can be
non-zero, but it should be fine to start the suspend.

Thanks,
Ming
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help