x86/cpu-policy: set up host policy earlier

In order to use cpu_has_* expanding to host_cpu_policy.*, the host policy
needs setting up alongside boot_cpu_data.x86_capability[]. Arrange for
that towards the end of identify_cpu(). Then make sure .x86_capability[]
and host policy remain in sync when setup_{force,clear}_cpu_cap() are
used.

Rename the function now it's no longer static.

Fixes: 894bd76179 ("x86/Intel: use host CPU policy for ARAT checking")
Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Release-Acked-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
This commit is contained in:
Jan Beulich committed 2026-07-29 16:03:32 +02:00
1 parent dca917bff4
commit bdc4bf3b56
3 files changed
+25 -4

No files matched your search

+8 -3
View File
@@ -359,11 +359,18 @@ void calculate_raw_cpu_policy(void)
/* Was already added by probe_cpuid_faulting() */
}
static void __init calculate_host_policy(void)
void __init calculate_host_cpu_policy(void)
{
struct cpu_policy *p = &host_cpu_policy;
unsigned int max_extd_leaf;
/*
* Bail if the raw policy wasn't set up yet. At least recalculate_xstate()
* can't be used yet in that case.
*/
if ( !raw_cpu_policy.basic.max_leaf )
return;
*p = raw_cpu_policy;
p->basic.max_leaf =
@@ -904,8 +911,6 @@ static void __init calculate_hvm_def_policy(void)
void __init init_guest_cpu_policies(void)
{
calculate_host_policy();
if ( IS_ENABLED(CONFIG_PV) )
{
calculate_pv_max_policy();
+11 -1
View File
@@ -66,8 +66,10 @@ void __init setup_clear_cpu_cap(unsigned int cap)
__clear_bit(cap, boot_cpu_data.x86_capability);
dfs = x86_cpu_policy_lookup_deep_deps(cap);
if (!dfs)
if (!dfs) {
calculate_host_cpu_policy();
return;
}
for (i = 0; i < FSCAPINTS; ++i) {
cleared_caps[i] |= dfs[i];
@@ -78,6 +80,8 @@ void __init setup_clear_cpu_cap(unsigned int cap)
__builtin_return_address(0),
i, forced_caps[i] & dfs[i]);
}
calculate_host_cpu_policy();
}
void __init setup_force_cpu_cap(unsigned int cap)
@@ -92,6 +96,10 @@ void __init setup_force_cpu_cap(unsigned int cap)
}
__set_bit(cap, boot_cpu_data.x86_capability);
/* Don't recalculate when the bit isn't represented in the policy. */
if (cap < FSCAPINTS * 32)
calculate_host_cpu_policy();
}
bool __init is_forced_cpu_cap(unsigned int cap)
@@ -586,6 +594,8 @@ void identify_cpu(struct cpuinfo_x86 *c)
}
/* Now the feature flags better reflect actual CPU features! */
if (c == &boot_cpu_data)
calculate_host_cpu_policy();
xstate_init(c);
+6
View File
@@ -30,4 +30,10 @@ void recalculate_cpuid_policy(struct domain *d);
*/
void calculate_raw_cpu_policy(void);
/*
* Collect the host CPU policy. Called after collecting enough CPUID output,
* and again after all feature overrides have been put in place.
*/
void calculate_host_cpu_policy(void);
#endif /* X86_CPU_POLICY_H */
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.