Re: [PATCH v3] scsi: libsas: fix HA resume deadlock and hisi_sas disk-wake race
From: John Garry
Date: Thu Jul 16 2026 - 07:05:06 EST
On 16/07/2026 09:11, Xingui Yang wrote:
Commit fbefe22811c3140 ("scsi: libsas: Don't always drain event workqueue
for HA resume") introduced sas_resume_ha_no_sync() to avoid a deadlock:
the PHYE_RESUME_TIMEOUT handler, running on the HA event workqueue, calls
sas_deform_port() -> sas_destruct_devices(), which removes SCSI devices and
waits for the host to become runtime-active. But the host cannot resume
until sas_resume_ha() -> sas_drain_work() returns, and the drain is blocked
on that very handler.
However skipping the drain reintroduces a race: hisi_sas returns from
resume before all PHY UP work and libsas discovery work finish. The
controller may then autosuspend while disks are still waking up. The disks
issue IO to a suspended controller, the IO fails, and the disks get
disabled.
Fix the deadlock at its source by moving the PHYE_RESUME_TIMEOUT
notification to after sas_drain_work(). By then the host resume is about to
complete, so device removal through device_link no longer blocks on the
resume and the cycle is broken.
With the deadlock gone, restore sas_resume_ha() (the draining variant) in
hisi_sas and remove sas_resume_ha_no_sync().
The reorder is safe for the other libsas consumers (isci, pm8001, aic94xx,
mvsas). During suspend, sas_suspend_devices() calls
sas_notify_lldd_dev_gone() for each device, which sets dev->lldd_dev to
NULL. When scsi_unblock_requests re-enables I/O in resume, any I/O to a
timed-out phy's disk is immediately rejected by the LLDD before reaching
hardware: isci returns SAS_DEVICE_UNKNOWN (mapped to DID_BAD_TARGET), and
pm8001 returns SAS_PHY_DOWN (mapped to DID_NO_CONNECT). Both complete
directly via scsi_done() without entering SCSI EH. This is identical in
both the old and new ordering since lldd_dev_gone runs during suspend,
before resume. The reorder only affects when the PHYE_RESUME_TIMEOUT
handler runs (synchronized by sas_drain_work() vs. asynchronous after
resume returns), not whether I/O can reach the device. aic94xx and mvsas
do not register any PM ops and never reach this code path.
Fixes: fbefe22811c3140 ("scsi: libsas: Don't always drain event workqueue for HA resume")
Signed-off-by: Xingui Yang<yangxingui@xxxxxxxxxx>
Can this possibly be tested on another SCSI HBA which uses libsas? And using SATA disks.