diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 52b25f2356f2..3a98702b7445 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c @@ -84,7 +84,6 @@ static inline struct acpi_processor_performance *to_perf_data(struct acpi_cpufre static struct cpufreq_driver acpi_cpufreq_driver; static unsigned int acpi_pstate_strict; -static struct msr __percpu *msrs; static bool boost_state(unsigned int cpu) { @@ -104,11 +103,10 @@ static bool boost_state(unsigned int cpu) return false; } -static void boost_set_msrs(bool enable, const struct cpumask *cpumask) +static int boost_set_msr(bool enable) { - u32 cpu; u32 msr_addr; - u64 msr_mask; + u64 msr_mask, val; switch (boot_cpu_data.x86_vendor) { case X86_VENDOR_INTEL: @@ -120,26 +118,31 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask) msr_mask = MSR_K7_HWCR_CPB_DIS; break; default: - return; + return -EINVAL; } - rdmsr_on_cpus(cpumask, msr_addr, msrs); + rdmsrl(msr_addr, val); - for_each_cpu(cpu, cpumask) { - struct msr *reg = per_cpu_ptr(msrs, cpu); - if (enable) - reg->q &= ~msr_mask; - else - reg->q |= msr_mask; - } + if (enable) + val &= ~msr_mask; + else + val |= msr_mask; - wrmsr_on_cpus(cpumask, msr_addr, msrs); + wrmsrl(msr_addr, val); + return 0; +} + +static void boost_set_msr_each(void *p_en) +{ + bool enable = (bool) p_en; + + boost_set_msr(enable); } static int set_boost(int val) { get_online_cpus(); - boost_set_msrs(val, cpu_online_mask); + on_each_cpu(boost_set_msr_each, (void *)(long)val, 1); put_online_cpus(); pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis"); @@ -538,29 +541,20 @@ static void free_acpi_perf_data(void) static int cpufreq_boost_online(unsigned int cpu) { - const struct cpumask *cpumask; - - cpumask = get_cpu_mask(cpu); /* * On the CPU_UP path we simply keep the boost-disable flag * in sync with the current global state. */ - boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask); - return 0; + return boost_set_msr(acpi_cpufreq_driver.boost_enabled); } static int cpufreq_boost_down_prep(unsigned int cpu) { - const struct cpumask *cpumask; - - cpumask = get_cpu_mask(cpu); - /* * Clear the boost-disable bit on the CPU_DOWN path so that * this cpu cannot block the remaining ones from boosting. */ - boost_set_msrs(1, cpumask); - return 0; + return boost_set_msr(1); } /* @@ -918,11 +912,6 @@ static void __init acpi_cpufreq_boost_init(void) if (!(boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA))) return; - msrs = msrs_alloc(); - - if (!msrs) - return; - acpi_cpufreq_driver.set_boost = set_boost; acpi_cpufreq_driver.boost_enabled = boost_state(0); @@ -934,8 +923,6 @@ static void __init acpi_cpufreq_boost_init(void) cpufreq_boost_online, cpufreq_boost_down_prep); if (ret < 0) { pr_err("acpi_cpufreq: failed to register hotplug callbacks\n"); - msrs_free(msrs); - msrs = NULL; return; } acpi_cpufreq_online = ret; @@ -943,14 +930,8 @@ static void __init acpi_cpufreq_boost_init(void) static void acpi_cpufreq_boost_exit(void) { - if (!msrs) - return; - if (acpi_cpufreq_online >= 0) cpuhp_remove_state_nocalls(acpi_cpufreq_online); - - msrs_free(msrs); - msrs = NULL; } static int __init acpi_cpufreq_init(void)