From: Anthony Liguori <anthony@codemonkey.ws>
To: quintela@redhat.com
Cc: Ryan Harper <ryanh@linux.vnet.ibm.com>,
Paolo Bonzini <pbonzini@redhat.com>,
qemu-devel@nongnu.org,
Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>,
mst@redhat.com
Subject: Re: [Qemu-devel] [RFC PATCH 0/4] Fix subsection ambiguity in the migration format
Date: Tue, 26 Jul 2011 07:37:54 -0500 [thread overview]
Message-ID: <4E2EB522.2000808@codemonkey.ws> (raw)
In-Reply-To: <m3oc0h5jos.fsf@neno.neno>
On 07/26/2011 07:07 AM, Juan Quintela wrote:
> Anthony Liguori<anthony@codemonkey.ws> wrote:
>> == What we need ==
>>
>> We need to decompose migration into three different problems: 1)
>> serializing device state 2) transforming the device model in order to
>> satisfy forwards and backwards compatibility 3) encoding the
>> serialized device model on the wire.
>
> I will change this to:
> - We need to be able to "enable/disable" features of a device.
> A.K.A. make -M pc-0.14 work with devices with the same features
> than 0.14. Notice that this is _independent_ of migration.
In theory, we already have this with qdev flags.
> - Be able to describe that different features/versions. This is not the
> difficult part, it can be subsections, optional fields, whatever.
> What is the difficult part is _knowing_ what fields needs to be on
> each version. That again depends of the device, not migration.
>
> - Be able to to do forward/bacward compatibility (and without
> comunication both sides is basically impossible).
Hrm, I'm not sure I agree with these conclusions.
Management tools should do their best job to create two compatible
device models.
Given two compatible device models, there *may* be differences in the
structure of the device models since we evolve things over time. We may
rename a field, change the type, etc. To support this, we can use
filters both on the destination and receive end to do our best to
massage the device model into something compatible.
But creating two creating compatible device models is not the job of the
migration protocol. It's the job of management tools.
> - Send things on the wire (really this is the easy part, we can play
> with it touching only migration functions.).
>
>> We also need a way to future proof ourselves.
>
> We have been very bad at this. Automatic checking is the only way that
> I can think of.
I don't know what you mean by automatic checking.
>> == What we can do ==
>>
>> 1) Add migration capabilities to future proof ourselves. I think the
>> simplest way this would work is to have a
>> query-migration-capabilities' command that returned a bitmask of
>> supported migration features. I think we also introduce a
>> set-migration-capabilities' command that can mask some of the
>> supported features.
>
> We have two things here. Device level& protocol level.
>
> Device level: very late to set anything.
> Protocol level: we can set things here, but notice that only a few
> things cane be set here.
Once we have a protocol level feature bit, we can add device level
feature bits as a new feature.
>> A management tool would query-migration features on the source and
>> destination, take the intersection of the two masks, and set that mask
>> on both the source and destination.
>>
>> Lack of support for these commands indicates a mask of zero which is
>> the protocol we offer today.
>>
>> 2) Switch to a visitor model to serialize device state. This involves
>> converting any occurance of:
>>
>> qemu_put_be32(f, port->guest_connected);
>>
>> To:
>>
>> visit_type_u32(v, "guest_connected",&port->guest_connected,&local_err);
>
> VMSTATE_INT32(guest_conected, FooState)
>
> can be make to do this at any point.
>
>> It's 100% mechanical and makes absolutely no logic change. It works
>> equally well with legacy and VMstate migration handlers.
>>
>> 3) Add a Visitor class that operates on QEMUFile.
>>
>> At this state, we can migrate to data structures. That means we can
>> migrate to QEMUFile, QObjects, or JSON. We could change the protocol
>> at this stage to something that was still binary but had section sizes
>> and things of that nature.
>
> That was the whole point of vmstate.
The problem with vmstate is that it's an all or nothing thing and the
conversion isn't programmatic. Since visiting and qemu_put match 1-1,
we can do the conversion all-at-once with some sed magic.
>> So if we did this in 1.0, we could have a single function that
>> converted the 1.0 device model to 1.1 and vice versa, and we'd be
>> fine. We wouldn't have to touch 200 devices to do this.
>
> I still think this is wrong. We are launching a device with feature
> "foo", and at migration time, we want to migration without feature
> "foo". This is not going to work on the general case. But launching
> the device _without_ feature "foo" will always work.
Don't confuse migration with creating compatible device models. We're
never going to support migrating from a system with an e1000 to a system
with virtio :-)
> Notice the things that "can" be optional:
> - features that are not used. We update the device to have more
> features, but OS driver only uses the features of the old version.
> With subsections test, we can fix this one.
>
> - values that are only needed sometimes. PIO subsection cames to mind,
> it is only needed when we are on the middle of a PIO operation.
>
> - values that rarely change for defaults. This the mmio addresess
> problems with rtl8139. If we plug/unplug the card, we will get a
> different address, so we need to change it.
>
> - values that depend of other features (change default size of memory,
> add new variables, etc). This is for its very nature not compatible,
> and we can't migrate.
>
> What I am complaining here? This "compatibility" support supposes that
> migration works as:
>
> device with some features -> migration -> device with other features
>
> and it works. This means that "migration" does magic, and this is never
> going to work.
>
> Until now, this kind of worked because we only supported migration from
> old -> new, or the same version. Migration from old -> new can never
> have new features. But from new -> old to work, we need a way to
> disable the new features. That is completely independent of migration.
At startup time, not dynamically. And we have this, that's what -M pc-X
is about.
>
>> 5) Once we're here, we can implement the next 5-year format. That
>> could be ASN.1 and be bidirectional or whatever makes the most sense.
>> We could support 50 formats if we wanted to. As long as the transport
>> is distinct from the serialization and compat routines, it really
>> doesn't matter.
>
> This means finishing the VMState support, once there, only thing needs
> to change is "copy" the savevm, and change the "visitors" to whatever
> else that we need/want.
There's no need to "finish" VMState to convert to visitors. It's just
sed -e 's:qemu_put_be32:visit_type_int32:g'
Regards,
Anthony Liguori
>
> Later, Juan.
next prev parent reply other threads:[~2011-07-26 12:37 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-30 15:46 [Qemu-devel] [RFC PATCH 0/4] Fix subsection ambiguity in the migration format Paolo Bonzini
2011-06-30 15:46 ` [Qemu-devel] [RFC PATCH 1/4] add support for machine models to specify their " Paolo Bonzini
2011-06-30 18:11 ` Michael S. Tsirkin
2011-07-01 6:10 ` Paolo Bonzini
2011-07-29 13:08 ` Anthony Liguori
2011-07-29 14:35 ` Paolo Bonzini
2011-06-30 15:46 ` [Qemu-devel] [RFC PATCH 2/4] add pc-0.14 machine Paolo Bonzini
2011-08-05 19:26 ` Bruce Rogers
2011-08-05 19:41 ` Anthony Liguori
2011-06-30 15:46 ` [Qemu-devel] [RFC PATCH 3/4] savevm: define new unambiguous migration format Paolo Bonzini
2011-07-29 13:12 ` Anthony Liguori
2011-07-29 14:35 ` Paolo Bonzini
2011-06-30 15:46 ` [Qemu-devel] [RFC PATCH 4/4] Partially revert "savevm: fix corruption in vmstate_subsection_load()." Paolo Bonzini
2011-07-25 21:10 ` [Qemu-devel] [RFC PATCH 0/4] Fix subsection ambiguity in the migration format Paolo Bonzini
2011-07-25 23:23 ` Anthony Liguori
2011-07-26 9:42 ` Daniel P. Berrange
2011-07-26 9:48 ` Stefan Hajnoczi
2011-07-26 12:51 ` Stefan Hajnoczi
2011-07-26 13:00 ` Anthony Liguori
2011-07-26 12:07 ` Juan Quintela
2011-07-26 12:37 ` Anthony Liguori [this message]
2011-07-26 20:13 ` Juan Quintela
2011-07-26 21:46 ` Anthony Liguori
2011-07-26 22:22 ` Peter Maydell
2011-07-26 23:08 ` Anthony Liguori
2011-07-29 14:03 ` Kevin Wolf
2011-07-29 14:28 ` Anthony Liguori
2011-07-29 15:18 ` Kevin Wolf
2011-07-29 22:28 ` Anthony Liguori
2011-07-31 10:48 ` Dor Laor
2011-07-31 11:37 ` Peter Maydell
2011-07-31 11:45 ` Dor Laor
2011-07-31 18:46 ` Christoph Hellwig
2011-07-31 20:43 ` Dor Laor
2011-07-31 20:55 ` Anthony Liguori
2011-07-31 23:10 ` Christoph Hellwig
2011-08-01 0:15 ` Anthony Liguori
2011-08-01 7:54 ` Christoph Hellwig
2011-08-01 13:53 ` Anthony Liguori
2011-08-04 14:59 ` Luiz Capitulino
2011-07-31 20:43 ` Anthony Liguori
2011-07-31 20:57 ` Dor Laor
2011-07-31 21:03 ` Anthony Liguori
2011-07-31 21:25 ` Dor Laor
2011-07-31 21:49 ` Anthony Liguori
2011-07-29 13:14 ` Anthony Liguori
2011-07-29 14:49 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E2EB522.2000808@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=ryanh@linux.vnet.ibm.com \
--cc=stefanha@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).