diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/core.c | 16 |
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; } |
