From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: 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 Message-ID: <4BD0A4CD.2060506@linux.vnet.ibm.com> References: <1271829445-5328-1-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> <1271829445-5328-11-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, qemu-devel@nongnu.org, avi@redhat.com, Anthony Liguori , mtosatti@redhat.com, ohmura.kei@lab.ntt.co.jp, yoshikawa.takuya@oss.ntt.co.jp To: Yoshiaki Tamura Return-path: Received: from e3.ny.us.ibm.com ([32.97.182.143]:34717 "EHLO e3.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757229Ab0DVTel (ORCPT ); Thu, 22 Apr 2010 15:34:41 -0400 Received: from d01relay06.pok.ibm.com (d01relay06.pok.ibm.com [9.56.227.116]) by e3.ny.us.ibm.com (8.14.3/8.13.1) with ESMTP id o3MJMNAu024681 for ; Thu, 22 Apr 2010 15:22:23 -0400 Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay06.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o3MJYeNF1884386 for ; Thu, 22 Apr 2010 15:34:40 -0400 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o3MJYdMx021241 for ; Thu, 22 Apr 2010 15:34:40 -0400 In-Reply-To: <1271829445-5328-11-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> Sender: kvm-owner@vger.kernel.org List-ID: On 04/21/2010 12:57 AM, Yoshiaki Tamura wrote: > Signed-off-by: Yoshiaki Tamura > 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); >