]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Filter cur_balloon ABI check for certain transactions
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Thu, 9 Jun 2016 14:32:32 +0000 (17:32 +0300)
committerJohn Ferlan <jferlan@redhat.com>
Fri, 2 Sep 2016 20:54:42 +0000 (16:54 -0400)
Since the domain lock is not held during preparation of an external XML
config, it is possible that the value can change resulting in unexpected
failures during ABI consistency checking for some save and migrate
operations.

This patch adds a new flag to skip the checking of the cur_balloon value
and then sets the destination value to the source value to ensure
subsequent checks without the skip flag will succeed.

This way it is protected from forges and is keeped up to date too.

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_domain.c
src/qemu/qemu_driver.c

index 61f6dbbbaff2aa7e9f30d489f8961168e202ff19..c8c4f61cda69dbae2338324a6d5ae95a04050784 100644 (file)
@@ -18775,8 +18775,9 @@ virDomainDefVcpuCheckAbiStability(virDomainDefPtr src,
  * validation of custom XML config passed in during migration
  */
 bool
-virDomainDefCheckABIStability(virDomainDefPtr src,
-                              virDomainDefPtr dst)
+virDomainDefCheckABIStabilityFlags(virDomainDefPtr src,
+                                   virDomainDefPtr dst,
+                                   unsigned int flags)
 {
     size_t i;
     virErrorPtr err;
@@ -18820,7 +18821,8 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
                        virDomainDefGetMemoryInitial(src));
         goto error;
     }
-    if (src->mem.cur_balloon != dst->mem.cur_balloon) {
+    if (!(flags & VIR_DOMAIN_DEF_ABI_CHECK_SKIP_VOLATILE) &&
+        src->mem.cur_balloon != dst->mem.cur_balloon) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("Target domain current memory %lld does not match source %lld"),
                        dst->mem.cur_balloon, src->mem.cur_balloon);
@@ -19264,6 +19266,14 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
 }
 
 
+bool
+virDomainDefCheckABIStability(virDomainDefPtr src,
+                              virDomainDefPtr dst)
+{
+    return virDomainDefCheckABIStabilityFlags(src, dst, 0);
+}
+
+
 static int
 virDomainDefAddDiskControllersForType(virDomainDefPtr def,
                                       int controllerType,
index b88912508b05cb488a3a1f3f37b8d92cc52f625a..0fe4154553bd2e9518f9916166dbbe61073b2bf8 100644 (file)
@@ -2644,6 +2644,15 @@ typedef enum {
     VIR_DOMAIN_DEF_FORMAT_CLOCK_ADJUST    = 1 << 9,
 } virDomainDefFormatFlags;
 
+/* Use these flags to skip specific domain ABI consistency checks done
+ * in virDomainDefCheckABIStabilityFlags.
+ */
+typedef enum {
+    /* Set when domain lock must be released and there exists the possibility
+     * that some external action could alter the value, such as cur_balloon. */
+    VIR_DOMAIN_DEF_ABI_CHECK_SKIP_VOLATILE = 1 << 0,
+} virDomainDefABICheckFlags;
+
 virDomainDeviceDefPtr virDomainDeviceDefParse(const char *xmlStr,
                                               const virDomainDef *def,
                                               virCapsPtr caps,
@@ -2679,6 +2688,10 @@ virDomainObjPtr virDomainObjParseFile(const char *filename,
 bool virDomainDefCheckABIStability(virDomainDefPtr src,
                                    virDomainDefPtr dst);
 
+bool virDomainDefCheckABIStabilityFlags(virDomainDefPtr src,
+                                        virDomainDefPtr dst,
+                                        unsigned int flags);
+
 int virDomainDefAddImplicitDevices(virDomainDefPtr def);
 
 virDomainIOThreadIDDefPtr virDomainIOThreadIDFind(const virDomainDef *def,
index f9d02ad4a736619ac26966e64f79120cdc17c0ea..d62c74c39e8ce9b3d449bbe75825cb86d44c3a22 100644 (file)
@@ -219,6 +219,7 @@ virDomainDefAddController;
 virDomainDefAddImplicitDevices;
 virDomainDefAddUSBController;
 virDomainDefCheckABIStability;
+virDomainDefCheckABIStabilityFlags;
 virDomainDefCompatibleDevice;
 virDomainDefCopy;
 virDomainDefFindDevice;
index c1fb77129676f89c16056befe8e836a46c508e4a..7fce2fcb9f7928f5eb1254d8218145f3494f63c5 100644 (file)
@@ -4989,14 +4989,25 @@ qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
 {
     virDomainDefPtr migratableDefSrc = NULL;
     virDomainDefPtr migratableDefDst = NULL;
-    const int flags = VIR_DOMAIN_XML_SECURE | VIR_DOMAIN_XML_UPDATE_CPU | VIR_DOMAIN_XML_MIGRATABLE;
+    const unsigned int flags = VIR_DOMAIN_XML_SECURE |
+                               VIR_DOMAIN_XML_UPDATE_CPU |
+                               VIR_DOMAIN_XML_MIGRATABLE;
+    const unsigned int check_flags = VIR_DOMAIN_DEF_ABI_CHECK_SKIP_VOLATILE;
     bool ret = false;
 
     if (!(migratableDefSrc = qemuDomainDefCopy(driver, src, flags)) ||
         !(migratableDefDst = qemuDomainDefCopy(driver, dst, flags)))
         goto cleanup;
 
-    ret = virDomainDefCheckABIStability(migratableDefSrc, migratableDefDst);
+    if (!virDomainDefCheckABIStabilityFlags(migratableDefSrc,
+                                            migratableDefDst,
+                                            check_flags))
+        goto cleanup;
+
+    /* Force update any skipped values from the volatile flag */
+    dst->mem.cur_balloon = src->mem.cur_balloon;
+
+    ret = true;
 
  cleanup:
     virDomainDefFree(migratableDefSrc);
index 2efaa2ace9a04ebe2127c541a1ca04155ca4da7c..1d94c5f6b8a98ff7e8f040af9e13b5505437cfa4 100644 (file)
@@ -15279,7 +15279,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
             /* Transitions 5, 6, 8, 9 */
             /* Check for ABI compatibility. We need to do this check against
              * the migratable XML or it will always fail otherwise */
-            if (config && !qemuDomainDefCheckABIStability(driver, vm->def, config)) {
+            if (config &&
+                !qemuDomainDefCheckABIStability(driver, vm->def, config)) {
                 virErrorPtr err = virGetLastError();
 
                 if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) {