summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/sched/core.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 76aa44c0bcfe..494c6cc518b0 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2481,18 +2481,24 @@ static int cpufreq_notifier_trans(struct notifier_block *nb,
{
struct cpufreq_freqs *freq = (struct cpufreq_freqs *)data;
unsigned int cpu = freq->cpu, new_freq = freq->new;
- struct rq *rq = cpu_rq(cpu);
unsigned long flags;
+ int i;
if (val != CPUFREQ_POSTCHANGE)
return 0;
BUG_ON(!new_freq);
- raw_spin_lock_irqsave(&rq->lock, flags);
- update_task_ravg(rq->curr, rq, TASK_UPDATE, sched_clock(), 0);
- cpu_rq(cpu)->cur_freq = new_freq;
- raw_spin_unlock_irqrestore(&rq->lock, flags);
+ if (cpu_rq(cpu)->cur_freq == new_freq)
+ return 0;
+
+ for_each_cpu(i, &cpu_rq(cpu)->freq_domain_cpumask) {
+ struct rq *rq = cpu_rq(i);
+ raw_spin_lock_irqsave(&rq->lock, flags);
+ update_task_ravg(rq->curr, rq, TASK_UPDATE, sched_clock(), 0);
+ rq->cur_freq = new_freq;
+ raw_spin_unlock_irqrestore(&rq->lock, flags);
+ }
return 0;
}