Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80d85e5d authored by Can Guo's avatar Can Guo
Browse files

scsi: ufs: Make sure clk scaling happens only when hba is runtime ACTIVE



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,
which can lead to unexpected error. We cannot just protect it by calling
pm_runtime_get_sync, because that may cause racing problem since hba
runtime suspend ops needs to suspend clk scaling. In order to fix it, call
pm_runtime_get_noresume and check hba's runtime status, then 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

Change-Id: I1345985d50bcb239b7af008f7d295de3d7581112
Signed-off-by: default avatarCan Guo <cang@codeaurora.org>
parent 4707ea1d
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1357,8 +1357,19 @@ static int ufshcd_devfreq_target(struct device *dev,
	}
	spin_unlock_irqrestore(hba->host->host_lock, irq_flags);

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

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