On Mon, Nov 14, 2016 at 01:34:55PM +1100, Alexey Kardashevskiy wrote: > On 12/11/16 05:13, Greg Kurz wrote: > > On Tue, 8 Nov 2016 16:31:08 +1100 > > David Gibson <da...@gibson.dropbear.id.au> wrote: > > > >> On Fri, Nov 04, 2016 at 04:52:39PM +1100, Alexey Kardashevskiy wrote: > >>> On 30/10/16 22:12, David Gibson wrote: > >>>> When vmstate for the ppc cpu was introduced in a90db158 "target-ppc: > >>>> Convert ppc cpu savevm to VMStateDescription", several "sanity check" > >>>> fields were included, verifying that certain cpu parameters matched > >>>> between > >>>> source and destination. > >>>> > >>>> This turns out not to have been a good idea. For one thing it's > >>>> redundant > >>>> with existing checks for a compatible cpu version at either end. But > >>>> more > >>>> importantly the insns_flags and insns_flags2 checks actively break > >>>> things: > >>>> they expose what's essentially an internal TCG implementation detail in > >>>> the > >>>> migration stream. That means that when new instruction classes are added > >>>> or rearranged, migration can break. > >>>> > >>>> This removes these ill-considered sanity checks. > >>>> > >>>> Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> > >>>> --- > >>>> target-ppc/machine.c | 8 ++++---- > >>>> 1 file changed, 4 insertions(+), 4 deletions(-) > >>>> > >>>> diff --git a/target-ppc/machine.c b/target-ppc/machine.c > >>>> index 62b9e94..453ef0a 100644 > >>>> --- a/target-ppc/machine.c > >>>> +++ b/target-ppc/machine.c > >>>> @@ -602,10 +602,10 @@ const VMStateDescription vmstate_ppc_cpu = { > >>>> /* FIXME: access_type? */ > >>>> > >>>> /* Sanity checking */ > >>>> - VMSTATE_UINTTL_EQUAL(env.msr_mask, PowerPCCPU), > >>>> - VMSTATE_UINT64_EQUAL(env.insns_flags, PowerPCCPU), > >>>> - VMSTATE_UINT64_EQUAL(env.insns_flags2, PowerPCCPU), > >>>> - VMSTATE_UINT32_EQUAL(env.nb_BATs, PowerPCCPU), > >>>> + VMSTATE_UNUSED(sizeof(target_ulong) /* msr_mask */ > >>>> + + sizeof(uint64_t) /* insns_flags */ > >>>> + + sizeof(uint64_t) /* insns_flags2 */ > >>>> + + sizeof(uint32_t)), /* nb_BATs */ > >>> > >>> > >>> This breaks migration to older QEMU: > >>> > >>> 25055@1478238734.537761:vmstate_load_field_error field "env.msr_mask" load > >>> failed, ret = -22 > >> > >> Again, I don't think we generally support backwards migration. > >> > >> That said, it would be nice here to do a "set to this field on > >> ourgoing migration, but ignore on incoming migration". Do you know a > >> way to do that? > >> > > > > This doesn't exist in vmstate but it is certainly doable. An alternative > > would be to always send the fields, but have the destination to use > > pre_load and post_load callbacks to preserve its state. > > > A simpler way would be: > > 1. add a copy for each field (s/msr_mask/mig_msr_mask/), > 2. get rid of _EQUAL bits, > 3. implement .pre_save callback which would initialize mig_xxx > > And that's it, .pre_load/.post_load is not needed.
Yeah, it works, but crufts up the runtime structures with extra fields related only to migration with old versions. I think just dropping the backwards migration is a better option in this case. > > > > > > > >> a > >>> > >>> > >>> > >>>> VMSTATE_END_OF_LIST() > >>>> }, > >>>> .subsections = (const VMStateDescription*[]) { > >>>> > >>> > >>> > >> > > > > -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature