Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 340e01248478ba8b78a6d4d1809b1eff > files > 762

kvm-83-270.el5_11.src.rpm

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