No reason for it to be a separate per-CPU item; it's connected to a
struct cpufreq_policy instance just like other driver data.
This also eliminates the concern over amd_cppc_cpufreq_cpu_init() being
called for all CPUs, or a CPU going offline that's recorded in policy->cpu
(which would result in accesses of per-CPU data of offline CPUs).
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/arch/x86/acpi/cpufreq/amd-cppc.c
+++ b/xen/arch/x86/acpi/cpufreq/amd-cppc.c
@@ -30,11 +30,6 @@
printk(XENLOG_DEBUG "AMD-CPPC: CPU%u " fmt, cpu, ## args); \
})
-/*
- * Core max frequency read from PstateDef as anchor point
- * for freq-to-perf transition
- */
-static DEFINE_PER_CPU_READ_MOSTLY(unsigned int, pxfreq_mhz);
#ifndef NDEBUG
static bool __ro_after_init opt_active_mode;
#else
@@ -117,7 +112,7 @@ static int amd_cppc_khz_to_perf(const st
{
/* Read Processor Max Speed(MHz) as anchor point */
mul = data->caps.highest_perf;
- div = this_cpu(pxfreq_mhz);
+ div = data->pxfreq_mhz;
if ( !div )
return -EOPNOTSUPP;
}
@@ -160,7 +155,7 @@ static int amd_get_cpc_freq(const struct
}
/* Read Processor Max Speed(MHz) as anchor point */
- mul = this_cpu(pxfreq_mhz);
+ mul = data->pxfreq_mhz;
if ( !mul )
return -EOPNOTSUPP;
div = data->caps.highest_perf;
@@ -287,7 +282,7 @@ static void cf_check amd_cppc_init_msrs(
}
amd_process_freq(&cpu_data[policy->cpu],
- NULL, NULL, &this_cpu(pxfreq_mhz));
+ NULL, NULL, &data->pxfreq_mhz);
data->err = amd_get_cpc_freq(data, data->cppc_data->cpc.lowest_mhz,
data->caps.lowest_perf, &min_freq);
--- a/xen/include/acpi/cpufreq/cpufreq.h
+++ b/xen/include/acpi/cpufreq/cpufreq.h
@@ -145,6 +145,12 @@ struct amd_cppc_drv_data {
uint8_t epp_init;
+ /*
+ * Core max frequency read from PstateDef as anchor point
+ * for freq-to-perf transition
+ */
+ unsigned int pxfreq_mhz;
+
int err;
};