From 69f3dcd86ea4a3c9c0cf93843100e1b0308dd1e3 Mon Sep 17 00:00:00 2001 From: Alex Williamson <alex.williamson@redhat.com> Date: Thu, 7 Apr 2011 16:38:38 -0300 Subject: [PATCH 2/3] savevm: Create an optional savevm registration RH-Author: Alex Williamson <alex.williamson@redhat.com> Message-id: <20110407163837.5885.74360.stgit@localhost6.localdomain6> Patchwork-id: 21642 O-Subject: [RHEL5.7 kvm PATCH 1/2] savevm: Create an optional savevm registration Bugzilla: 666225 RH-Acked-by: Juan Quintela <quintela@redhat.com> RH-Acked-by: Avi Kivity <avi@redhat.com> RH-Acked-by: Michael S. Tsirkin <mst@redhat.com> RH-Acked-by: Jes Sorensen <Jes.Sorensen@redhat.com> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=666225 Brew build: https://brewweb.devel.redhat.com/taskinfo?taskID=3240237 Upstream commit: N/A We don't have subsections on rhel5, but we can create something close pretty easily. Add a new register_optional_savevm() which takes an extra parameter to a needed() function pointer. All current savevms won't set this and won't see any change. The intended purpose of this is for drivers that only sometimes need to include an extra migration section. They can then maintain migration compatibility by not bumping their version_id, and only include the optional section when it's required. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> --- qemu/hw/hw.h | 9 +++++++++ qemu/savevm.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 0 deletions(-) Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- qemu/hw/hw.h | 9 +++++++++ qemu/savevm.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 0 deletions(-) diff --git a/qemu/hw/hw.h b/qemu/hw/hw.h index 9ffa432..2252f15 100644 --- a/qemu/hw/hw.h +++ b/qemu/hw/hw.h @@ -231,6 +231,7 @@ int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence); typedef void SaveStateHandler(QEMUFile *f, void *opaque, int version_id); typedef int SaveLiveStateHandler(QEMUFile *f, int stage, void *opaque); typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id); +typedef int SaveStateNeeded(void *opaque); /* Used to disable a savevm section */ #define SAVEVM_DISABLED -1 @@ -244,6 +245,14 @@ int register_savevm(const char *idstr, LoadStateHandler *load_state, void *opaque); +int register_optional_savevm(const char *idstr, + int instance_id, + int version_id, + SaveStateHandler *save_state, + LoadStateHandler *load_state, + SaveStateNeeded *needed, + void *opaque); + int register_savevm_live(const char *idstr, int instance_id, int version_id, diff --git a/qemu/savevm.c b/qemu/savevm.c index 309dc86..14e4c06 100644 --- a/qemu/savevm.c +++ b/qemu/savevm.c @@ -634,6 +634,7 @@ typedef struct SaveStateEntry { SaveLiveStateHandler *save_live_state; SaveStateHandler *save_state; LoadStateHandler *load_state; + SaveStateNeeded *needed; void *opaque; struct SaveStateEntry *next; } SaveStateEntry; @@ -665,6 +666,7 @@ int register_savevm_live(const char *idstr, se->save_live_state = save_live_state; se->save_state = save_state; se->load_state = load_state; + se->needed = NULL; se->opaque = opaque; se->next = NULL; @@ -692,6 +694,34 @@ int register_savevm(const char *idstr, NULL, save_state, load_state, opaque); } +int register_optional_savevm(const char *idstr, + int instance_id, + int version_id, + SaveStateHandler *save_state, + LoadStateHandler *load_state, + SaveStateNeeded *needed, + void *opaque) +{ + SaveStateEntry **pse; + int ret; + + ret = register_savevm(idstr, instance_id, version_id, + save_state, load_state, opaque); + if (ret) { + return ret; + } + + pse = &first_se; + while (*pse != NULL) { + if (strcmp((*pse)->idstr, idstr) == 0 && (*pse)->opaque == opaque) { + (*pse)->needed = needed; + } + pse = &(*pse)->next; + } + + return 0; +} + void unregister_savevm(const char *idstr, void *opaque) { SaveStateEntry **pse; @@ -801,6 +831,10 @@ int qemu_savevm_state_complete(QEMUFile *f) if (se->save_state == NULL) continue; + if (se->needed && !se->needed(se->opaque)) { + continue; + } + /* Section type */ qemu_put_byte(f, QEMU_VM_SECTION_FULL); qemu_put_be32(f, se->section_id); -- 1.7.3.2