Re: [PATCH] scsi: sd: add runtime pm to open / release

From: Martin Kepplinger
Date: Mon Jun 29 2020 - 23:34:06 EST


On 29.06.20 18:15, Alan Stern wrote:
> On Mon, Jun 29, 2020 at 11:42:59AM +0200, Martin Kepplinger wrote:
>>
>>
>> On 26.06.20 17:44, Alan Stern wrote:
>>> Martin's best approach would be to add some debugging code to find out why
>>> blk_queue_enter() isn't calling bkl_pm_request_resume(), or why that call
>>> doesn't lead to pm_request_resume().
>>>
>>> Alan Stern
>>>
>>
>> Hi Alan,
>>
>> blk_queue_enter() always - especially when sd is runtime suspended and I
>> try to mount as above - sets success to be true for me, so never
>> continues down to bkl_pm_request_resume(). All I see is "PM: Removing
>> info for No Bus:sda1".
>
> Aha. Looking at this more closely, it's apparent that the code in
> blk-core.c contains a logic bug: It assumes that if the BLK_MQ_REQ_PREEMPT
> flag is set then the request can be issued regardless of the queue's
> runtime status. That is not correct when the queue is suspended.
>
> Below is my attempt to fix this up. I'm not sure that the patch is
> entirely correct, but it should fix this logic bug. I would appreciate a
> critical review.
>
> Martin, does this fix the problem?
>

not quite: mounting works and resuming itself indeed happens now when
copying a file, but the I/O itself doesn't, but says "device offline or
changed":

[ 167.167615] sd 0:0:0:0: [sda] tag#0 UNKNOWN(0x2003) Result:
hostbyte=0x00 driverbyte=0x08 cmd_age=0s
[ 167.167630] sd 0:0:0:0: [sda] tag#0 Sense Key : 0x6 [current]
[ 167.167638] sd 0:0:0:0: [sda] tag#0 ASC=0x28 ASCQ=0x0
[ 167.167648] sd 0:0:0:0: [sda] tag#0 CDB: opcode=0x28 28 00 00 00 24
c2 00 00 01 00
[ 167.167658] blk_update_request: I/O error, dev sda, sector 9410 op
0x0:(READ) flags 0x0 phys_seg 1 prio class 0
[ 167.178327] FAT-fs (sda1): FAT read failed (blocknr 1218)
[ 167.183895] sd 0:0:0:0: [sda] tag#0 device offline or changed
[ 167.189695] blk_update_request: I/O error, dev sda, sector 5101888 op
0x0:(READ) flags 0x80700 phys_seg 8 prio class 0
[ 167.200510] sd 0:0:0:0: [sda] tag#0 device offline or changed


and a later try to copy a file only yields (mostly my own debug prints):


[ 371.110798] blk_queue_enter: wait_event: pm=0
[ 371.300666] scsi_runtime_resume
[ 371.303834] scsi_runtime_resume
[ 371.307007] scsi_runtime_resume
[ 371.310213] sd 0:0:0:0: [sda] tag#0 device offline or changed
[ 371.316011] blk_update_request: I/O error, dev sda, sector 5101888 op
0x0:(READ) flags 0x0 phys_seg 1 prio class 0
[ 372.560690] scsi_runtime_suspend
[ 372.563968] scsi_runtime_suspend
[ 372.567237] scsi_runtime_suspend

thanks Alan for taking the time and trying to fix this! you're close.
what is missing?

martin