Message ID | 20171127043003.15034-3-david@gibson.dropbear.id.au |
---|---|
State | New |
Headers | show |
Series | ppc-for-2.11 queue 20171127 | expand |
On Mon, 27 Nov 2017 15:30:03 +1100 David Gibson <david@gibson.dropbear.id.au> wrote: > From: Suraj Jitindar Singh <sjitindarsingh@gmail.com> > > cpu->compat_pvr is used to store the current compat mode of the cpu. > > On the receiving side during incoming migration we check compatibility > with the compat mode by calling ppc_set_compat(). However we fail to set > the compat mode with the hypervisor since the "new" compat mode doesn't > differ from the current (due to a "cpu->compat_pvr != compat_pvr" check). > This means that kvm runs the vcpus without a compat mode, which is the > incorrect behaviour. The implication being that a compatibility mode > will never be in effect after migration. > > To fix this so that the compat mode is correctly set with the > hypervisor, store the desired compat mode and reset cpu->compat_pvr to > zero before calling ppc_set_compat(). > > Fixes: 5dfaa532 ("ppc: fix ppc_set_compat() with KVM PR") > Cc'ing stable since 5dfaa532 was shipped with QEMU 2.10 > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au> > --- > target/ppc/machine.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/target/ppc/machine.c b/target/ppc/machine.c > index 384caee800..24117e8f31 100644 > --- a/target/ppc/machine.c > +++ b/target/ppc/machine.c > @@ -237,9 +237,11 @@ static int cpu_post_load(void *opaque, int version_id) > > #if defined(TARGET_PPC64) > if (cpu->compat_pvr) { > + uint32_t compat_pvr = cpu->compat_pvr; > Error *local_err = NULL; > > - ppc_set_compat(cpu, cpu->compat_pvr, &local_err); > + cpu->compat_pvr = 0; > + ppc_set_compat(cpu, compat_pvr, &local_err); > if (local_err) { > error_report_err(local_err); > return -1;
diff --git a/target/ppc/machine.c b/target/ppc/machine.c index 384caee800..24117e8f31 100644 --- a/target/ppc/machine.c +++ b/target/ppc/machine.c @@ -237,9 +237,11 @@ static int cpu_post_load(void *opaque, int version_id) #if defined(TARGET_PPC64) if (cpu->compat_pvr) { + uint32_t compat_pvr = cpu->compat_pvr; Error *local_err = NULL; - ppc_set_compat(cpu, cpu->compat_pvr, &local_err); + cpu->compat_pvr = 0; + ppc_set_compat(cpu, compat_pvr, &local_err); if (local_err) { error_report_err(local_err); return -1;