From patchwork Tue May 25 08:36:52 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [RFC,11/23] Introduce qemu_savevm_state_all(). Date: Mon, 24 May 2010 22:36:52 -0000 From: Yoshiaki Tamura X-Patchwork-Id: 53516 Message-Id: <1274776624-16435-13-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> To: kvm@vger.kernel.org, qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, mtosatti@redhat.com, avi@redhat.com, Yoshiaki Tamura , ohmura.kei@lab.ntt.co.jp Introduce qemu_savevm_state_all() to send the memory and device info together, while avoiding cancelling memory state tracking. Signed-off-by: Yoshiaki Tamura --- savevm.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sysemu.h | 1 + 2 files changed, 61 insertions(+), 0 deletions(-) diff --git a/savevm.c b/savevm.c index 81cb711..25ccbb8 100644 --- a/savevm.c +++ b/savevm.c @@ -1468,6 +1468,66 @@ int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f) return 0; } +int qemu_savevm_state_all(Monitor *mon, QEMUFile *f) +{ + SaveStateEntry *se; + + QTAILQ_FOREACH(se, &savevm_handlers, entry) { + int len; + + if (se->save_live_state == NULL) + continue; + + /* Section type */ + qemu_put_byte(f, QEMU_VM_SECTION_START); + qemu_put_be32(f, se->section_id); + + /* ID string */ + len = strlen(se->idstr); + qemu_put_byte(f, len); + qemu_put_buffer(f, (uint8_t *)se->idstr, len); + + qemu_put_be32(f, se->instance_id); + qemu_put_be32(f, se->version_id); + if (ft_mode == FT_INIT) { + /* This is workaround. */ + se->save_live_state(mon, f, QEMU_VM_SECTION_START, se->opaque); + } else { + se->save_live_state(mon, f, QEMU_VM_SECTION_PART, se->opaque); + } + } + + ft_mode = FT_TRANSACTION; + QTAILQ_FOREACH(se, &savevm_handlers, entry) { + int len; + + if (se->save_state == NULL && se->vmsd == NULL) + continue; + + /* Section type */ + qemu_put_byte(f, QEMU_VM_SECTION_FULL); + qemu_put_be32(f, se->section_id); + + /* ID string */ + len = strlen(se->idstr); + qemu_put_byte(f, len); + qemu_put_buffer(f, (uint8_t *)se->idstr, len); + + qemu_put_be32(f, se->instance_id); + qemu_put_be32(f, se->version_id); + + vmstate_save(f, se); + } + + qemu_put_byte(f, QEMU_VM_EOF); + + if (qemu_file_has_error(f)) + return -EIO; + + return 0; +} + + void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f) { SaveStateEntry *se; diff --git a/sysemu.h b/sysemu.h index 6c1441f..df314bb 100644 --- a/sysemu.h +++ b/sysemu.h @@ -67,6 +67,7 @@ int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable, int shared); int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f); int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f); +int qemu_savevm_state_all(Monitor *mon, QEMUFile *f); void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f); int qemu_loadvm_state(QEMUFile *f, int skip_header);