lkml.org 
[lkml]   [2020]   [Aug]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v7] scsi: ufs: Quiesce all scsi devices before shutdown
    From
    Date
    On 2020-08-03 03:04, Stanley Chu wrote:
    > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
    > index 307622284239..7cb220b3fde0 100644
    > --- a/drivers/scsi/ufs/ufshcd.c
    > +++ b/drivers/scsi/ufs/ufshcd.c
    > @@ -8640,6 +8640,7 @@ EXPORT_SYMBOL(ufshcd_runtime_idle);
    > int ufshcd_shutdown(struct ufs_hba *hba)
    > {
    > int ret = 0;
    > + struct scsi_target *starget;
    >
    > if (!hba->is_powered)
    > goto out;
    > @@ -8647,11 +8648,27 @@ int ufshcd_shutdown(struct ufs_hba *hba)
    > if (ufshcd_is_ufs_dev_poweroff(hba) && ufshcd_is_link_off(hba))
    > goto out;
    >
    > - if (pm_runtime_suspended(hba->dev)) {
    > - ret = ufshcd_runtime_resume(hba);
    > - if (ret)
    > - goto out;
    > - }
    > + /*
    > + * Let runtime PM framework manage and prevent concurrent runtime
    > + * operations with shutdown flow.
    > + */
    > + pm_runtime_get_sync(hba->dev);
    > +
    > + /*
    > + * Quiesce all SCSI devices to prevent any non-PM requests sending
    > + * from block layer during and after shutdown.
    > + *
    > + * Here we can not use blk_cleanup_queue() since PM requests
    > + * (with BLK_MQ_REQ_PREEMPT flag) are still required to be sent
    > + * through block layer. Therefore SCSI command queued after the
    > + * scsi_target_quiesce() call returned will block until
    > + * blk_cleanup_queue() is called.
    > + *
    > + * Besides, scsi_target_"un"quiesce (e.g., scsi_target_resume) can
    > + * be ignored since shutdown is one-way flow.
    > + */
    > + list_for_each_entry(starget, &hba->host->__targets, siblings)
    > + scsi_target_quiesce(starget);
    >
    > ret = ufshcd_suspend(hba, UFS_SHUTDOWN_PM);
    > out:

    This seems wrong to me. Since ufshcd_shutdown() shuts down the link I think
    it should call scsi_remove_device() instead of scsi_target_quiesce().

    Thanks,

    Bart.


    \
     
     \ /
      Last update: 2020-08-03 18:05    [W:3.122 / U:1.376 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site