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