lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 010/346] scsi: ufs: Make sure clk scaling happens only when HBA is runtime ACTIVE
    Date
    From: Can Guo <cang@codeaurora.org>

    [ Upstream commit 73cc291c270248567245f084dcdf5078069af6b5 ]

    If someone plays with the UFS clk scaling devfreq governor through sysfs,
    ufshcd_devfreq_scale may be called even when HBA is not runtime ACTIVE.
    This can lead to unexpected error. We cannot just protect it by calling
    pm_runtime_get_sync() because that may cause a race condition since HBA
    runtime suspend ops need to suspend clk scaling. To fix this call
    pm_runtime_get_noresume() and check HBA's runtime status. Only proceed if
    HBA is runtime ACTIVE, otherwise just bail.

    governor_store
    devfreq_performance_handler
    update_devfreq
    devfreq_set_target
    ufshcd_devfreq_target
    ufshcd_devfreq_scale

    Link: https://lore.kernel.org/r/1600758548-28576-1-git-send-email-cang@codeaurora.org
    Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
    Signed-off-by: Can Guo <cang@codeaurora.org>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/ufs/ufshcd.c | 7 +++++++
    1 file changed, 7 insertions(+)

    diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
    index 7e4e6e982055e..61b1eae42ea85 100644
    --- a/drivers/scsi/ufs/ufshcd.c
    +++ b/drivers/scsi/ufs/ufshcd.c
    @@ -1281,8 +1281,15 @@ static int ufshcd_devfreq_target(struct device *dev,
    }
    spin_unlock_irqrestore(hba->host->host_lock, irq_flags);

    + pm_runtime_get_noresume(hba->dev);
    + if (!pm_runtime_active(hba->dev)) {
    + pm_runtime_put_noidle(hba->dev);
    + ret = -EAGAIN;
    + goto out;
    + }
    start = ktime_get();
    ret = ufshcd_devfreq_scale(hba, scale_up);
    + pm_runtime_put(hba->dev);

    trace_ufshcd_profile_clk_scaling(dev_name(hba->dev),
    (scale_up ? "up" : "down"),
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 17:40    [W:4.449 / U:0.492 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site