]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
snapshot: ABI stability must include memory sizing
authorEric Blake <eblake@redhat.com>
Tue, 13 Sep 2011 20:21:10 +0000 (14:21 -0600)
committerEric Blake <eblake@redhat.com>
Wed, 14 Sep 2011 15:56:30 +0000 (09:56 -0600)
Commit 973fcd8f introduced the ability for qemu to reject snapshot
reversion on an ABI incompatibility; but the very example that was
first proposed on-list[1] as a demonstration of an ABI incompatibility,
namely that of changing the max memory allocation, was not being
checked for, resulting in a cryptic failure when running with larger
max mem than what the snapshot was created with:
error: operation failed: Error -22 while loading VM state

This commit merely protects the three variables within mem that are
referenced by qemu_command.c, rather than all 7 (the other 4 variables
affect cgroup handling, but as far as I can tell, have no visible effect
to the qemu guest).  This also affects migration and save file handling,
which are other places where we perform ABI compatibility checks.

[1] https://www.redhat.com/archives/libvir-list/2010-December/msg00331.html

* src/conf/domain_conf.c (virDomainDefCheckABIStability): Add
memory sizing checks.

src/conf/domain_conf.c

index c4fbdd5535517be524b363fafa1e4b82dea98cc6..ea6b581581bf2749f66541bd3972f180f00a5c6b 100644 (file)
@@ -8229,6 +8229,26 @@ bool virDomainDefCheckABIStability(virDomainDefPtr src,
         goto cleanup;
     }
 
+    if (src->mem.max_balloon != dst->mem.max_balloon) {
+        virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                             _("Target domain max memory %ld does not match source %ld"),
+                             dst->mem.max_balloon, src->mem.max_balloon);
+        goto cleanup;
+    }
+    if (src->mem.cur_balloon != dst->mem.cur_balloon) {
+        virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                             _("Target domain current memory %ld does not match source %ld"),
+                             dst->mem.cur_balloon, src->mem.cur_balloon);
+        goto cleanup;
+    }
+    if (src->mem.hugepage_backed != dst->mem.hugepage_backed) {
+        virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                             _("Target domain huge page backing %ld does not match source %ld"),
+                             dst->mem.hugepage_backed,
+                             src->mem.hugepage_backed);
+        goto cleanup;
+    }
+
     if (src->vcpus != dst->vcpus) {
         virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                              _("Target domain vpu count %d does not match source %d"),