On Mon, 2020-11-16 at 11:04 +0800, Bart Van Assche wrote: > From: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > > blk_queue_enter() accepts BLK_MQ_REQ_PREEMPT independent of the runtime > power management state. Since SCSI domain validation no longer depends on > this behavior, modify the behavior of blk_queue_enter() as follows: > - Do not accept any requests while suspended. > - Only process power management requests while suspending or resuming. > > Submitting BLK_MQ_REQ_PREEMPT requests to a device that is runtime- > suspended causes runtime-suspended block devices not to resume as they > should. The request which should cause a runtime resume instead gets > issued directly, without resuming the device first. Of course the device > can't handle it properly, the I/O fails, and the device remains suspended. > > The problem is fixed by checking that the queue's runtime-PM status > isn't RPM_SUSPENDED before allowing a request to be issued, and > queuing a runtime-resume request if it is. In particular, the inline > blk_pm_request_resume() routine is renamed blk_pm_resume_queue() and > the code is unified by merging the surrounding checks into the > routine. If the queue isn't set up for runtime PM, or there currently > is no restriction on allowed requests, the request is allowed. > Likewise if the BLK_MQ_REQ_PREEMPT flag is set and the status isn't > RPM_SUSPENDED. Otherwise a runtime resume is queued and the request > is blocked until conditions are more suitable. > > Cc: Can Guo <cang@xxxxxxxxxxxxxx> > Cc: Stanley Chu <stanley.chu@xxxxxxxxxxxx> > Cc: Ming Lei <ming.lei@xxxxxxxxxx> > Cc: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > Reported-and-tested-by: Martin Kepplinger <martin.kepplinger@xxxxxxx> > Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> Reviewed-by: Stanley Chu <stanley.chu@xxxxxxxxxxxx>