From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:44473) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RQ4F5-0003o6-0e for qemu-devel@nongnu.org; Mon, 14 Nov 2011 16:39:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RQ4F3-0006ho-Bl for qemu-devel@nongnu.org; Mon, 14 Nov 2011 16:39:02 -0500 Received: from mail-vx0-f173.google.com ([209.85.220.173]:47482) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RQ4F3-0006hi-25 for qemu-devel@nongnu.org; Mon, 14 Nov 2011 16:39:01 -0500 Received: by vcbfo13 with SMTP id fo13so3847258vcb.4 for ; Mon, 14 Nov 2011 13:39:00 -0800 (PST) Message-ID: <4EC18A71.4080102@codemonkey.ws> Date: Mon, 14 Nov 2011 15:38:57 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <1321304987-23041-1-git-send-email-aliguori@us.ibm.com> <1321304987-23041-2-git-send-email-aliguori@us.ibm.com> <4EC188CE.50704@linux.vnet.ibm.com> In-Reply-To: <4EC188CE.50704@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 2/5] ivshmem: use migration blockers to prevent live migration in peer mode (v2) List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Michael Roth Cc: Kevin Wolf , Lucas Meneghel Rodrigues , Anthony Liguori , Stefan Hajnoczi , Juan Quintela , qemu-devel@nongnu.org, Avi Kivity On 11/14/2011 03:31 PM, Michael Roth wrote: > On 11/14/2011 03:09 PM, Anthony Liguori wrote: >> Now when you try to migrate with ivshmem, you get a proper QMP error: >> >> (qemu) migrate tcp:localhost:1025 >> Migration is disabled when using feature 'peer mode' in device 'ivshmem' >> (qemu) >> >> Signed-off-by: Anthony Liguori >> --- >> v1 -> v2 >> - remove register_device_unmigratable as ivshmem was the only user >> --- >> hw/ivshmem.c | 12 +- >> qerror.c | 4 + >> qerror.h | 3 + >> savevm.c | 25 --- >> vmstate.h | 610 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 5 files changed, 628 insertions(+), 26 deletions(-) >> create mode 100644 vmstate.h >> >> diff --git a/hw/ivshmem.c b/hw/ivshmem.c >> index 242fbea..a3a0e98 100644 >> --- a/hw/ivshmem.c >> +++ b/hw/ivshmem.c >> @@ -18,6 +18,8 @@ >> #include "pci.h" >> #include "msix.h" >> #include "kvm.h" >> +#include "migration.h" >> +#include "qerror.h" >> >> #include >> #include >> @@ -78,6 +80,8 @@ typedef struct IVShmemState { >> uint32_t features; >> EventfdEntry *eventfd_table; >> >> + Error *migration_blocker; >> + >> char * shmobj; >> char * sizearg; >> char * role; >> @@ -646,7 +650,8 @@ static int pci_ivshmem_init(PCIDevice *dev) >> } >> >> if (s->role_val == IVSHMEM_PEER) { >> - register_device_unmigratable(&s->dev.qdev, "ivshmem", s); >> + error_set(&s->migration_blocker, QERR_DEVICE_FEATURE_BLOCKS_MIGRATION, >> "ivshmem", "peer mode"); >> + migrate_add_blocker(s->migration_blocker); >> } >> >> pci_conf = s->dev.config; >> @@ -741,6 +746,11 @@ static int pci_ivshmem_uninit(PCIDevice *dev) >> { >> IVShmemState *s = DO_UPCAST(IVShmemState, dev, dev); >> >> + if (s->migration_blocker) { >> + migrate_del_blocker(s->migration_blocker); >> + error_free(s->migration_blocker); >> + } >> + >> memory_region_destroy(&s->ivshmem_mmio); >> memory_region_del_subregion(&s->bar,&s->ivshmem); >> memory_region_destroy(&s->ivshmem); >> diff --git a/qerror.c b/qerror.c >> index 4b48b39..8e30e2d 100644 >> --- a/qerror.c >> +++ b/qerror.c >> @@ -73,6 +73,10 @@ static const QErrorStringTable qerror_table[] = { >> .desc = "Device '%(device)' is in use", >> }, >> { >> + .error_fmt = QERR_DEVICE_FEATURE_BLOCKS_MIGRATION, >> + .desc = "Migration is disabled when using feature '%(feature)' in device >> '%(device)'", >> + }, >> + { >> .error_fmt = QERR_DEVICE_LOCKED, >> .desc = "Device '%(device)' is locked", >> }, >> diff --git a/qerror.h b/qerror.h >> index d4bfcfd..7e2eebf 100644 >> --- a/qerror.h >> +++ b/qerror.h >> @@ -72,6 +72,9 @@ QError *qobject_to_qerror(const QObject *obj); >> #define QERR_DEVICE_IN_USE \ >> "{ 'class': 'DeviceInUse', 'data': { 'device': %s } }" >> >> +#define QERR_DEVICE_FEATURE_BLOCKS_MIGRATION \ >> + "{ 'class': 'DeviceFeatureBlocksMigration', 'data': { 'device': %s, >> 'feature': %s } }" >> + >> #define QERR_DEVICE_LOCKED \ >> "{ 'class': 'DeviceLocked', 'data': { 'device': %s } }" >> >> diff --git a/savevm.c b/savevm.c >> index bee16c0..f53cd4c 100644 >> --- a/savevm.c >> +++ b/savevm.c >> @@ -1255,31 +1255,6 @@ void unregister_savevm(DeviceState *dev, const char >> *idstr, void *opaque) >> } >> } >> >> -/* mark a device as not to be migrated, that is the device should be >> - unplugged before migration */ >> -void register_device_unmigratable(DeviceState *dev, const char *idstr, >> - void *opaque) >> -{ >> - SaveStateEntry *se; >> - char id[256] = ""; >> - >> - if (dev&& dev->parent_bus&& dev->parent_bus->info->get_dev_path) { >> - char *path = dev->parent_bus->info->get_dev_path(dev); >> - if (path) { >> - pstrcpy(id, sizeof(id), path); >> - pstrcat(id, sizeof(id), "/"); >> - g_free(path); >> - } >> - } >> - pstrcat(id, sizeof(id), idstr); >> - >> - QTAILQ_FOREACH(se,&savevm_handlers, entry) { >> - if (strcmp(se->idstr, id) == 0&& se->opaque == opaque) { >> - se->no_migrate = 1; >> - } >> - } >> -} >> - >> int vmstate_register_with_alias_id(DeviceState *dev, int instance_id, >> const VMStateDescription *vmsd, >> void *opaque, int alias_id, >> diff --git a/vmstate.h b/vmstate.h >> new file mode 100644 >> index 0000000..9ea4783 >> --- /dev/null >> +++ b/vmstate.h >> @@ -0,0 +1,610 @@ >> +/* >> + * QEMU migration/snapshot declarations >> + * > > I take it these were meant for a separate series? We still have these defs in > hw/hw.h *sigh* I have no idea where that file came from. I fixed the patch locally, thanks for pointing it out! Regards, Anthony Liguori > >