Skip to content

Commit

Permalink
x86/cpu-policy: Fix migration from Ice Lake to Cascade Lake
Browse files Browse the repository at this point in the history
Ever since Xen 4.14, there has been a latent bug with migration.

While some toolstacks can level the features properly, they don't shink
feat.max_subleaf when all features have been dropped.  This is because
we *still* have not completed the toolstack side work for full CPU Policy
objects.

As a consequence, even when properly feature levelled, VMs can't migrate
"backwards" across hardware which reduces feat.max_subleaf.  One such example
is Ice Lake (max_subleaf=2 for INTEL_PSFD) to Cascade Lake (max_subleaf=0).

Extend the max policies feat.max_subleaf to the hightest number Xen knows
about, but leave the default policies matching the host.  This will allow VMs
with a higher feat.max_subleaf than strictly necessary to migrate in.

Eventually we'll manage to teach the toolstack how to avoid creating such VMs
in the first place, but there's still more work to do there.

Signed-off-by: Andrew Cooper <[email protected]>
Acked-by: Roger Pau Monné <[email protected]>
  • Loading branch information
andyhhp committed May 7, 2024
1 parent f4f2f34 commit a2330b5
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions xen/arch/x86/cpu-policy.c
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,13 @@ static void __init calculate_pv_max_policy(void)
unsigned int i;

*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;

x86_cpu_policy_to_featureset(p, fs);

for ( i = 0; i < ARRAY_SIZE(fs); ++i )
Expand Down Expand Up @@ -630,6 +637,10 @@ static void __init calculate_pv_def_policy(void)
unsigned int i;

*p = pv_max_cpu_policy;

/* Default to the same max_subleaf as the host. */
p->feat.max_subleaf = host_cpu_policy.feat.max_subleaf;

x86_cpu_policy_to_featureset(p, fs);

for ( i = 0; i < ARRAY_SIZE(fs); ++i )
Expand Down Expand Up @@ -666,6 +677,13 @@ static void __init calculate_hvm_max_policy(void)
const uint32_t *mask;

*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;

x86_cpu_policy_to_featureset(p, fs);

mask = hvm_hap_supported() ?
Expand Down Expand Up @@ -783,6 +801,10 @@ static void __init calculate_hvm_def_policy(void)
const uint32_t *mask;

*p = hvm_max_cpu_policy;

/* Default to the same max_subleaf as the host. */
p->feat.max_subleaf = host_cpu_policy.feat.max_subleaf;

x86_cpu_policy_to_featureset(p, fs);

mask = hvm_hap_supported() ?
Expand Down

0 comments on commit a2330b5

Please sign in to comment.