qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH RFC for-1.6 qom-next 3/3] pci: Move AER log into VMS


From: Andreas Färber
Subject: [Qemu-devel] [PATCH RFC for-1.6 qom-next 3/3] pci: Move AER log into VMStateSubsection
Date: Sun, 28 Jul 2013 03:41:10 +0200

XHCI does not call pcie_aer_init(), so use allocation of the AER log as
indicator for whether vmstate_pcie_aer_log is needed.

Go safe and zero the log pointer to support unrealizing and re-realizing
a PCIDevice without AER.

Signed-off-by: Andreas Färber <address@hidden>
---
 hw/pci/pci.c      | 24 ++++++++++++++++++++++--
 hw/pci/pcie_aer.c |  1 +
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index b69421a..4f373f9 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -477,6 +477,25 @@ const VMStateDescription vmstate_pci_device = {
     }
 };
 
+static bool pcie_aer_log_needed(void *opaque)
+{
+    PCIDevice *s = opaque;
+
+    return s->exp.aer_log.log != NULL;
+}
+
+static const VMStateDescription vmstate_pcie_device_aer_log = {
+    .name = "PCIEDevice/AER_Log",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_STRUCT(exp.aer_log, PCIDevice, 0,
+                       vmstate_pcie_aer_log, PCIEAERLog),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 static bool pcie_msix_needed(void *opaque)
 {
     PCIDevice *s = opaque;
@@ -497,12 +516,13 @@ const VMStateDescription vmstate_pcie_device = {
         VMSTATE_BUFFER_UNSAFE_INFO(irq_state, PCIDevice, 2,
                                   vmstate_info_pci_irq_state,
                                   PCI_NUM_PINS * sizeof(int32_t)),
-        VMSTATE_STRUCT(exp.aer_log, PCIDevice, 0,
-                       vmstate_pcie_aer_log, PCIEAERLog),
         VMSTATE_END_OF_LIST()
     },
     .subsections = (VMStateSubsection[]) {
         {
+            .vmsd = &vmstate_pcie_device_aer_log,
+            .needed = pcie_aer_log_needed,
+        }, {
             .vmsd = &vmstate_msix,
             .needed = pcie_msix_needed,
         }, {
diff --git a/hw/pci/pcie_aer.c b/hw/pci/pcie_aer.c
index ca762ab..2767ebc 100644
--- a/hw/pci/pcie_aer.c
+++ b/hw/pci/pcie_aer.c
@@ -166,6 +166,7 @@ int pcie_aer_init(PCIDevice *dev, uint16_t offset)
 void pcie_aer_exit(PCIDevice *dev)
 {
     g_free(dev->exp.aer_log.log);
+    dev->exp.aer_log.log = NULL;
 }
 
 static void pcie_aer_update_uncor_status(PCIDevice *dev)
-- 
1.8.1.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]