mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/cpu-policy: Extend the guest max policy max leaf/subleaves
We already have one migration case opencoded (feat.max_subleaf). A more
recent discovery is that we advertise x2APIC to guests without ensuring that
we provide max_leaf >= 0xb.
In general, any leaf known to Xen can be safely configured by the toolstack if
it doesn't violate other constraints.
Therefore, introduce guest_common_{max,default}_leaves() to generalise the
special case we currently have for feat.max_subleaf, in preparation to be able
to provide x2APIC topology in leaf 0xb even on older hardware.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Alejandro Vallejo <alejandro.vallejo@cloud.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
bb7296d77f
commit
fa2d831803
1 file changed
+25
-14
+25
-14
@@ -391,6 +391,27 @@ static void __init calculate_host_policy(void)
|
||||
p->platform_info.cpuid_faulting = cpu_has_cpuid_faulting;
|
||||
}
|
||||
|
||||
/*
|
||||
* Guest max policies can have any max leaf/subleaf within bounds.
|
||||
*
|
||||
* - Some incoming VMs have a larger-than-necessary feat max_subleaf.
|
||||
* - Some VMs we'd like to synthesise leaves not present on the host.
|
||||
*/
|
||||
static void __init guest_common_max_leaves(struct cpu_policy *p)
|
||||
{
|
||||
p->basic.max_leaf = ARRAY_SIZE(p->basic.raw) - 1;
|
||||
p->feat.max_subleaf = ARRAY_SIZE(p->feat.raw) - 1;
|
||||
p->extd.max_leaf = 0x80000000U + ARRAY_SIZE(p->extd.raw) - 1;
|
||||
}
|
||||
|
||||
/* Guest default policies inherit the host max leaf/subleaf settings. */
|
||||
static void __init guest_common_default_leaves(struct cpu_policy *p)
|
||||
{
|
||||
p->basic.max_leaf = host_cpu_policy.basic.max_leaf;
|
||||
p->feat.max_subleaf = host_cpu_policy.feat.max_subleaf;
|
||||
p->extd.max_leaf = host_cpu_policy.extd.max_leaf;
|
||||
}
|
||||
|
||||
static void __init guest_common_max_feature_adjustments(uint32_t *fs)
|
||||
{
|
||||
if ( boot_cpu_data.x86_vendor == X86_VENDOR_INTEL )
|
||||
@@ -579,11 +600,7 @@ static void __init calculate_pv_max_policy(void)
|
||||
|
||||
*p = host_cpu_policy;
|
||||
|
||||
/*
|
||||
* Some VMs may have a larger-than-necessary feat max_subleaf. Allow them
|
||||
* to migrate in.
|
||||
*/
|
||||
p->feat.max_subleaf = ARRAY_SIZE(p->feat.raw) - 1;
|
||||
guest_common_max_leaves(p);
|
||||
|
||||
x86_cpu_policy_to_featureset(p, fs);
|
||||
|
||||
@@ -626,8 +643,7 @@ static void __init calculate_pv_def_policy(void)
|
||||
|
||||
*p = pv_max_cpu_policy;
|
||||
|
||||
/* Default to the same max_subleaf as the host. */
|
||||
p->feat.max_subleaf = host_cpu_policy.feat.max_subleaf;
|
||||
guest_common_default_leaves(p);
|
||||
|
||||
x86_cpu_policy_to_featureset(p, fs);
|
||||
|
||||
@@ -666,11 +682,7 @@ static void __init calculate_hvm_max_policy(void)
|
||||
|
||||
*p = host_cpu_policy;
|
||||
|
||||
/*
|
||||
* Some VMs may have a larger-than-necessary feat max_subleaf. Allow them
|
||||
* to migrate in.
|
||||
*/
|
||||
p->feat.max_subleaf = ARRAY_SIZE(p->feat.raw) - 1;
|
||||
guest_common_max_leaves(p);
|
||||
|
||||
x86_cpu_policy_to_featureset(p, fs);
|
||||
|
||||
@@ -790,8 +802,7 @@ static void __init calculate_hvm_def_policy(void)
|
||||
|
||||
*p = hvm_max_cpu_policy;
|
||||
|
||||
/* Default to the same max_subleaf as the host. */
|
||||
p->feat.max_subleaf = host_cpu_policy.feat.max_subleaf;
|
||||
guest_common_default_leaves(p);
|
||||
|
||||
x86_cpu_policy_to_featureset(p, fs);
|
||||
|
||||
|
||||