Patchwork [RFC,10/20] Introduce skip_header parameter to qemu_loadvm_state() so that it can be called iteratively without reading the header.

login
register
mail settings
Submitter Yoshiaki Tamura
Date April 21, 2010, 5:57 a.m.
Message ID <1271829445-5328-11-git-send-email-tamura.yoshiaki@lab.ntt.co.jp>
Download mbox | patch
Permalink /patch/50629/
State New
Headers show

Comments

Yoshiaki Tamura - April 21, 2010, 5:57 a.m.
Signed-off-by: Yoshiaki Tamura <tamura.yoshiaki@lab.ntt.co.jp>
---
 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(-)
Anthony Liguori - April 22, 2010, 7:34 p.m.
On 04/21/2010 12:57 AM, Yoshiaki Tamura wrote:
> Signed-off-by: Yoshiaki Tamura<tamura.yoshiaki@lab.ntt.co.jp>
>    

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);
>
Yoshiaki Tamura - April 23, 2010, 4:25 a.m.
Anthony Liguori wrote:
> On 04/21/2010 12:57 AM, Yoshiaki Tamura wrote:
>> Signed-off-by: Yoshiaki Tamura<tamura.yoshiaki@lab.ntt.co.jp>
>
> 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.

Sorry.  I couldn't get your intention.
I would appreciate if you could explain the good points of it.

On the receiver side, we need to switch to ft_transaction mode. If the 
qemu_savevm_state_complete() didn't send QEMU_VM_EOF, qemu_loadvm_state() won't 
get out of the loop, and therefore it can switch to ft_transaction mode.

Please let me know if I were misunderstanding.

>
> 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);
>
>
>
>

Patch

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);