Commit b6645112 authored by Jaegeuk Kim's avatar Jaegeuk Kim Committed by Martin K. Petersen

scsi: ufs: Atomic update for clkgating_enable

While running a stress test which enables/disables clkgating, we
occasionally hit device timeout. This patch avoids a subtle race condition
to address it.

Link: https://lore.kernel.org/r/20201117165839.1643377-3-jaegeuk@kernel.orgReviewed-by: default avatarCan Guo <cang@codeaurora.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@google.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent fd62de11
...@@ -1818,19 +1818,19 @@ static ssize_t ufshcd_clkgate_enable_store(struct device *dev, ...@@ -1818,19 +1818,19 @@ static ssize_t ufshcd_clkgate_enable_store(struct device *dev,
return -EINVAL; return -EINVAL;
value = !!value; value = !!value;
spin_lock_irqsave(hba->host->host_lock, flags);
if (value == hba->clk_gating.is_enabled) if (value == hba->clk_gating.is_enabled)
goto out; goto out;
if (value) { if (value)
ufshcd_release(hba); __ufshcd_release(hba);
} else { else
spin_lock_irqsave(hba->host->host_lock, flags);
hba->clk_gating.active_reqs++; hba->clk_gating.active_reqs++;
spin_unlock_irqrestore(hba->host->host_lock, flags);
}
hba->clk_gating.is_enabled = value; hba->clk_gating.is_enabled = value;
out: out:
spin_unlock_irqrestore(hba->host->host_lock, flags);
return count; return count;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment