Use the respective host CPU policy bit instead. This has the (tolerable,
as we generally assume symmetry anyway) effect of using the BSP's
(unleveled) setting, rather than the result of leveling (as is done by
identify_cpu() on boot_cpu_data, rendering the variable name somewhat
misleading).
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
---
The leveling of boot_cpu_data is problematic anyway, as that way features
can in principle disappear post-boot (as CPUs are being brought online;
just that we don't think anymore that we really support physical CPU
hotplug).
---
v3: Re-base over naming changes.
v2: Extend description.
--- a/xen/arch/x86/acpi/cpufreq/cpufreq.c
+++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c
@@ -80,7 +80,7 @@ unsigned int get_measured_perf(unsigned
return 0;
policy = per_cpu(cpufreq_cpu_policy, cpu);
- if ( !policy || !cpu_has_aperfmperf )
+ if ( !policy || !cpu_has_hw_feedback_cap )
return 0;
switch (flag)
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -523,10 +523,6 @@ static void generic_identify(struct cpui
if ( cpu_has(c, X86_FEATURE_CLFLUSH) )
c->x86_clflush_size = ((ebx >> 8) & 0xff) * 8;
- if ( (c->cpuid_level >= CPUID_PM_LEAF) &&
- (cpuid_ecx(CPUID_PM_LEAF) & CPUID6_ECX_APERFMPERF_CAPABILITY) )
- __set_bit(X86_FEATURE_APERFMPERF, c->x86_capability);
-
/* AMD-defined flags: level 0x80000001 */
if (c->extended_cpuid_level >= 0x80000001)
cpuid(0x80000001, &tmp, &tmp,
--- a/xen/arch/x86/include/asm/cpufeature.h
+++ b/xen/arch/x86/include/asm/cpufeature.h
@@ -11,7 +11,9 @@
#include <xen/macros.h>
#ifndef __ASSEMBLER__
+#include <asm/cpu-policy.h>
#include <asm/cpuid.h>
+#include <xen/lib/x86/cpu-policy.h>
#else
#include <asm/cpufeatureset.h>
#endif
@@ -121,7 +123,6 @@ static inline bool boot_cpu_has(unsigned
#define CPUID6_EAX_HDC BIT(13, U)
#define CPUID6_EAX_HWP_PECI BIT(16, U)
#define CPUID6_EAX_HW_FEEDBACK BIT(19, U)
-#define CPUID6_ECX_APERFMPERF_CAPABILITY BIT(0, U)
/* CPUID level 0x00000001.edx */
#define cpu_has_fpu 1
@@ -175,6 +176,9 @@ static inline bool boot_cpu_has(unsigned
#define cpu_has_fma4 boot_cpu_has(X86_FEATURE_FMA4)
#define cpu_has_tbm boot_cpu_has(X86_FEATURE_TBM)
+/* CPUID level 0x00000006.ecx */
+#define cpu_has_hw_feedback_cap host_cpu_policy.basic.hw_feedback_cap
+
/* CPUID level 0x0000000D:1.eax */
#define cpu_has_xsaveopt boot_cpu_has(X86_FEATURE_XSAVEOPT)
#define cpu_has_xsavec boot_cpu_has(X86_FEATURE_XSAVEC)
@@ -292,7 +296,6 @@ static inline bool boot_cpu_has(unsigned
/* Synthesized. */
#define cpu_has_arch_perfmon boot_cpu_has(X86_FEATURE_ARCH_PERFMON)
#define cpu_has_cpuid_faulting boot_cpu_has(X86_FEATURE_CPUID_FAULTING)
-#define cpu_has_aperfmperf boot_cpu_has(X86_FEATURE_APERFMPERF)
#define cpu_has_xen_lbr boot_cpu_has(X86_FEATURE_XEN_LBR)
#define cpu_has_xen_shstk (IS_ENABLED(CONFIG_XEN_SHSTK) && \
boot_cpu_has(X86_FEATURE_XEN_SHSTK))
--- a/xen/arch/x86/include/asm/cpufeatures.h
+++ b/xen/arch/x86/include/asm/cpufeatures.h
@@ -19,7 +19,7 @@ XEN_CPUFEATURE(TSC_RELIABLE, X86_SY
XEN_CPUFEATURE(XTOPOLOGY, X86_SYNTH( 5)) /* cpu topology enum extensions */
XEN_CPUFEATURE(CPUID_FAULTING, X86_SYNTH( 6)) /* cpuid faulting */
XEN_CPUFEATURE(XEN_FRED, X86_SYNTH( 7)) /* Xen uses FRED */
-XEN_CPUFEATURE(APERFMPERF, X86_SYNTH( 8)) /* APERFMPERF */
+/* Bit 8 unused */
XEN_CPUFEATURE(MFENCE_RDTSC, X86_SYNTH( 9)) /* MFENCE synchronizes RDTSC */
XEN_CPUFEATURE(XEN_SMEP, X86_SYNTH(10)) /* SMEP gets used by Xen itself */
XEN_CPUFEATURE(XEN_SMAP, X86_SYNTH(11)) /* SMAP gets used by Xen itself */
Le 14/01/2026 à 14:45, Jan Beulich a écrit : > Use the respective host CPU policy bit instead. This has the (tolerable, > as we generally assume symmetry anyway) effect of using the BSP's > (unleveled) setting, rather than the result of leveling (as is done by > identify_cpu() on boot_cpu_data, rendering the variable name somewhat > misleading). > > Signed-off-by: Jan Beulich <jbeulich@suse.com> > Reviewed-by: Jason Andryuk <jason.andryuk@amd.com> > --- > The leveling of boot_cpu_data is problematic anyway, as that way features > can in principle disappear post-boot (as CPUs are being brought online; > just that we don't think anymore that we really support physical CPU > hotplug). I think in the vast majority of cases, hotplugged CPUs are of same model or very similar; so shouldn't diverge too much in term of features. Otherwise, it's pretty much impossible to guarantee anything unless we have per-socket cpu datas. > --- > v3: Re-base over naming changes. > v2: Extend description. > > --- a/xen/arch/x86/acpi/cpufreq/cpufreq.c > +++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c > @@ -80,7 +80,7 @@ unsigned int get_measured_perf(unsigned > return 0; > > policy = per_cpu(cpufreq_cpu_policy, cpu); > - if ( !policy || !cpu_has_aperfmperf ) > + if ( !policy || !cpu_has_hw_feedback_cap ) > return 0; > > switch (flag) > --- a/xen/arch/x86/cpu/common.c > +++ b/xen/arch/x86/cpu/common.c > @@ -523,10 +523,6 @@ static void generic_identify(struct cpui > if ( cpu_has(c, X86_FEATURE_CLFLUSH) ) > c->x86_clflush_size = ((ebx >> 8) & 0xff) * 8; > > - if ( (c->cpuid_level >= CPUID_PM_LEAF) && > - (cpuid_ecx(CPUID_PM_LEAF) & CPUID6_ECX_APERFMPERF_CAPABILITY) ) > - __set_bit(X86_FEATURE_APERFMPERF, c->x86_capability); > - > /* AMD-defined flags: level 0x80000001 */ > if (c->extended_cpuid_level >= 0x80000001) > cpuid(0x80000001, &tmp, &tmp, > --- a/xen/arch/x86/include/asm/cpufeature.h > +++ b/xen/arch/x86/include/asm/cpufeature.h > @@ -11,7 +11,9 @@ > #include <xen/macros.h> > > #ifndef __ASSEMBLER__ > +#include <asm/cpu-policy.h> > #include <asm/cpuid.h> > +#include <xen/lib/x86/cpu-policy.h> > #else > #include <asm/cpufeatureset.h> > #endif > @@ -121,7 +123,6 @@ static inline bool boot_cpu_has(unsigned > #define CPUID6_EAX_HDC BIT(13, U) > #define CPUID6_EAX_HWP_PECI BIT(16, U) > #define CPUID6_EAX_HW_FEEDBACK BIT(19, U) > -#define CPUID6_ECX_APERFMPERF_CAPABILITY BIT(0, U) > > /* CPUID level 0x00000001.edx */ > #define cpu_has_fpu 1 > @@ -175,6 +176,9 @@ static inline bool boot_cpu_has(unsigned > #define cpu_has_fma4 boot_cpu_has(X86_FEATURE_FMA4) > #define cpu_has_tbm boot_cpu_has(X86_FEATURE_TBM) > > +/* CPUID level 0x00000006.ecx */ > +#define cpu_has_hw_feedback_cap host_cpu_policy.basic.hw_feedback_cap > + > /* CPUID level 0x0000000D:1.eax */ > #define cpu_has_xsaveopt boot_cpu_has(X86_FEATURE_XSAVEOPT) > #define cpu_has_xsavec boot_cpu_has(X86_FEATURE_XSAVEC) > @@ -292,7 +296,6 @@ static inline bool boot_cpu_has(unsigned > /* Synthesized. */ > #define cpu_has_arch_perfmon boot_cpu_has(X86_FEATURE_ARCH_PERFMON) > #define cpu_has_cpuid_faulting boot_cpu_has(X86_FEATURE_CPUID_FAULTING) > -#define cpu_has_aperfmperf boot_cpu_has(X86_FEATURE_APERFMPERF) > #define cpu_has_xen_lbr boot_cpu_has(X86_FEATURE_XEN_LBR) > #define cpu_has_xen_shstk (IS_ENABLED(CONFIG_XEN_SHSTK) && \ > boot_cpu_has(X86_FEATURE_XEN_SHSTK)) > --- a/xen/arch/x86/include/asm/cpufeatures.h > +++ b/xen/arch/x86/include/asm/cpufeatures.h > @@ -19,7 +19,7 @@ XEN_CPUFEATURE(TSC_RELIABLE, X86_SY > XEN_CPUFEATURE(XTOPOLOGY, X86_SYNTH( 5)) /* cpu topology enum extensions */ > XEN_CPUFEATURE(CPUID_FAULTING, X86_SYNTH( 6)) /* cpuid faulting */ > XEN_CPUFEATURE(XEN_FRED, X86_SYNTH( 7)) /* Xen uses FRED */ > -XEN_CPUFEATURE(APERFMPERF, X86_SYNTH( 8)) /* APERFMPERF */ > +/* Bit 8 unused */ > XEN_CPUFEATURE(MFENCE_RDTSC, X86_SYNTH( 9)) /* MFENCE synchronizes RDTSC */ > XEN_CPUFEATURE(XEN_SMEP, X86_SYNTH(10)) /* SMEP gets used by Xen itself */ > XEN_CPUFEATURE(XEN_SMAP, X86_SYNTH(11)) /* SMAP gets used by Xen itself */ > > -- Teddy Astie | Vates XCP-ng Developer XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech
© 2016 - 2026 Red Hat, Inc.