qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] Re: [PATCH RFC] Mark a device as non-migratable


From: Anthony Liguori
Subject: [Qemu-devel] Re: [PATCH RFC] Mark a device as non-migratable
Date: Tue, 15 Jun 2010 11:32:28 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100423 Lightning/1.0b1 Thunderbird/3.0.4

On 06/15/2010 11:16 AM, Cam Macdonell wrote:
How does this look for marking the device as non-migratable?  It adds a field
'no_migrate' to the SaveStateEntry and tests for it in vmstate_save.  This would
replace anything that touches memory.

Cam

---
  hw/hw.h  |    1 +
  savevm.c |   32 +++++++++++++++++++++++++++++---
  2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/hw/hw.h b/hw/hw.h
index d78d814..7c93f08 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -263,6 +263,7 @@ int register_savevm_live(const char *idstr,
                           void *opaque);

  void unregister_savevm(const char *idstr, void *opaque);
+void mark_no_migrate(const char *idstr, void *opaque);

I'm not thrilled with the name but the functionality is spot on. I lack the creativity to offer a better name suggestion :-)

Regards,

Anthony Liguori

  typedef void QEMUResetHandler(void *opaque);

diff --git a/savevm.c b/savevm.c
index 017695b..2642a9c 100644
--- a/savevm.c
+++ b/savevm.c
@@ -1023,6 +1023,7 @@ typedef struct SaveStateEntry {
      LoadStateHandler *load_state;
      const VMStateDescription *vmsd;
      void *opaque;
+    int no_migrate;
  } SaveStateEntry;


@@ -1069,6 +1070,7 @@ int register_savevm_live(const char *idstr,
      se->load_state = load_state;
      se->opaque = opaque;
      se->vmsd = NULL;
+    se->no_migrate = 0;

      if (instance_id == -1) {
          se->instance_id = calculate_new_instance_id(idstr);
@@ -1103,6 +1105,19 @@ void unregister_savevm(const char *idstr, void *opaque)
      }
  }

+/* mark a device as not to be migrated, that is the device should be
+   unplugged before migration */
+void mark_no_migrate(const char *idstr, void *opaque)
+{
+    SaveStateEntry *se;
+
+    QTAILQ_FOREACH(se,&savevm_handlers, entry) {
+        if (strcmp(se->idstr, idstr) == 0&&  se->opaque == opaque) {
+            se->no_migrate = 1;
+        }
+    }
+}
+
  int vmstate_register_with_alias_id(int instance_id,
                                     const VMStateDescription *vmsd,
                                     void *opaque, int alias_id,
@@ -1277,13 +1292,19 @@ static int vmstate_load(QEMUFile *f, SaveStateEntry 
*se, int version_id)
      return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
  }

-static void vmstate_save(QEMUFile *f, SaveStateEntry *se)
+static int vmstate_save(QEMUFile *f, SaveStateEntry *se)
  {
+    if (se->no_migrate) {
+        return -1;
+    }
+
      if (!se->vmsd) {         /* Old style */
          se->save_state(f, se->opaque);
-        return;
+        return 0;
      }
      vmstate_save_state(f,se->vmsd, se->opaque);
+
+    return 0;
  }

  #define QEMU_VM_FILE_MAGIC           0x5145564d
@@ -1377,6 +1398,7 @@ int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f)
  int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f)
  {
      SaveStateEntry *se;
+    int r;

      cpu_synchronize_all_states();

@@ -1409,7 +1431,11 @@ int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f)
          qemu_put_be32(f, se->instance_id);
          qemu_put_be32(f, se->version_id);

-        vmstate_save(f, se);
+        r = vmstate_save(f, se);
+        if (r<  0) {
+            monitor_printf(mon, "cannot migrate with device '%s'\n", 
se->idstr);
+            return r;
+        }
      }

      qemu_put_byte(f, QEMU_VM_EOF);




reply via email to

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