]> www.infradead.org Git - users/hch/misc.git/commitdiff
scsi: ufs: core: Fix runtime suspend error deadlock
authorPeter Wang <peter.wang@mediatek.com>
Fri, 26 Sep 2025 01:29:26 +0000 (09:29 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 29 Sep 2025 20:51:40 +0000 (16:51 -0400)
Resolve the deadlock issue during runtime suspend when an error triggers
the error handler. Prevent the deadlock by checking pm_op_in_progress
and performing a quick recovery.  This approach ensures that the error
handler does not wait indefinitely for runtime PM to resume, allowing
runtime suspend to proceed smoothly.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Suggested-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Message-Id: <20250926012940.3933367-1-peter.wang@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c

index b2e103aa4e621a24d0cee938ed7edd68f5dd4672..fd7defb3e2cf4a3fdd687318918bc692f450f0c8 100644 (file)
@@ -6673,6 +6673,14 @@ static void ufshcd_err_handler(struct work_struct *work)
        }
        spin_unlock_irqrestore(hba->host->host_lock, flags);
 
+       ufshcd_rpm_get_noresume(hba);
+       if (hba->pm_op_in_progress) {
+               ufshcd_link_recovery(hba);
+               ufshcd_rpm_put(hba);
+               return;
+       }
+       ufshcd_rpm_put(hba);
+
        ufshcd_err_handling_prepare(hba);
 
        spin_lock_irqsave(hba->host->host_lock, flags);