[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 2/3] x86/cpufreq: Rework APERF/MPERF handling
Currently, each feature_detect() (called on CPU add) hook for both cpufreq drivers duplicates cpu_has_aperfmperf in a per-cpu datastructure, and edits cpufreq_driver.getavg to point at get_measured_perf(). As all parts of this are vendor-neutral, drop the function pointer and duplicated boolean, and call get_measured_perf() directly. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Wei Liu <wl@xxxxxxx> Slightly RFC. This does introduce an arch-specific call into a nominally arch-neutral driver, but struct cpufreq_policy already had x86-specifics in it so this is apparently ok. A (less desirable) alternative would be to keep the function pointer, and patch it in the BSP path, not every AP based on BSP data. Either way, with patching moved out of feature_detect(), the main cpufreq_driver object can become __ro_after_init (in principle), and all calls optimised with alternative_call(). --- xen/arch/x86/acpi/cpufreq/cpufreq.c | 8 +------- xen/arch/x86/acpi/cpufreq/powernow.c | 6 ------ xen/drivers/cpufreq/utility.c | 9 +++------ xen/include/acpi/cpufreq/cpufreq.h | 2 -- 4 files changed, 4 insertions(+), 21 deletions(-) diff --git a/xen/arch/x86/acpi/cpufreq/cpufreq.c b/xen/arch/x86/acpi/cpufreq/cpufreq.c index 2251c87f9e42..f26cd6649e7a 100644 --- a/xen/arch/x86/acpi/cpufreq/cpufreq.c +++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c @@ -275,7 +275,7 @@ unsigned int get_measured_perf(unsigned int cpu, unsigned int flag) return 0; policy = per_cpu(cpufreq_cpu_policy, cpu); - if (!policy || !policy->aperf_mperf) + if ( !policy || !cpu_has_aperfmperf ) return 0; switch (flag) @@ -345,12 +345,6 @@ static void feature_detect(void *info) struct cpufreq_policy *policy = info; unsigned int eax; - if ( cpu_has_aperfmperf ) - { - policy->aperf_mperf = 1; - cpufreq_driver.getavg = get_measured_perf; - } - eax = cpuid_eax(6); if (eax & 0x2) { policy->turbo = CPUFREQ_TURBO_ENABLED; diff --git a/xen/arch/x86/acpi/cpufreq/powernow.c b/xen/arch/x86/acpi/cpufreq/powernow.c index 80095dfd14b4..82d7827e17c1 100644 --- a/xen/arch/x86/acpi/cpufreq/powernow.c +++ b/xen/arch/x86/acpi/cpufreq/powernow.c @@ -205,12 +205,6 @@ static void feature_detect(void *info) struct cpufreq_policy *policy = info; unsigned int edx; - if ( cpu_has_aperfmperf ) - { - policy->aperf_mperf = 1; - cpufreq_driver.getavg = get_measured_perf; - } - edx = cpuid_edx(CPUID_FREQ_VOLT_CAPABILITIES); if ((edx & CPB_CAPABLE) == CPB_CAPABLE) { policy->turbo = CPUFREQ_TURBO_ENABLED; diff --git a/xen/drivers/cpufreq/utility.c b/xen/drivers/cpufreq/utility.c index b93895d4dddc..9eb7ecedcd29 100644 --- a/xen/drivers/cpufreq/utility.c +++ b/xen/drivers/cpufreq/utility.c @@ -381,12 +381,9 @@ int cpufreq_driver_getavg(unsigned int cpu, unsigned int flag) if (!cpu_online(cpu) || !(policy = per_cpu(cpufreq_cpu_policy, cpu))) return 0; - if (cpufreq_driver.getavg) - { - freq_avg = cpufreq_driver.getavg(cpu, flag); - if (freq_avg > 0) - return freq_avg; - } + freq_avg = get_measured_perf(cpu, flag); + if ( freq_avg > 0 ) + return freq_avg; return policy->cur; } diff --git a/xen/include/acpi/cpufreq/cpufreq.h b/xen/include/acpi/cpufreq/cpufreq.h index e88b20bfed4f..4958d3f7d315 100644 --- a/xen/include/acpi/cpufreq/cpufreq.h +++ b/xen/include/acpi/cpufreq/cpufreq.h @@ -72,7 +72,6 @@ struct cpufreq_policy { s8 turbo; /* tristate flag: 0 for unsupported * -1 for disable, 1 for enabled * See CPUFREQ_TURBO_* below for defines */ - bool_t aperf_mperf; /* CPU has APERF/MPERF MSRs */ }; DECLARE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_policy); @@ -162,7 +161,6 @@ struct cpufreq_driver { unsigned int target_freq, unsigned int relation); unsigned int (*get)(unsigned int cpu); - unsigned int (*getavg)(unsigned int cpu, unsigned int flag); int (*exit)(struct cpufreq_policy *policy); }; -- 2.11.0
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |