On 6/16/23 12:31, Kai-Heng Feng wrote: > On Thu, Jun 15, 2023 at 4:33 PM Damien Le Moal <dlemoal@xxxxxxxxxx> wrote: >> >> When an ATA port is resumed from sleep, the port is reset and a power >> management request issued to libata EH to reset the port and rescanning >> the device(s) attached to the port. Device rescanning is done by >> scheduling an ata_scsi_dev_rescan() work, which will execute >> scsi_rescan_device(). >> >> However, scsi_rescan_device() takes the generic device lock, which is >> also taken by dpm_resume() when the SCSI device is resumed as well. If >> a device rescan execution starts before the completion of the SCSI >> device resume, the rcu locking used to refresh the cached VPD pages of >> the device, combined with the generic device locking from >> scsi_rescan_device() and from dpm_resume() can cause a deadlock. >> >> Avoid this situation by changing struct ata_port scsi_rescan_task to be >> a delayed work instead of a simple work_struct. ata_scsi_dev_rescan() is >> modified to check if the SCSI device associated with the ATA device that >> must be rescanned is not suspended. If the SCSI device is still >> suspended, ata_scsi_dev_rescan() returns early and reschedule itself for >> execution after an arbitrary delay of 5ms. >> >> Reported-by: Kai-Heng Feng <kai.heng.feng@xxxxxxxxxxxxx> >> Reported-by: Joe Breuer <linux-kernel@xxxxxxxxxxxx> >> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217530 >> Fixes: a19a93e4c6a9 ("scsi: core: pm: Rely on the device driver core for async power management") >> Signed-off-by: Damien Le Moal <dlemoal@xxxxxxxxxx> > > Tested-by: Kai-Heng Feng <kai.heng.feng@xxxxxxxxxxxxx> Thanks ! Joe, Did you have a chance to test ? -- Damien Le Moal Western Digital Research