|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] 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@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
CC: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx>
On a KabyLake I have to hand, here's the delta in what xen-cpuid -p reports:
git diff --no-index xen-cpuid-p-{before,after}.log
diff --git a/xen-cpuid-p-before.log b/xen-cpuid-p-after.log
index 5a76d05..24e22be 100644
--- a/xen-cpuid-p-before.log
+++ b/xen-cpuid-p-after.log
@@ -61,7 +61,7 @@ Host policy: 33 leaves, 2 MSRs
index -> value
000000ce -> 0000000080000000
0000010a -> 000000000e000c04
-PV Max policy: 33 leaves, 2 MSRs
+PV Max policy: 58 leaves, 2 MSRs
CPUID:
leaf subleaf -> eax ebx ecx edx
00000000:ffffffff -> 0000000d:756e6547:6c65746e:49656e69
@@ -75,7 +75,7 @@ PV Max policy: 33 leaves, 2 MSRs
0000000d:00000000 -> 00000007:00000000:00000340:00000000
0000000d:00000001 -> 00000007:00000000:00000000:00000000
0000000d:00000002 -> 00000100:00000240:00000000:00000000
- 80000000:ffffffff -> 80000008:00000000:00000000:00000000
+ 80000000:ffffffff -> 80000021:00000000:00000000:00000000
80000001:ffffffff -> 00000000:00000000:00000123:28100800
80000002:ffffffff -> 65746e49:2952286c:6f655820:2952286e
80000003:ffffffff -> 55504320:2d334520:30333231:20367620
@@ -87,7 +87,7 @@ PV Max policy: 33 leaves, 2 MSRs
index -> value
000000ce -> 0000000080000000
0000010a -> 000000001c020004
-HVM Max policy: 35 leaves, 2 MSRs
+HVM Max policy: 60 leaves, 2 MSRs
CPUID:
leaf subleaf -> eax ebx ecx edx
00000000:ffffffff -> 0000000d:756e6547:6c65746e:49656e69
@@ -103,7 +103,7 @@ HVM Max policy: 35 leaves, 2 MSRs
0000000d:00000002 -> 00000100:00000240:00000000:00000000
0000000d:00000003 -> 00000040:000003c0:00000000:00000000
0000000d:00000004 -> 00000040:00000400:00000000:00000000
- 80000000:ffffffff -> 80000008:00000000:00000000:00000000
+ 80000000:ffffffff -> 80000021:00000000:00000000:00000000
80000001:ffffffff -> 00000000:00000000:00000123:2c100800
80000002:ffffffff -> 65746e49:2952286c:6f655820:2952286e
80000003:ffffffff -> 55504320:2d334520:30333231:20367620
---
xen/arch/x86/cpu-policy.c | 39 +++++++++++++++++++++++++--------------
1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/xen/arch/x86/cpu-policy.c b/xen/arch/x86/cpu-policy.c
index b6d9fad56773..78bc9872b09a 100644
--- a/xen/arch/x86/cpu-policy.c
+++ b/xen/arch/x86/cpu-policy.c
@@ -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);
base-commit: 56bd76925ec35085528d778e46123b9d10a66018
--
2.39.5
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |