qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH RFC v2 02/12] reset handler for qdevified devices


From: Sanidhya Kashyap
Subject: [Qemu-devel] [PATCH RFC v2 02/12] reset handler for qdevified devices
Date: Fri, 25 Jul 2014 21:09:26 +0530

I have added a structure containing the list of qdevified devices which have
been added to the SaveVMHandlers. Since, I was unable to find any particular
struct containing the information about all the qdevified devices. So, I have
created my own version, which is very very specific.

I shall be grateful if anyone can give some pointers on this.

Signed-off-by: Sanidhya Kashyap <address@hidden>
---
 savevm.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/savevm.c b/savevm.c
index e19ae0a..0255fa0 100644
--- a/savevm.c
+++ b/savevm.c
@@ -503,12 +503,29 @@ void unregister_savevm(DeviceState *dev, const char 
*idstr, void *opaque)
     }
 }
 
+/*
+ * Reset entry for qdevified devices.
+ * Contains all those devices which have been qdevified and are
+ * part of the SaveVMHandlers. This one allows resetting of
+ * single device at any time.
+ */
+
+typedef struct VMStatesQdevResetEntry {
+    QTAILQ_ENTRY(VMStatesQdevResetEntry) entry;
+    DeviceState *dev;
+    char device_name[256];
+} VMStatesQdevResetEntry;
+
+static QTAILQ_HEAD(vmstate_reset_handlers, VMStatesQdevResetEntry)
+      vmstate_reset_handlers = QTAILQ_HEAD_INITIALIZER(vmstate_reset_handlers);
+
 int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
                                    const VMStateDescription *vmsd,
                                    void *opaque, int alias_id,
                                    int required_for_version)
 {
     SaveStateEntry *se;
+    VMStatesQdevResetEntry *qre;
 
     /* If this triggers, alias support can be dropped for the vmsd. */
     assert(alias_id == -1 || required_for_version >= vmsd->minimum_version_id);
@@ -521,6 +538,12 @@ int vmstate_register_with_alias_id(DeviceState *dev, int 
instance_id,
     se->alias_id = alias_id;
 
     if (dev) {
+
+        qre = g_malloc0(sizeof(VMStatesQdevResetEntry));
+        qre->dev = dev;
+        strcpy(qre->device_name, vmsd->name);
+        QTAILQ_INSERT_TAIL(&vmstate_reset_handlers, qre, entry);
+
         char *id = qdev_get_dev_path(dev);
         if (id) {
             pstrcpy(se->idstr, sizeof(se->idstr), id);
@@ -551,6 +574,7 @@ void vmstate_unregister(DeviceState *dev, const 
VMStateDescription *vmsd,
                         void *opaque)
 {
     SaveStateEntry *se, *new_se;
+    VMStatesQdevResetEntry *qre, *new_qre;
 
     QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
         if (se->vmsd == vmsd && se->opaque == opaque) {
@@ -561,6 +585,12 @@ void vmstate_unregister(DeviceState *dev, const 
VMStateDescription *vmsd,
             g_free(se);
         }
     }
+
+    QTAILQ_FOREACH_SAFE(qre, &vmstate_reset_handlers, entry, new_qre) {
+        if (dev && qre->dev && !strcmp(vmsd->name, qre->device_name)) {
+            QTAILQ_REMOVE(&vmstate_reset_handlers, qre, entry);
+        }
+    }
 }
 
 static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
-- 
1.9.3




reply via email to

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