> Hi Aaron,
>
> I found a race condition with the block layer runtime PM due to which
> the q->nr_pending is decremented to less than zero (0xFFFF_FFFF (-1))
> and hence the blk pre-runtime suspend always returns -EBUSY.
>
>
> The issue is easily reproduced with a scsi disk with disabled tagged
> command queuing
>
> sd_probe_async() ->
>       add_disk() ->
>               disk_add_event() ->
>                       schedule(disk_events_workfn)
>       sd_revalidate_disk()
>       blk_pm_runtime_init()
> return;
>
> Let's say the disk_events_workfn() calls sd_check_events() which tries
> to send test_unit_ready() and because of sd_revalidate_disk() trying to
> send another commands the test_unit_ready() might be re-queued as the
> tagged command queuing is disabled.
>
> So the race condition is -
>
> Thread 1                        |             Thread 2
> sd_revalidate_disk()            |     sd_check_events()
> ...nr_pending = 0 as q->dev = NULL|   scsi_queue_insert()
> blk_runtime_pm_init()           |     blk_pm_requeue_request() ->
>                                 |     nr_pending = -1 since
>                                 |     q->dev != NULL
>
> Do you have any suggestions on how to fix this issue?
>
>
> --
> Regards,
> Sujit
>


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to