scsi: libsas: Resume host while sending SMP I/Os
authorXiang Chen <chenxiang66@hisilicon.com>
Mon, 20 Dec 2021 11:21:32 +0000 (19:21 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 23 Dec 2021 04:38:30 +0000 (23:38 -0500)
When sending SMP I/Os to the host we need to ensure that the host is not
suspended and can process the commands. This is a better approach than
replying on the host to resume itself to handle such commands. Use
pm_runtime_get_sync() and pm_runtime_put_sync() calls for the host when
executing SMP I/Os.

Link: https://lore.kernel.org/r/1639999298-244569-10-git-send-email-chenxiang66@hisilicon.com
Reviewed-by: John Garry <john.garry@huawei.com>
Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/libsas/sas_expander.c
drivers/scsi/libsas/sas_internal.h

index c2150a8..6abce9d 100644 (file)
@@ -58,7 +58,9 @@ static int smp_execute_task_sg(struct domain_device *dev,
        struct sas_task *task = NULL;
        struct sas_internal *i =
                to_sas_internal(dev->port->ha->core.shost->transportt);
+       struct sas_ha_struct *ha = dev->port->ha;
 
+       pm_runtime_get_sync(ha->dev);
        mutex_lock(&dev->ex_dev.cmd_mutex);
        for (retry = 0; retry < 3; retry++) {
                if (test_bit(SAS_DEV_GONE, &dev->state)) {
@@ -131,6 +133,7 @@ static int smp_execute_task_sg(struct domain_device *dev,
                }
        }
        mutex_unlock(&dev->ex_dev.cmd_mutex);
+       pm_runtime_put_sync(ha->dev);
 
        BUG_ON(retry == 3 && task != NULL);
        sas_free_task(task);
index d7a1fb5..ad9764a 100644 (file)
@@ -14,6 +14,7 @@
 #include <scsi/scsi_transport_sas.h>
 #include <scsi/libsas.h>
 #include <scsi/sas_ata.h>
+#include <linux/pm_runtime.h>
 
 #ifdef pr_fmt
 #undef pr_fmt