Igor Mammedov <imamm...@redhat.com> wrote:
> On Tue, 23 Apr 2013 13:38:10 +0200
> Juan Quintela <quint...@redhat.com> wrote:

Something like this (on top of your series) should work.

It implements an optional subsection and is sent depending if we have
used (or not) cpu hotplug.  I just compiled it,  haven't tested it,  so
it should be perfect (TM).

What do you think?

Thanks,  Juan.


>From f887ce646f65a81ceff1920c7e6e2287b914b3ca Mon Sep 17 00:00:00 2001
From: Juan Quintela <quint...@trasno.org>
Date: Tue, 23 Apr 2013 17:23:29 +0200
Subject: [PATCH] vmstate subsection example


Signed-off-by: Juan Quintela <quint...@trasno.org>
---
 hw/acpi/piix4.c | 42 +++++++++++++++++++++++++++++-------------
 1 file changed, 29 insertions(+), 13 deletions(-)

diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index b845123..14dba76 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -60,6 +60,7 @@ struct pci_status {
 };

 struct cpu_status {
+    bool hotplug_happened;
     uint8_t sts[PIIX4_PROC_LEN];
 };

@@ -269,17 +270,23 @@ static int acpi_load_old(QEMUFile *f, void *opaque, int 
version_id)
     return ret;
 }

-#define VMSTATE_CPU_STATUS_ARRAY(_field, _state)                             \
- {                                                                           \
-     .name       = (stringify(_field)),                                      \
-     .version_id = 0,                                                        \
-     .num        = PIIX4_PROC_LEN,                                           \
-     .info       = &vmstate_info_uint8,                                      \
-     .size       = sizeof(uint8_t),                                          \
-     .flags      = VMS_ARRAY,                                                \
-     .offset     = vmstate_offset_array(_state, _field, uint8_t,             \
-                                        PIIX4_PROC_LEN),                     \
- }
+static bool vmstate_piix4_hotplug_needed(void *opaque)
+{
+    PIIX4PMState *s = opaque;
+
+    return s->gpe_cpu.hotplug_happened;
+}
+
+static const VMStateDescription vmstate_piix4_hotplug_state = {
+    .name ="piix4_pm/hotplug",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField []) {
+        VMSTATE_UINT8_ARRAY(gpe_cpu.sts, PIIX4PMState, PIIX4_PROC_LEN),
+        VMSTATE_END_OF_LIST()
+    }
+};

 /* qemu-kvm 1.2 uses version 3 but advertised as 2
  * To support incoming qemu-kvm 1.2 migration, change version_id
@@ -289,7 +296,7 @@ static int acpi_load_old(QEMUFile *f, void *opaque, int 
version_id)
  */
 static const VMStateDescription vmstate_acpi = {
     .name = "piix4_pm",
-    .version_id = 4,
+    .version_id = 3,
     .minimum_version_id = 3,
     .minimum_version_id_old = 1,
     .load_state_old = acpi_load_old,
@@ -305,8 +312,15 @@ static const VMStateDescription vmstate_acpi = {
         VMSTATE_STRUCT(ar.gpe, PIIX4PMState, 2, vmstate_gpe, ACPIGPE),
         VMSTATE_STRUCT(pci0_status, PIIX4PMState, 2, vmstate_pci_status,
                        struct pci_status),
-        VMSTATE_CPU_STATUS_ARRAY(gpe_cpu.sts, PIIX4PMState),
         VMSTATE_END_OF_LIST()
+    },
+    .subsections = (VMStateSubsection[]) {
+        {
+            .vmsd = &vmstate_piix4_hotplug_state,
+            .needed = vmstate_piix4_hotplug_needed,
+        }, {
+            /* empty */
+        }
     }
 };

@@ -664,6 +678,7 @@ static void piix4_cpu_added_req(Notifier *n, void *opaque)
 {
     PIIX4PMState *s = container_of(n, PIIX4PMState, cpu_added_notifier);

+    s->gpe_cpu.hotplug_happened = true;
     piix4_cpu_hotplug_req(s, CPU(opaque), PLUG);
 }

@@ -706,6 +721,7 @@ static void piix4_acpi_system_hot_add_init(MemoryRegion 
*parent,
     pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev);

     piix4_init_cpu_status(qdev_get_machine(), &s->gpe_cpu);
+    s->gpe_cpu.hotplug_happened = false;
     memory_region_init_io(&s->io_cpu, &cpu_hotplug_ops, s, "apci-cpu-hotplug",
                           PIIX4_PROC_LEN);
     memory_region_add_subregion(parent, PIIX4_PROC_BASE, &s->io_cpu);
-- 
1.8.1.4


Reply via email to