From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: David Gibson <david@gibson.dropbear.id.au>,
Jianjun Duan <duanj@linux.vnet.ibm.com>
Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com>,
qemu-devel@nongnu.org, qemu-ppc@nongnu.org, dmitry@daynix.com,
peter.maydell@linaro.org, kraxel@redhat.com, mst@redhat.com,
pbonzini@redhat.com, veroniabahaa@gmail.com, quintela@redhat.com,
amit.shah@redhat.com, mreitz@redhat.com, kwolf@redhat.com,
rth@twiddle.net, aurelien@aurel32.net, leon.alrae@imgtec.com,
blauwirbel@gmail.com, mark.cave-ayland@ilande.co.uk
Subject: Re: [Qemu-devel] [QEMU PATCH v5 1/6] migration: alternative way to set instance_id in SaveStateEntry
Date: Tue, 15 Nov 2016 17:45:27 -0600 [thread overview]
Message-ID: <20161115234527.10998.70353@loki> (raw)
In-Reply-To: <20161007025442.GK18490@umbus.fritz.box>
Quoting David Gibson (2016-10-06 21:54:42)
> On Wed, Oct 05, 2016 at 09:44:57AM -0700, Jianjun Duan wrote:
> > Please see comments below:
> >
> > On 10/05/2016 03:12 AM, Dr. David Alan Gilbert wrote:
> > > * Jianjun Duan (duanj@linux.vnet.ibm.com) wrote:
> > >> In QOM(QEMU Object Model) migrated objects are identified with instance_id
> > >> which is calculated automatically using their path in the QOM composition
> > >> tree. For some objects, this path could change from source to target in
> > >> migration. To migrate such objects, we need to make sure the instance_id does
> > >> not change from source to target. We add a hook in DeviceClass to do customized
> > >> instance_id calculation in such cases.
> > >
> > > Can you explain a bit about why the path changes from source to destination;
> > > the path here should be a feature of the guest state not the host, and so I
> > > don't understand why it changes.
> > Please see the discussion with David in the previous versions:
> > http://lists.nongnu.org/archive/html/qemu-ppc/2016-06/msg00062.html
>
> Um.. your description above really isn't an accurate summary of that
> discussion.
>
> The point is not that the qom path will vary from source to
> destination for some arbitrary reason, but rather that we anticipate
> future changes in the QOM structure. Specifically we're considering
> eliminating the DRC objects, and folding their (limited) state into an
> array in the parent object (either the machine or a PCI host bridge).
>
> That would change the qom paths, and hence the auto-generated instance
> ids, which would break migration between qemu versions before and
> after the restructure.
>
> I'm not sure that changing the instance ids is enough though, anyway,
> since we're talking about eliminating the object entirely, the
> class/type information in the migration stream also wouldn't match.
>
> Dave, if you have ideas on how to deal with that, I'd love to hear
> them
>
> >
> > >> As a result, in these cases compat will not be set in the concerned
> > >> SaveStateEntry. This will prevent the inconsistent idstr to be sent over in
> > >> migration. We could have set alias_id in a similar way. But that will be
> > >> overloading the purpose of alias_id.
> > >>
> > >> The first application will be setting instance_id for DRC using its unique
> > >> index. Doing this makes the instance_id of DRC to be consistent across migration
> > >> and supports flexible management of DRC objects in migration.
> > >
> > > Is there a reason to use a custom instance_id rather than a custom idstr
> >
> > It can be done either way. But it is easier to deal with a integer than
> > a string.
>
> A bit, but I don't think that's a good enough reason to introduce a
> second mechanism for overriding instance id allocations.
I'm looking at picking up this patch and the next for DRC migration
since it turns out it's needed to fix memory unplug after migration.
I think the gist of it is that vmstate_register() doesn't provide
a way to specify a custom idstr, and instead relies on vmsd->name
(or qom-path for Devices), only register_savevm_live() does. Both
however provide a way of specifying a custom instance_id. The only
real issue is that in the case of Devices we end up ignoring the
instance_id. So I propose using the existing interface to set the
instance_id, and relegating all knowledge of
DeviceClass->dev_get_instance_id() to qdev (and other callers
as-needed). Maybe something like this?
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index d835e62..7323152 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -933,7 +933,11 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
}
if (qdev_get_vmsd(dev)) {
- vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
+ int instance_id = DEVICE_GET_CLASS(dev)->dev_get_instance_id
+ ? DEVICE_GET_CLASS(dev)->dev_get_instance_id(dev)
+ : -1;
+
+ vmstate_register_with_alias_id(dev, instance_id, qdev_get_vmsd(dev), dev,
dev->instance_id_alias,
dev->alias_required_for_version);
}
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 2c97347..a012e8e 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -139,6 +139,12 @@ typedef struct DeviceClass {
qdev_initfn init; /* TODO remove, once users are converted to realize */
qdev_event exit; /* TODO remove, once users are converted to unrealize */
const char *bus_type;
+
+ /* When this field is set, qemu will use it to get an unique instance_id
+ * instead of calculating an auto idstr and instanc_id for the relevant
+ * SaveStateEntry
+ */
+ int (*dev_get_instance_id)(DeviceState *dev);
} DeviceClass;
typedef struct NamedGPIOList NamedGPIOList;
diff --git a/migration/savevm.c b/migration/savevm.c
index 0363372..a95fff9 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -556,7 +556,7 @@ int register_savevm_live(DeviceState *dev,
se->is_ram = 1;
}
- if (dev) {
+ if (dev && instance_id == -1) {
char *id = qdev_get_dev_path(dev);
if (id) {
pstrcpy(se->idstr, sizeof(se->idstr), id);
@@ -640,7 +640,7 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
se->vmsd = vmsd;
se->alias_id = alias_id;
- if (dev) {
+ if (dev && instance_id == -1) {
char *id = qdev_get_dev_path(dev);
if (id) {
pstrcpy(se->idstr, sizeof(se->idstr), id);
>
> --
> 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
next prev parent reply other threads:[~2016-11-15 23:45 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-03 18:24 [Qemu-devel] [QEMU PATCH v5 0/6] migration: ensure hotplug and migration work together Jianjun Duan
2016-10-03 18:24 ` [Qemu-devel] [QEMU PATCH v5 1/6] migration: alternative way to set instance_id in SaveStateEntry Jianjun Duan
2016-10-05 10:12 ` Dr. David Alan Gilbert
2016-10-05 16:44 ` Jianjun Duan
2016-10-07 2:54 ` David Gibson
2016-10-07 8:07 ` Dr. David Alan Gilbert
2016-10-10 5:31 ` David Gibson
2016-10-11 16:17 ` Michael Roth
2016-10-11 23:37 ` David Gibson
2016-11-15 23:45 ` Michael Roth [this message]
2016-10-05 16:46 ` [Qemu-devel] [Qemu-ppc] " Jianjun Duan
2016-10-03 18:24 ` [Qemu-devel] [QEMU PATCH v5 2/6] migration: spapr_drc: defined VMStateDescription struct Jianjun Duan
2016-10-05 11:38 ` Dr. David Alan Gilbert
2016-10-07 3:17 ` David Gibson
2016-10-07 3:12 ` David Gibson
2016-10-07 17:17 ` Jianjun Duan
2016-10-10 5:09 ` David Gibson
2016-10-10 16:48 ` [Qemu-devel] [Qemu-ppc] " Jianjun Duan
2016-10-03 18:24 ` [Qemu-devel] [QEMU PATCH v5 3/6] migration: extend VMStateInfo Jianjun Duan
2016-10-07 12:08 ` Dr. David Alan Gilbert
2016-10-07 16:35 ` [Qemu-devel] [Qemu-ppc] " Jianjun Duan
2016-10-07 18:42 ` Dr. David Alan Gilbert
2016-10-10 5:02 ` David Gibson
2016-10-12 11:59 ` [Qemu-devel] " Halil Pasic
2016-10-12 12:07 ` Paolo Bonzini
2016-10-12 12:30 ` Halil Pasic
2016-10-12 14:59 ` Dr. David Alan Gilbert
2016-10-13 10:33 ` Halil Pasic
2016-10-13 11:12 ` Dr. David Alan Gilbert
2016-10-12 17:27 ` [Qemu-devel] [Qemu-ppc] " Jianjun Duan
2016-10-13 8:22 ` Paolo Bonzini
2016-10-13 10:48 ` Halil Pasic
2016-10-13 11:20 ` Paolo Bonzini
2016-10-13 16:23 ` Jianjun Duan
2016-10-13 16:32 ` Halil Pasic
2016-10-13 16:35 ` Jianjun Duan
2016-10-03 18:24 ` [Qemu-devel] [QEMU PATCH v5 4/6] migration: migrate QTAILQ Jianjun Duan
2016-10-05 16:56 ` Dr. David Alan Gilbert
2016-10-05 17:19 ` Jianjun Duan
2016-10-06 19:01 ` Dr. David Alan Gilbert
2016-10-06 19:49 ` Jianjun Duan
2016-10-07 3:25 ` David Gibson
2016-10-07 14:31 ` Paolo Bonzini
2016-10-07 14:34 ` Dr. David Alan Gilbert
2016-10-07 16:31 ` [Qemu-devel] [Qemu-ppc] " Jianjun Duan
2016-10-07 16:32 ` Paolo Bonzini
2016-10-07 17:25 ` Jianjun Duan
2016-10-07 17:34 ` Dr. David Alan Gilbert
2016-10-07 17:43 ` Jianjun Duan
2016-10-08 11:37 ` Paolo Bonzini
2016-10-08 19:28 ` Halil Pasic
2016-10-10 21:29 ` Jianjun Duan
2016-10-11 7:33 ` Paolo Bonzini
2016-10-10 21:40 ` Jianjun Duan
2016-10-06 11:05 ` [Qemu-devel] " Paolo Bonzini
2016-10-06 11:56 ` Dr. David Alan Gilbert
2016-10-06 12:23 ` Paolo Bonzini
2016-10-06 15:21 ` Dr. David Alan Gilbert
2016-10-03 18:24 ` [Qemu-devel] [QEMU PATCH v5 5/6] migration: spapr: migrate ccs_list in spapr state Jianjun Duan
2016-10-07 3:36 ` David Gibson
2016-10-07 14:52 ` Michael Roth
2016-10-10 5:05 ` David Gibson
2016-10-03 18:24 ` [Qemu-devel] [QEMU PATCH v5 6/6] migration: spapr: migrate pending_events of " Jianjun Duan
2016-10-03 18:35 ` [Qemu-devel] [QEMU PATCH v5 0/6] migration: ensure hotplug and migration work together no-reply
2016-10-03 19:00 ` no-reply
2016-10-03 19:11 ` Jianjun Duan
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=20161115234527.10998.70353@loki \
--to=mdroth@linux.vnet.ibm.com \
--cc=amit.shah@redhat.com \
--cc=aurelien@aurel32.net \
--cc=blauwirbel@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=dgilbert@redhat.com \
--cc=dmitry@daynix.com \
--cc=duanj@linux.vnet.ibm.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=leon.alrae@imgtec.com \
--cc=mark.cave-ayland@ilande.co.uk \
--cc=mreitz@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=quintela@redhat.com \
--cc=rth@twiddle.net \
--cc=veroniabahaa@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.