From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yoshiaki Tamura 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: Fri, 23 Apr 2010 13:25:31 +0900 Message-ID: <4BD1213B.4090902@lab.ntt.co.jp> 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> <4BD0A4CD.2060506@linux.vnet.ibm.com> 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: Anthony Liguori Return-path: Received: from tama50.ecl.ntt.co.jp ([129.60.39.147]:62585 "EHLO tama50.ecl.ntt.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753946Ab0DWEZw (ORCPT ); Fri, 23 Apr 2010 00:25:52 -0400 In-Reply-To: <4BD0A4CD.2060506@linux.vnet.ibm.com> Sender: kvm-owner@vger.kernel.org List-ID: Anthony Liguori wrote: > 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. 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); > > > >