]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: numa: Check ABI stability of NUMA configuration
authorPeter Krempa <pkrempa@redhat.com>
Mon, 16 Feb 2015 19:34:37 +0000 (20:34 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 20 Feb 2015 18:23:38 +0000 (19:23 +0100)
Add helper to compare initial sizes of indivitual NUMA nodes and the map
of belonging vCPUs. Other configuration is not ABI.

src/conf/domain_conf.c
src/conf/numa_conf.c
src/conf/numa_conf.h
src/libvirt_private.syms

index ccf60213f4d49b2f921043718d07ba429b3a7179..c9fe9281241c10fa2bfe42c75d5b1ab9d9fd4cf3 100644 (file)
@@ -15970,6 +15970,9 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
         goto error;
     }
 
+    if (!virDomainNumaCheckABIStability(src->numa, dst->numa))
+        goto error;
+
     if (src->vcpus != dst->vcpus) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("Target domain vCPU count %d does not match source %d"),
index 52b9fe9be12b535b2bb7f7d7b93b5388fffcef93..9caa655aca61734f07d4a4996a9f0ce7f6b86e21 100644 (file)
@@ -814,6 +814,45 @@ virDomainNumaNew(void)
 }
 
 
+bool
+virDomainNumaCheckABIStability(virDomainNumaPtr src,
+                               virDomainNumaPtr tgt)
+{
+    size_t i;
+
+    if (virDomainNumaGetNodeCount(src) != virDomainNumaGetNodeCount(tgt)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("Target NUMA node count '%zu' doesn't match "
+                         "source '%zu'"),
+                       virDomainNumaGetNodeCount(tgt),
+                       virDomainNumaGetNodeCount(src));
+        return false;
+    }
+
+    for (i = 0; i < virDomainNumaGetNodeCount(src); i++) {
+        if (virDomainNumaGetNodeMemorySize(src, i) !=
+            virDomainNumaGetNodeMemorySize(tgt, i)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("Size of target NUMA node %zu (%llu) doesn't "
+                             "match source (%llu)"), i,
+                           virDomainNumaGetNodeMemorySize(tgt, i),
+                           virDomainNumaGetNodeMemorySize(src, i));
+            return false;
+        }
+
+        if (!virBitmapEqual(virDomainNumaGetNodeCpumask(src, i),
+                            virDomainNumaGetNodeCpumask(tgt, i))) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("Processor mask of target NUMA node %zu doesn't "
+                             "match source"), i);
+            return false;
+        }
+    }
+
+    return true;
+}
+
+
 size_t
 virDomainNumaGetNodeCount(virDomainNumaPtr numa)
 {
index 0a0a06e7b7cd64c40ded68c6d6b8aeba5963c4cb..dc2ce58212f5a1cd2cd9d3e2c8b3f22e336b7914 100644 (file)
@@ -129,6 +129,9 @@ void virDomainNumaSetNodeMemorySize(virDomainNumaPtr numa,
 bool virDomainNumaEquals(virDomainNumaPtr n1,
                          virDomainNumaPtr n2);
 
+bool virDomainNumaCheckABIStability(virDomainNumaPtr src,
+                                    virDomainNumaPtr tgt);
+
 bool virDomainNumatuneHasPlacementAuto(virDomainNumaPtr numatune);
 
 bool virDomainNumatuneHasPerNodeBinding(virDomainNumaPtr numatune);
index 3bc3f8768931dcad12992d8460821bab2c4dafae..c156b40c5309d4f83eee37f8ae53d82ae036b139 100644 (file)
@@ -627,6 +627,7 @@ virNodeDeviceObjUnlock;
 
 
 # conf/numa_conf.h
+virDomainNumaCheckABIStability;
 virDomainNumaEquals;
 virDomainNumaFree;
 virDomainNumaGetNodeCount;