From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Ashijeet Acharya <ashijeetacharya@gmail.com>
Cc: quintela@redhat.com, peter.maydell@linaro.org,
pbonzini@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v4] migrate: Introduce a 'dc->vmsd' check to avoid segfault for --only-migratable
Date: Tue, 28 Feb 2017 09:41:09 +0000 [thread overview]
Message-ID: <20170228094108.GC2773@work-vm> (raw)
In-Reply-To: <20170223152709.GD2383@work-vm>
* Dr. David Alan Gilbert (dgilbert@redhat.com) wrote:
> * Ashijeet Acharya (ashijeetacharya@gmail.com) wrote:
> > Commit a3a3d8c7 introduced a segfault bug while checking for
> > 'dc->vmsd->unmigratable' which caused QEMU to crash when trying to add
> > devices which do no set their 'dc->vmsd' yet while initialization.
> > Place a 'dc->vmsd' check prior to it so that we do not segfault for
> > such devices.
> >
> > NOTE: This doesn't compromise the functioning of --only-migratable
> > option as all the unmigratable devices do set their 'dc->vmsd'.
> >
> > Introduce a new function check_migratable() and move the
> > only_migratable check inside it, also use stubs to avoid user-mode qemu
> > build failures.
> >
> > Signed-off-by: Ashijeet Acharya <ashijeetacharya@gmail.com>
>
> Yep, I think that should work.
>
> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Queued.
>
> > ---
> > Changes in v4:
> > - introduce new check_migratable() function and use stubs
> > Changes is v3:
> > - move only_migratable check inside device_set_realized() to avoid code
> > - duplication
> > - I have dropped Juan's R-b tag for this one
> > Changes in v2:
> > - place dc->vmsd check in hw/usb/bus.c as well
> > ---
> > hw/core/qdev.c | 7 +++++++
> > hw/usb/bus.c | 19 -------------------
> > include/migration/migration.h | 3 +++
> > migration/migration.c | 15 +++++++++++++++
> > qdev-monitor.c | 9 ---------
> > stubs/vmstate.c | 6 ++++++
> > 6 files changed, 31 insertions(+), 28 deletions(-)
> >
> > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > index 5783442..4f49cfe 100644
> > --- a/hw/core/qdev.c
> > +++ b/hw/core/qdev.c
> > @@ -37,6 +37,7 @@
> > #include "hw/boards.h"
> > #include "hw/sysbus.h"
> > #include "qapi-event.h"
> > +#include "migration/migration.h"
> >
> > int qdev_hotplug = 0;
> > static bool qdev_hot_added = false;
> > @@ -889,6 +890,7 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
> > Error *local_err = NULL;
> > bool unattached_parent = false;
> > static int unattached_count;
> > + int ret;
> >
> > if (dev->hotplugged && !dc->hotpluggable) {
> > error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
> > @@ -896,6 +898,11 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
> > }
> >
> > if (value && !dev->realized) {
> > + ret = check_migratable(obj, &local_err);
> > + if (ret < 0) {
> > + goto fail;
> > + }
> > +
> > if (!obj->parent) {
> > gchar *name = g_strdup_printf("device[%d]", unattached_count++);
> >
> > diff --git a/hw/usb/bus.c b/hw/usb/bus.c
> > index 1dcc35c..25913ad 100644
> > --- a/hw/usb/bus.c
> > +++ b/hw/usb/bus.c
> > @@ -8,7 +8,6 @@
> > #include "monitor/monitor.h"
> > #include "trace.h"
> > #include "qemu/cutils.h"
> > -#include "migration/migration.h"
> >
> > static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent);
> >
> > @@ -687,8 +686,6 @@ USBDevice *usbdevice_create(const char *cmdline)
> > const char *params;
> > int len;
> > USBDevice *dev;
> > - ObjectClass *klass;
> > - DeviceClass *dc;
> >
> > params = strchr(cmdline,':');
> > if (params) {
> > @@ -723,22 +720,6 @@ USBDevice *usbdevice_create(const char *cmdline)
> > return NULL;
> > }
> >
> > - klass = object_class_by_name(f->name);
> > - if (klass == NULL) {
> > - error_report("Device '%s' not found", f->name);
> > - return NULL;
> > - }
> > -
> > - dc = DEVICE_CLASS(klass);
> > -
> > - if (only_migratable) {
> > - if (dc->vmsd->unmigratable) {
> > - error_report("Device %s is not migratable, but --only-migratable "
> > - "was specified", f->name);
> > - return NULL;
> > - }
> > - }
> > -
> > if (f->usbdevice_init) {
> > dev = f->usbdevice_init(bus, params);
> > } else {
> > diff --git a/include/migration/migration.h b/include/migration/migration.h
> > index af9135f..a6868cd 100644
> > --- a/include/migration/migration.h
> > +++ b/include/migration/migration.h
> > @@ -22,6 +22,7 @@
> > #include "qapi-types.h"
> > #include "exec/cpu-common.h"
> > #include "qemu/coroutine_int.h"
> > +#include "qom/object.h"
> >
> > #define QEMU_VM_FILE_MAGIC 0x5145564d
> > #define QEMU_VM_FILE_VERSION_COMPAT 0x00000002
> > @@ -305,6 +306,8 @@ int migrate_add_blocker(Error *reason, Error **errp);
> > */
> > void migrate_del_blocker(Error *reason);
> >
> > +int check_migratable(Object *obj, Error **err);
> > +
> > bool migrate_postcopy_ram(void);
> > bool migrate_zero_blocks(void);
> >
> > diff --git a/migration/migration.c b/migration/migration.c
> > index 2766d2f..00b33f3 100644
> > --- a/migration/migration.c
> > +++ b/migration/migration.c
> > @@ -1146,6 +1146,21 @@ void migrate_del_blocker(Error *reason)
> > migration_blockers = g_slist_remove(migration_blockers, reason);
> > }
> >
> > +int check_migratable(Object *obj, Error **err)
> > +{
> > + DeviceClass *dc = DEVICE_GET_CLASS(obj);
> > + if (only_migratable && dc->vmsd) {
> > + if (dc->vmsd->unmigratable) {
> > + error_setg(err, "Device %s is not migratable, but "
> > + "--only-migratable was specified",
> > + object_get_typename(obj));
> > + return -1;
> > + }
> > + }
> > +
> > + return 0;
> > +}
> > +
> > void qmp_migrate_incoming(const char *uri, Error **errp)
> > {
> > Error *local_err = NULL;
> > diff --git a/qdev-monitor.c b/qdev-monitor.c
> > index 549f45f..5f2fcdf 100644
> > --- a/qdev-monitor.c
> > +++ b/qdev-monitor.c
> > @@ -29,7 +29,6 @@
> > #include "qemu/error-report.h"
> > #include "qemu/help_option.h"
> > #include "sysemu/block-backend.h"
> > -#include "migration/migration.h"
> >
> > /*
> > * Aliases were a bad idea from the start. Let's keep them
> > @@ -579,14 +578,6 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
> > return NULL;
> > }
> >
> > - if (only_migratable) {
> > - if (dc->vmsd->unmigratable) {
> > - error_setg(errp, "Device %s is not migratable, but "
> > - "--only-migratable was specified", driver);
> > - return NULL;
> > - }
> > - }
> > -
> > /* find bus */
> > path = qemu_opt_get(opts, "bus");
> > if (path != NULL) {
> > diff --git a/stubs/vmstate.c b/stubs/vmstate.c
> > index 6590627..5a71770 100644
> > --- a/stubs/vmstate.c
> > +++ b/stubs/vmstate.c
> > @@ -1,6 +1,7 @@
> > #include "qemu/osdep.h"
> > #include "qemu-common.h"
> > #include "migration/vmstate.h"
> > +#include "migration/migration.h"
> >
> > const VMStateDescription vmstate_dummy = {};
> >
> > @@ -18,3 +19,8 @@ void vmstate_unregister(DeviceState *dev,
> > void *opaque)
> > {
> > }
> > +
> > +int check_migratable(Object *obj, Error **err)
> > +{
> > + return 0;
> > +}
> > --
> > 2.6.2
> >
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
prev parent reply other threads:[~2017-02-28 9:41 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-13 18:04 [Qemu-devel] [PATCH v4] migrate: Introduce a 'dc->vmsd' check to avoid segfault for --only-migratable Ashijeet Acharya
2017-02-22 20:37 ` Ashijeet Acharya
2017-02-23 15:27 ` Dr. David Alan Gilbert
2017-02-28 9:41 ` Dr. David Alan Gilbert [this message]
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=20170228094108.GC2773@work-vm \
--to=dgilbert@redhat.com \
--cc=ashijeetacharya@gmail.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.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.