aboutsummaryrefslogtreecommitdiff
path: root/drivers/cpufreq/pcc-cpufreq.c
diff options
context:
space:
mode:
authorGravatar Liao Chang <liaochang1@huawei.com> 2023-08-26 09:57:43 +0000
committerGravatar Rafael J. Wysocki <rafael.j.wysocki@intel.com> 2023-08-29 20:41:29 +0200
commit4c2fdf7393647a7b01a83f49c4a331d562016640 (patch)
treecedfea0660e686d0049467d67d8f4fb5ec9e01ae /drivers/cpufreq/pcc-cpufreq.c
parentcpufreq: governor: Free dbs_data directly when gov->init() fails (diff)
downloadlinux-4c2fdf7393647a7b01a83f49c4a331d562016640.tar.gz
linux-4c2fdf7393647a7b01a83f49c4a331d562016640.tar.bz2
linux-4c2fdf7393647a7b01a83f49c4a331d562016640.zip
cpufreq: pcc: Fix the potentinal scheduling delays in target_index()
pcc_cpufreq_target(): cpufreq_freq_transition_begin(); spin_lock(&pcc_lock); [critical section] cpufreq_freq_transition_end(); spin_unlock(&pcc_lock); Above code has a performance issue, consider that Task0 executes 'cpufreq_freq_transition_end()' to wake Task1 and preempted imediatedly without releasing 'pcc_lock', then Task1 needs to wait for Task0 to release 'pcc_lock'. In the worst case, this locking order can result in Task1 wasting two scheduling rounds before it can enter the critical section. Signed-off-by: Liao Chang <liaochang1@huawei.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpufreq/pcc-cpufreq.c')
-rw-r--r--drivers/cpufreq/pcc-cpufreq.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/cpufreq/pcc-cpufreq.c b/drivers/cpufreq/pcc-cpufreq.c
index 84fe37def0f1..6f8b5ea7aeae 100644
--- a/drivers/cpufreq/pcc-cpufreq.c
+++ b/drivers/cpufreq/pcc-cpufreq.c
@@ -232,8 +232,8 @@ static int pcc_cpufreq_target(struct cpufreq_policy *policy,
status = ioread16(&pcch_hdr->status);
iowrite16(0, &pcch_hdr->status);
- cpufreq_freq_transition_end(policy, &freqs, status != CMD_COMPLETE);
spin_unlock(&pcc_lock);
+ cpufreq_freq_transition_end(policy, &freqs, status != CMD_COMPLETE);
if (status != CMD_COMPLETE) {
pr_debug("target: FAILED for cpu %d, with status: 0x%x\n",