On Wed, 2011-01-12 at 13:09 +0100, Markus Armbruster wrote: > Alex Williamson <alex.william...@redhat.com> writes: > > > Create a trivial interface to track whether the machine has been > > modified since boot. Adding or removing devices will trigger this > > to return true. An example usage scenario for such an interface is > > the rtl8139 driver which includes a cpu_register_io_memory() value > > in it's migration stream. For the majority of migrations, where > > no hotplug has occured in the machine, this works correctly. Once > > the machine is modified, we can use this interface to detect that > > and include a subsection for the device to prevent migrations to > > rtl8139 versions with this bug. > > > > Signed-off-by: Alex Williamson <alex.william...@redhat.com> > > Acked-by: Michael S. Tsirkin <m...@redhat.com> > > Acked-by: Juan Quintela <quint...@redhat.com> > > --- > > > > hw/qdev.c | 10 ++++++++++ > > hw/qdev.h | 1 + > > 2 files changed, 11 insertions(+), 0 deletions(-) > > > > diff --git a/hw/qdev.c b/hw/qdev.c > > index 6fc9b02..e450c21 100644 > > --- a/hw/qdev.c > > +++ b/hw/qdev.c > > @@ -32,6 +32,8 @@ > > #include "blockdev.h" > > > > static int qdev_hotplug = 0; > > +static bool qdev_hot_added = false; > > +static bool qdev_hot_removed = false; > > > > /* This is a nasty hack to allow passing a NULL bus to qdev_create. */ > > static BusState *main_system_bus; > > @@ -93,6 +95,7 @@ static DeviceState *qdev_create_from_info(BusState *bus, > > DeviceInfo *info) > > if (qdev_hotplug) { > > assert(bus->allow_hotplug); > > dev->hotplugged = 1; > > + qdev_hot_added = true; > > } > > dev->instance_id_alias = -1; > > dev->state = DEV_STATE_CREATED; > > @@ -294,6 +297,8 @@ int qdev_unplug(DeviceState *dev) > > } > > assert(dev->info->unplug != NULL); > > > > + qdev_hot_removed = true; > > + > > return dev->info->unplug(dev); > > } > > > > @@ -394,6 +399,11 @@ void qdev_machine_creation_done(void) > > qdev_hotplug = 1; > > } > > > > +bool qdev_machine_modified(void) > > +{ > > + return qdev_hot_added || qdev_hot_removed; > > +} > > + > > /* Get a character (serial) device interface. */ > > CharDriverState *qdev_init_chardev(DeviceState *dev) > > { > > Why do you track add/remove separately, in qdev_hot_added and > qdev_hot_removed? I don't mind, just curious.
I thought the distinction might be useful at some point, but we don't use it yet. Thanks, Alex