mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
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>
This commit is contained in:
parent
916f138840
commit
4c2fdf7393
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user