qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] Re: [RFC PATCH 10/20] Introduce skip_header parameter to qe


From: Anthony Liguori
Subject: [Qemu-devel] Re: [RFC PATCH 10/20] Introduce skip_header parameter to qemu_loadvm_state() so that it can be called iteratively without reading the header.
Date: Thu, 22 Apr 2010 14:34:37 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091209 Fedora/3.0-4.fc12 Lightning/1.0pre Thunderbird/3.0

On 04/21/2010 12:57 AM, Yoshiaki Tamura wrote:
Signed-off-by: Yoshiaki Tamura<address@hidden>

I think the more appropriate thing to do is have qemu_savevm_state_complete() not write QEMU_VM_EOF when doing a continuous live migration.

You would then want qemu_loadvm_state() to detect real EOF and treat that the same as QEMU_VM_EOF (provided it occurred at a section boundary).

Of course, this should be a flag to qemu_loadvm_state() as it's not always the right behavior.

Regards,

Anthony Liguori

---
  migration-exec.c |    2 +-
  migration-fd.c   |    2 +-
  migration-tcp.c  |    2 +-
  migration-unix.c |    2 +-
  savevm.c         |   25 ++++++++++++++-----------
  sysemu.h         |    2 +-
  6 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/migration-exec.c b/migration-exec.c
index 3edc026..5839a6d 100644
--- a/migration-exec.c
+++ b/migration-exec.c
@@ -113,7 +113,7 @@ static void exec_accept_incoming_migration(void *opaque)
      QEMUFile *f = opaque;
      int ret;

-    ret = qemu_loadvm_state(f);
+    ret = qemu_loadvm_state(f, 0);
      if (ret<  0) {
          fprintf(stderr, "load of migration failed\n");
          goto err;
diff --git a/migration-fd.c b/migration-fd.c
index 0cc74ad..0e97ed0 100644
--- a/migration-fd.c
+++ b/migration-fd.c
@@ -106,7 +106,7 @@ static void fd_accept_incoming_migration(void *opaque)
      QEMUFile *f = opaque;
      int ret;

-    ret = qemu_loadvm_state(f);
+    ret = qemu_loadvm_state(f, 0);
      if (ret<  0) {
          fprintf(stderr, "load of migration failed\n");
          goto err;
diff --git a/migration-tcp.c b/migration-tcp.c
index 56e1a3b..94a1a03 100644
--- a/migration-tcp.c
+++ b/migration-tcp.c
@@ -182,7 +182,7 @@ static void tcp_accept_incoming_migration(void *opaque)
          goto out;
      }

-    ret = qemu_loadvm_state(f);
+    ret = qemu_loadvm_state(f, 0);
      if (ret<  0) {
          fprintf(stderr, "load of migration failed\n");
          goto out_fopen;
diff --git a/migration-unix.c b/migration-unix.c
index b7aab38..dd99a73 100644
--- a/migration-unix.c
+++ b/migration-unix.c
@@ -168,7 +168,7 @@ static void unix_accept_incoming_migration(void *opaque)
          goto out;
      }

-    ret = qemu_loadvm_state(f);
+    ret = qemu_loadvm_state(f, 0);
      if (ret<  0) {
          fprintf(stderr, "load of migration failed\n");
          goto out_fopen;
diff --git a/savevm.c b/savevm.c
index 22d928c..a401b27 100644
--- a/savevm.c
+++ b/savevm.c
@@ -1554,7 +1554,7 @@ typedef struct LoadStateEntry {
      int version_id;
  } LoadStateEntry;

-int qemu_loadvm_state(QEMUFile *f)
+int qemu_loadvm_state(QEMUFile *f, int skip_header)
  {
      QLIST_HEAD(, LoadStateEntry) loadvm_handlers =
          QLIST_HEAD_INITIALIZER(loadvm_handlers);
@@ -1563,17 +1563,20 @@ int qemu_loadvm_state(QEMUFile *f)
      unsigned int v;
      int ret;

-    v = qemu_get_be32(f);
-    if (v != QEMU_VM_FILE_MAGIC)
-        return -EINVAL;
+    if (!skip_header) {
+        v = qemu_get_be32(f);
+        if (v != QEMU_VM_FILE_MAGIC)
+            return -EINVAL;
+
+        v = qemu_get_be32(f);
+        if (v == QEMU_VM_FILE_VERSION_COMPAT) {
+            fprintf(stderr, "SaveVM v3 format is obsolete and don't work 
anymore\n");
+            return -ENOTSUP;
+        }
+        if (v != QEMU_VM_FILE_VERSION)
+            return -ENOTSUP;

-    v = qemu_get_be32(f);
-    if (v == QEMU_VM_FILE_VERSION_COMPAT) {
-        fprintf(stderr, "SaveVM v2 format is obsolete and don't work 
anymore\n");
-        return -ENOTSUP;
      }
-    if (v != QEMU_VM_FILE_VERSION)
-        return -ENOTSUP;

      while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
          uint32_t instance_id, version_id, section_id;
@@ -1898,7 +1901,7 @@ int load_vmstate(Monitor *mon, const char *name)
          monitor_printf(mon, "Could not open VM state file\n");
          return -EINVAL;
      }
-    ret = qemu_loadvm_state(f);
+    ret = qemu_loadvm_state(f, 0);
      qemu_fclose(f);
      if (ret<  0) {
          monitor_printf(mon, "Error %d while loading VM state\n", ret);
diff --git a/sysemu.h b/sysemu.h
index 647a468..6c1441f 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -68,7 +68,7 @@ int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int 
blk_enable,
  int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f);
  int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f);
  void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f);
-int qemu_loadvm_state(QEMUFile *f);
+int qemu_loadvm_state(QEMUFile *f, int skip_header);

  void qemu_errors_to_file(FILE *fp);
  void qemu_errors_to_mon(Monitor *mon);





reply via email to

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