43fe83
From ed1ef3fb4a2a5f3b710e2f4e215e8e5b45db6558 Mon Sep 17 00:00:00 2001
43fe83
Message-Id: <ed1ef3fb4a2a5f3b710e2f4e215e8e5b45db6558.1383922565.git.jdenemar@redhat.com>
43fe83
From: Peter Krempa <pkrempa@redhat.com>
43fe83
Date: Fri, 8 Nov 2013 12:33:14 +0100
43fe83
Subject: [PATCH] conf: Do better job when comparing features ABI compatibility
43fe83
43fe83
https://bugzilla.redhat.com/show_bug.cgi?id=1008989
43fe83
43fe83
The ABI compatibility check for domain features didn't check the
43fe83
expanded HyperV and APIC EOI values, thus possibly allowing change in
43fe83
guest ABI.
43fe83
43fe83
Add the check and use typecasted switch statement to warn developers
43fe83
when adding a new HyperV feature.
43fe83
43fe83
(cherry picked from commit 5702c014b2b1feba7329e8b3dcc3a6be7cb4a88e)
43fe83
43fe83
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
43fe83
---
43fe83
 src/conf/domain_conf.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++----
43fe83
 1 file changed, 67 insertions(+), 5 deletions(-)
43fe83
43fe83
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
43fe83
index dea8130..a1d7385 100644
43fe83
--- a/src/conf/domain_conf.c
43fe83
+++ b/src/conf/domain_conf.c
43fe83
@@ -13315,6 +13315,72 @@ virDomainRedirFilterDefCheckABIStability(virDomainRedirFilterDefPtr src,
43fe83
     return true;
43fe83
 }
43fe83
 
43fe83
+
43fe83
+static bool
43fe83
+virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
43fe83
+                                      virDomainDefPtr dst)
43fe83
+{
43fe83
+    size_t i;
43fe83
+
43fe83
+    /* basic check */
43fe83
+    if (src->features != dst->features) {
43fe83
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
43fe83
+                       _("Target domain features %d does not match source %d"),
43fe83
+                       dst->features, src->features);
43fe83
+        return false;
43fe83
+    }
43fe83
+
43fe83
+    /* APIC EOI */
43fe83
+    if (src->apic_eoi != dst->apic_eoi) {
43fe83
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
43fe83
+                       _("State of APIC EOI differs: "
43fe83
+                         "source: '%s', destination: '%s'"),
43fe83
+                       virDomainFeatureStateTypeToString(src->apic_eoi),
43fe83
+                       virDomainFeatureStateTypeToString(dst->apic_eoi));
43fe83
+        return false;
43fe83
+    }
43fe83
+
43fe83
+    /* hyperv */
43fe83
+    if (src->features & (1 << VIR_DOMAIN_FEATURE_HYPERV)) {
43fe83
+        for (i = 0; i < VIR_DOMAIN_HYPERV_LAST; i++) {
43fe83
+            switch ((enum virDomainHyperv) i) {
43fe83
+            case VIR_DOMAIN_HYPERV_RELAXED:
43fe83
+            case VIR_DOMAIN_HYPERV_VAPIC:
43fe83
+                if (src->hyperv_features[i] != dst->hyperv_features[i]) {
43fe83
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
43fe83
+                                   _("State of HyperV enlightenment "
43fe83
+                                     "feature '%s' differs: "
43fe83
+                                     "source: '%s', destination: '%s'"),
43fe83
+                                   virDomainHypervTypeToString(i),
43fe83
+                                   virDomainFeatureStateTypeToString(src->hyperv_features[i]),
43fe83
+                                   virDomainFeatureStateTypeToString(dst->hyperv_features[i]));
43fe83
+                    return false;
43fe83
+                }
43fe83
+
43fe83
+                break;
43fe83
+
43fe83
+            case VIR_DOMAIN_HYPERV_SPINLOCKS:
43fe83
+                /* spinlock count matters! */
43fe83
+                if (src->hyperv_spinlocks != dst->hyperv_spinlocks) {
43fe83
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
43fe83
+                                   _("HyperV spinlock retry count differs: "
43fe83
+                                     "source: '%u', destination: '%u'"),
43fe83
+                                   src->hyperv_spinlocks,
43fe83
+                                   dst->hyperv_spinlocks);
43fe83
+                    return false;
43fe83
+                }
43fe83
+                break;
43fe83
+
43fe83
+            case VIR_DOMAIN_HYPERV_LAST:
43fe83
+                break;
43fe83
+            }
43fe83
+        }
43fe83
+    }
43fe83
+
43fe83
+    return true;
43fe83
+}
43fe83
+
43fe83
+
43fe83
 /* This compares two configurations and looks for any differences
43fe83
  * which will affect the guest ABI. This is primarily to allow
43fe83
  * validation of custom XML config passed in during migration
43fe83
@@ -13416,12 +13482,8 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
43fe83
         return false;
43fe83
     }
43fe83
 
43fe83
-    if (src->features != dst->features) {
43fe83
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
43fe83
-                       _("Target domain features %d does not match source %d"),
43fe83
-                       dst->features, src->features);
43fe83
+    if (!virDomainDefFeaturesCheckABIStability(src, dst))
43fe83
         return false;
43fe83
-    }
43fe83
 
43fe83
     if (src->clock.ntimers != dst->clock.ntimers) {
43fe83
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
43fe83
-- 
43fe83
1.8.4.2
43fe83