OSDN Git Service

scsi: hisi_sas: Undo RPM resume for failed notify phy event for v3 HW
authorXiang Chen <chenxiang66@hisilicon.com>
Fri, 6 May 2022 12:25:39 +0000 (20:25 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 11 May 2022 01:47:55 +0000 (21:47 -0400)
If we fail to notify the phy up event then undo the RPM resume, as the phy
up notify event handling pairs with that RPM resume.

Link: https://lore.kernel.org/r/1651839939-101188-1-git-send-email-john.garry@huawei.com
Reported-by: Yihang Li <liyihang6@hisilicon.com>
Tested-by: Yihang Li <liyihang6@hisilicon.com>
Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c

index 79f87d7..7d819fc 100644 (file)
@@ -1563,9 +1563,15 @@ static irqreturn_t phy_up_v3_hw(int phy_no, struct hisi_hba *hisi_hba)
 
        phy->port_id = port_id;
 
-       /* Call pm_runtime_put_sync() with pairs in hisi_sas_phyup_pm_work() */
+       /*
+        * Call pm_runtime_get_noresume() which pairs with
+        * hisi_sas_phyup_pm_work() -> pm_runtime_put_sync().
+        * For failure call pm_runtime_put() as we are in a hardirq context.
+        */
        pm_runtime_get_noresume(dev);
-       hisi_sas_notify_phy_event(phy, HISI_PHYE_PHY_UP_PM);
+       res = hisi_sas_notify_phy_event(phy, HISI_PHYE_PHY_UP_PM);
+       if (!res)
+               pm_runtime_put(dev);
 
        res = IRQ_HANDLED;