mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
f38e8cb85a
commit
aa2f6c99f3
3 files changed
+25
-4
No files matched your search
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 */
|
||||