On 03/24/2013 02:48 PM, Viresh Kumar wrote: > policy->cpus contains all online cpus that have single shared clock line. And > their frequencies are always updated together. > > Many SMP system's cpufreq drivers take care of this in individual drivers but > the best place for this code is in cpufreq core. > > This patch modifies cpufreq_notify_transition() to notify frequency change for > all cpus in policy->cpus and hence updates all users of this API. > > Signed-off-by: Viresh Kumar <viresh.kumar@xxxxxxxxxx> > Cc: Sekhar Nori <nsekhar@xxxxxx> > Cc: Sascha Hauer <kernel@xxxxxxxxxxxxxx> > Cc: Eric Miao <eric.y.miao@xxxxxxxxx> > Cc: Haojian Zhuang <haojian.zhuang@xxxxxxxxx> > Cc: Ben Dooks <ben-linux@xxxxxxxxx> > Cc: Kukjin Kim <kgene.kim@xxxxxxxxxxx> > Cc: Stephen Warren <swarren@xxxxxxxxxxxxx> > Cc: Haavard Skinnemoen <hskinnemoen@xxxxxxxxx> > Cc: Hans-Christian Egtvedt <egtvedt@xxxxxxxxxxxx> > Cc: Mike Frysinger <vapier@xxxxxxxxxx> > Cc: Mikael Starvik <starvik@xxxxxxxx> > Cc: Jesper Nilsson <jesper.nilsson@xxxxxxxx> > Cc: Tony Luck <tony.luck@xxxxxxxxx> > Cc: Fenghua Yu <fenghua.yu@xxxxxxxxx> > Cc: Arnd Bergmann <arnd@xxxxxxxx> > Cc: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> > Cc: Ralf Baechle <ralf@xxxxxxxxxxxxxx> > Cc: Paul Mundt <lethal@xxxxxxxxxxxx> > Cc: David S. Miller <davem@xxxxxxxxxxxxx> > Cc: Thomas Renninger <trenn@xxxxxxx> > Cc: Borislav Petkov <bp@xxxxxxxxx> > Cc: Guan Xuetao <gxt@xxxxxxxxxxxxxxx> > Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > Cc: linux-cris-kernel@xxxxxxxx > Cc: linux-ia64@xxxxxxxxxxxxxxx > Cc: linuxppc-dev@xxxxxxxxxxxxxxxx > Cc: cbe-oss-dev@xxxxxxxxxxxxxxxx > Cc: linux-mips@xxxxxxxxxxxxxx > Cc: linux-sh@xxxxxxxxxxxxxxx > Cc: sparclinux@xxxxxxxxxxxxxxx > Cc: linux-kernel@xxxxxxxxxxxxxxx > --- > arch/arm/mach-davinci/cpufreq.c | 5 +- > arch/arm/mach-imx/cpufreq.c | 5 +- > arch/arm/mach-integrator/cpu.c | 6 +-- > arch/arm/mach-pxa/cpufreq-pxa2xx.c | 5 +- > arch/arm/mach-pxa/cpufreq-pxa3xx.c | 5 +- > arch/arm/mach-s3c24xx/cpufreq.c | 8 +-- > arch/arm/mach-sa1100/cpu-sa1100.c | 5 +- > arch/arm/mach-sa1100/cpu-sa1110.c | 5 +- > arch/arm/mach-tegra/cpu-tegra.c | 6 +-- > arch/avr32/mach-at32ap/cpufreq.c | 5 +- > arch/blackfin/mach-common/cpufreq.c | 79 ++++++++++++---------------- > arch/cris/arch-v32/mach-a3/cpufreq.c | 20 +++---- > arch/cris/arch-v32/mach-fs/cpufreq.c | 17 +++--- > arch/ia64/kernel/cpufreq/acpi-cpufreq.c | 22 ++++---- > arch/mips/kernel/cpufreq/loongson2_cpufreq.c | 5 +- > arch/powerpc/platforms/cell/cbe_cpufreq.c | 5 +- > arch/powerpc/platforms/pasemi/cpufreq.c | 5 +- > arch/powerpc/platforms/powermac/cpufreq_32.c | 14 ++--- > arch/powerpc/platforms/powermac/cpufreq_64.c | 5 +- > arch/sh/kernel/cpufreq.c | 5 +- > arch/sparc/kernel/us2e_cpufreq.c | 13 ++--- > arch/sparc/kernel/us3_cpufreq.c | 13 ++--- > arch/unicore32/kernel/cpu-ucv2.c | 5 +- > drivers/cpufreq/acpi-cpufreq.c | 11 +--- > drivers/cpufreq/cpufreq-cpu0.c | 12 ++--- > drivers/cpufreq/cpufreq-nforce2.c | 5 +- > drivers/cpufreq/cpufreq.c | 45 +++++++++------- > drivers/cpufreq/dbx500-cpufreq.c | 6 +-- > drivers/cpufreq/e_powersaver.c | 11 ++-- > drivers/cpufreq/elanfreq.c | 10 ++-- > drivers/cpufreq/exynos-cpufreq.c | 7 +-- > drivers/cpufreq/gx-suspmod.c | 11 ++-- > drivers/cpufreq/imx6q-cpufreq.c | 12 ++--- > drivers/cpufreq/kirkwood-cpufreq.c | 10 ++-- > drivers/cpufreq/longhaul.c | 18 ++++--- > drivers/cpufreq/maple-cpufreq.c | 5 +- > drivers/cpufreq/omap-cpufreq.c | 11 +--- > drivers/cpufreq/p4-clockmod.c | 10 +--- > drivers/cpufreq/pcc-cpufreq.c | 5 +- > drivers/cpufreq/powernow-k6.c | 12 ++--- > drivers/cpufreq/powernow-k7.c | 10 ++-- > drivers/cpufreq/powernow-k8.c | 16 +++--- > drivers/cpufreq/s3c2416-cpufreq.c | 5 +- > drivers/cpufreq/s3c64xx-cpufreq.c | 7 ++- > drivers/cpufreq/s5pv210-cpufreq.c | 5 +- > drivers/cpufreq/sc520_freq.c | 10 ++-- > drivers/cpufreq/spear-cpufreq.c | 7 +-- > drivers/cpufreq/speedstep-centrino.c | 24 ++------- > drivers/cpufreq/speedstep-ich.c | 12 +---- > drivers/cpufreq/speedstep-smi.c | 5 +- > include/linux/cpufreq.h | 4 +- > 51 files changed, 232 insertions(+), 337 deletions(-) [...] > diff --git a/arch/blackfin/mach-common/cpufreq.c b/arch/blackfin/mach-common/cpufreq.c > index d88bd31..4e67368 100644 > --- a/arch/blackfin/mach-common/cpufreq.c > +++ b/arch/blackfin/mach-common/cpufreq.c > @@ -127,13 +127,13 @@ unsigned long cpu_set_cclk(int cpu, unsigned long new) > } > #endif > > -static int bfin_target(struct cpufreq_policy *poli, > +static int bfin_target(struct cpufreq_policy *policy, > unsigned int target_freq, unsigned int relation) > { > #ifndef CONFIG_BF60x > unsigned int plldiv; > #endif > - unsigned int index, cpu; > + unsigned int index; > unsigned long cclk_hz; > struct cpufreq_freqs freqs; > static unsigned long lpj_ref; > @@ -144,59 +144,48 @@ static int bfin_target(struct cpufreq_policy *poli, > cycles_t cycles; > #endif > > - for_each_online_cpu(cpu) { > - struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); > + if (cpufreq_frequency_table_target(policy, bfin_freq_table, target_freq, > + relation, &index)) > + return -EINVAL; > > - if (!policy) > - continue; > + cclk_hz = bfin_freq_table[index].frequency; > > - if (cpufreq_frequency_table_target(policy, bfin_freq_table, > - target_freq, relation, &index)) > - return -EINVAL; > + freqs.old = bfin_getfreq_khz(0); > + freqs.new = cclk_hz; > > - cclk_hz = bfin_freq_table[index].frequency; > + pr_debug("cpufreq: changing cclk to %lu; target = %u, oldfreq = %u\n", > + cclk_hz, target_freq, freqs.old); > > - freqs.old = bfin_getfreq_khz(0); > - freqs.new = cclk_hz; > - freqs.cpu = cpu; > - > - pr_debug("cpufreq: changing cclk to %lu; target = %u, oldfreq = %u\n", > - cclk_hz, target_freq, freqs.old); > - > - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); > - if (cpu == CPUFREQ_CPU) { > + cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE); > #ifndef CONFIG_BF60x > - plldiv = (bfin_read_PLL_DIV() & SSEL) | > - dpm_state_table[index].csel; > - bfin_write_PLL_DIV(plldiv); > + plldiv = (bfin_read_PLL_DIV() & SSEL) | dpm_state_table[index].csel; > + bfin_write_PLL_DIV(plldiv); > #else > - ret = cpu_set_cclk(cpu, freqs.new * 1000); > - if (ret != 0) { > - WARN_ONCE(ret, "cpufreq set freq failed %d\n", ret); > - break; > - } > + ret = cpu_set_cclk(policy->cpu, freqs.new * 1000); > + if (ret != 0) { > + WARN_ONCE(ret, "cpufreq set freq failed %d\n", ret); > + break; This doesn't even compile, as the break statement isn't in the for_each_online_cpu() loop anymore. -- Francesco