> 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html