From patchwork Wed May 12 21:19:10 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 52438 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 285B1B7DE9 for ; Thu, 13 May 2010 14:39:00 +1000 (EST) Received: from localhost ([127.0.0.1]:37800 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OCQCG-0005al-OH for incoming@patchwork.ozlabs.org; Thu, 13 May 2010 00:38:56 -0400 Received: from [140.186.70.92] (port=41099 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OCPBY-0008UA-1w for qemu-devel@nongnu.org; Wed, 12 May 2010 23:34:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OCKEP-0000HA-Il for qemu-devel@nongnu.org; Wed, 12 May 2010 18:16:47 -0400 Received: from fmmailgate02.web.de ([217.72.192.227]:35696) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OCKEM-0000Gk-4d for qemu-devel@nongnu.org; Wed, 12 May 2010 18:16:43 -0400 Received: from smtp07.web.de ( [172.20.5.215]) by fmmailgate02.web.de (Postfix) with ESMTP id 655B316074E04; Wed, 12 May 2010 23:19:20 +0200 (CEST) Received: from [88.64.22.236] (helo=localhost.localdomain) by smtp07.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #4) id 1OCJKq-00064i-01; Wed, 12 May 2010 23:19:20 +0200 From: Jan Kiszka To: qemu-devel@nongnu.org Date: Wed, 12 May 2010 23:19:10 +0200 Message-Id: <6eda7a61ed240ba027131fbc393822e2a5318654.1273699147.git.jan.kiszka@web.de> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: References: In-Reply-To: References: X-Sender: jan.kiszka@web.de X-Provags-ID: V01U2FsdGVkX18o627yRYz+RII1auPFbD9w4FC9ORaTXsyhD+pA WGOtHnyN8QTPERcxm2e4qOa6NnxUdg9il5YIXpw9UEo1RUVh4o LK2lho22k= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4-2.6 Cc: Jan Kiszka , Juan Quintela Subject: [Qemu-devel] [PATCH 3/6] vmstate: Add support for alias ID X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Jan Kiszka Some legacy users (mostly PC devices) of vmstate_register manage instance IDs on their own, and that unfortunately in a way that is incompatible with automatically generated ones. This so far prevents switching those users to vmstates that are registered by qdev. To establish a migration path, this patch introduces the concept of alias IDs. They can be passed to an extended vmstate registration service, and qdev provides a set service to be used during device init. find_se will consider the alias in addition to the default ID. We can then start generating the default ID automatically and writing it on vmsave, thus converting that format without breaking support for upward migration. Signed-off-by: Jan Kiszka --- hw/hw.h | 3 +++ hw/qdev.c | 13 +++++++++++-- hw/qdev.h | 2 ++ savevm.c | 16 +++++++++++++--- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/hw/hw.h b/hw/hw.h index 2d39724..d124716 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -758,5 +758,8 @@ extern void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, void *opaque); extern int vmstate_register(int instance_id, const VMStateDescription *vmsd, void *base); +extern int vmstate_register_with_alias_id(int instance_id, + const VMStateDescription *vmsd, + void *base, int alias_id); void vmstate_unregister(const VMStateDescription *vmsd, void *opaque); #endif diff --git a/hw/qdev.c b/hw/qdev.c index d3bf0fa..445d4d7 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -93,6 +93,7 @@ static DeviceState *qdev_create_from_info(BusState *bus, DeviceInfo *info) assert(bus->allow_hotplug); dev->hotplugged = 1; } + dev->instance_id_alias = -1; dev->state = DEV_STATE_CREATED; return dev; } @@ -278,12 +279,20 @@ int qdev_init(DeviceState *dev) return rc; } qemu_register_reset(qdev_reset, dev); - if (dev->info->vmsd) - vmstate_register(-1, dev->info->vmsd, dev); + if (dev->info->vmsd) { + vmstate_register_with_alias_id(-1, dev->info->vmsd, dev, + dev->instance_id_alias); + } dev->state = DEV_STATE_INITIALIZED; return 0; } +void qdev_set_instance_id_alias(DeviceState *dev, int alias_id) +{ + assert(dev->state == DEV_STATE_CREATED); + dev->instance_id_alias = alias_id; +} + int qdev_unplug(DeviceState *dev) { if (!dev->parent_bus->allow_hotplug) { diff --git a/hw/qdev.h b/hw/qdev.h index d8fbc73..b7dbee4 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -44,6 +44,7 @@ struct DeviceState { QLIST_HEAD(, BusState) child_bus; int num_child_bus; QLIST_ENTRY(DeviceState) sibling; + int instance_id_alias; }; typedef void (*bus_dev_printfn)(Monitor *mon, DeviceState *dev, int indent); @@ -112,6 +113,7 @@ int qdev_device_help(QemuOpts *opts); DeviceState *qdev_device_add(QemuOpts *opts); int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT; void qdev_init_nofail(DeviceState *dev); +void qdev_set_instance_id_alias(DeviceState *dev, int alias_id); int qdev_unplug(DeviceState *dev); void qdev_free(DeviceState *dev); int qdev_simple_unplug_cb(DeviceState *dev); diff --git a/savevm.c b/savevm.c index 74e553c..f155582 100644 --- a/savevm.c +++ b/savevm.c @@ -991,6 +991,7 @@ typedef struct SaveStateEntry { QTAILQ_ENTRY(SaveStateEntry) entry; char idstr[256]; int instance_id; + int alias_id; int version_id; int section_id; SaveSetParamsHandler *set_params; @@ -1079,8 +1080,9 @@ void unregister_savevm(const char *idstr, void *opaque) } } -int vmstate_register(int instance_id, const VMStateDescription *vmsd, - void *opaque) +int vmstate_register_with_alias_id(int instance_id, + const VMStateDescription *vmsd, + void *opaque, int alias_id) { SaveStateEntry *se; @@ -1093,6 +1095,7 @@ int vmstate_register(int instance_id, const VMStateDescription *vmsd, se->load_state = NULL; se->opaque = opaque; se->vmsd = vmsd; + se->alias_id = alias_id; if (instance_id == -1) { se->instance_id = calculate_new_instance_id(vmsd->name); @@ -1104,6 +1107,12 @@ int vmstate_register(int instance_id, const VMStateDescription *vmsd, return 0; } +int vmstate_register(int instance_id, const VMStateDescription *vmsd, + void *opaque) +{ + return vmstate_register_with_alias_id(instance_id, vmsd, opaque, -1); +} + void vmstate_unregister(const VMStateDescription *vmsd, void *opaque) { SaveStateEntry *se, *new_se; @@ -1433,7 +1442,8 @@ static SaveStateEntry *find_se(const char *idstr, int instance_id) QTAILQ_FOREACH(se, &savevm_handlers, entry) { if (!strcmp(se->idstr, idstr) && - instance_id == se->instance_id) + (instance_id == se->instance_id || + instance_id == se->alias_id)) return se; } return NULL;