Message ID | 1271829445-5328-11-git-send-email-tamura.yoshiaki@lab.ntt.co.jp |
---|---|
State | New |
Headers | show |
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); >
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); > > > >
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);
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(-)