Patchwork [RESEND,1/2] qdev: Track runtime machine modifications

login
register
mail settings
Submitter Alex Williamson
Date Jan. 4, 2011, 7:37 p.m.
Message ID <20110104193743.1909.65407.stgit@s20.home>
Download mbox | patch
Permalink /patch/77522/
State New
Headers show

Comments

Alex Williamson - Jan. 4, 2011, 7:37 p.m.
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.williamson@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Juan Quintela <quintela@redhat.com>
---

 hw/qdev.c |   10 ++++++++++
 hw/qdev.h |    1 +
 2 files changed, 11 insertions(+), 0 deletions(-)
Markus Armbruster - Jan. 12, 2011, 12:09 p.m.
Alex Williamson <alex.williamson@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.williamson@redhat.com>
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Acked-by: Juan Quintela <quintela@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.

[...]
Alex Williamson - Jan. 12, 2011, 1:51 p.m.
On Wed, 2011-01-12 at 13:09 +0100, Markus Armbruster wrote:
> Alex Williamson <alex.williamson@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.williamson@redhat.com>
> > Acked-by: Michael S. Tsirkin <mst@redhat.com>
> > Acked-by: Juan Quintela <quintela@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

Patch

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)
 {
diff --git a/hw/qdev.h b/hw/qdev.h
index aaaf55a..273bbac 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -132,6 +132,7 @@  int qdev_unplug(DeviceState *dev);
 void qdev_free(DeviceState *dev);
 int qdev_simple_unplug_cb(DeviceState *dev);
 void qdev_machine_creation_done(void);
+bool qdev_machine_modified(void);
 
 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n);
 void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin);