Blame SOURCES/libvirt-conf-Factor-out-vcpus-overlapping-from-virDomainCachetuneDefParse.patch

99cbc7
From c00106d41b74d86ee7357ed62399ea7ffb9cd393 Mon Sep 17 00:00:00 2001
99cbc7
Message-Id: <c00106d41b74d86ee7357ed62399ea7ffb9cd393@dist-git>
99cbc7
From: Bing Niu <bing.niu@intel.com>
99cbc7
Date: Mon, 15 Apr 2019 17:32:56 +0200
99cbc7
Subject: [PATCH] conf: Factor out vcpus overlapping from
99cbc7
 virDomainCachetuneDefParse
99cbc7
MIME-Version: 1.0
99cbc7
Content-Type: text/plain; charset=UTF-8
99cbc7
Content-Transfer-Encoding: 8bit
99cbc7
99cbc7
Factor out vcpus overlapping detecting part from
99cbc7
virDomainCachetuneDefParse and introduce virDomainResctrlVcpuMatch.
99cbc7
Instead of allocating virResctrlAllocPtr by default, allocating
99cbc7
virResctrlAllocPtr after confirm vcpus not overlap with existing ones.
99cbc7
And virDomainResctrlVcpuMatch can be reused by other resource control
99cbc7
technologies. virDomainResctrlVcpuMatch can clarify old vcpus overlap
99cbc7
error whether an overlap or a redefinition.
99cbc7
99cbc7
Signed-off-by: Bing Niu <bing.niu@intel.com>
99cbc7
Reviewed-by: John Ferlan <jferlan@redhat.com>
99cbc7
(cherry picked from commit e5cc7c0a0258530000aa9fd930c649b525b6f801)
99cbc7
99cbc7
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1468650
99cbc7
99cbc7
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
99cbc7
Message-Id: <ee62ff896868ef147f9d7e6c67a5c151e0c4695b.1555342313.git.phrdina@redhat.com>
99cbc7
Reviewed-by: Ján Tomko <jtomko@redhat.com>
99cbc7
---
99cbc7
 src/conf/domain_conf.c | 51 ++++++++++++++++++++++++++++++++----------
99cbc7
 1 file changed, 39 insertions(+), 12 deletions(-)
99cbc7
99cbc7
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
99cbc7
index 07d21f8026..fb5adbcd10 100644
99cbc7
--- a/src/conf/domain_conf.c
99cbc7
+++ b/src/conf/domain_conf.c
99cbc7
@@ -19077,6 +19077,31 @@ virDomainResctrlParseVcpus(virDomainDefPtr def,
99cbc7
 }
99cbc7
 
99cbc7
 
99cbc7
+static int
99cbc7
+virDomainResctrlVcpuMatch(virDomainDefPtr def,
99cbc7
+                          virBitmapPtr vcpus,
99cbc7
+                          virResctrlAllocPtr *alloc)
99cbc7
+{
99cbc7
+    ssize_t i = 0;
99cbc7
+
99cbc7
+    for (i = 0; i < def->nresctrls; i++) {
99cbc7
+        /* vcpus group has been created, directly use the existing one.
99cbc7
+         * Just updating memory allocation information of that group
99cbc7
+         */
99cbc7
+        if (virBitmapEqual(def->resctrls[i]->vcpus, vcpus)) {
99cbc7
+            *alloc = def->resctrls[i]->alloc;
99cbc7
+            break;
99cbc7
+        }
99cbc7
+        if (virBitmapOverlaps(def->resctrls[i]->vcpus, vcpus)) {
99cbc7
+            virReportError(VIR_ERR_XML_ERROR, "%s",
99cbc7
+                           _("Overlapping vcpus in resctrls"));
99cbc7
+            return -1;
99cbc7
+        }
99cbc7
+    }
99cbc7
+    return 0;
99cbc7
+}
99cbc7
+
99cbc7
+
99cbc7
 static int
99cbc7
 virDomainCachetuneDefParseCache(xmlXPathContextPtr ctxt,
99cbc7
                                 xmlNodePtr node,
99cbc7
@@ -19160,7 +19185,7 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
99cbc7
     xmlNodePtr oldnode = ctxt->node;
99cbc7
     xmlNodePtr *nodes = NULL;
99cbc7
     virBitmapPtr vcpus = NULL;
99cbc7
-    virResctrlAllocPtr alloc = virResctrlAllocNew();
99cbc7
+    virResctrlAllocPtr alloc = NULL;
99cbc7
     virDomainResctrlDefPtr tmp_resctrl = NULL;
99cbc7
     char *tmp = NULL;
99cbc7
     char *vcpus_str = NULL;
99cbc7
@@ -19171,9 +19196,6 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
99cbc7
 
99cbc7
     ctxt->node = node;
99cbc7
 
99cbc7
-    if (!alloc)
99cbc7
-        goto cleanup;
99cbc7
-
99cbc7
     if (VIR_ALLOC(tmp_resctrl) < 0)
99cbc7
         goto cleanup;
99cbc7
 
99cbc7
@@ -19191,6 +19213,19 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
99cbc7
         goto cleanup;
99cbc7
     }
99cbc7
 
99cbc7
+    if (virDomainResctrlVcpuMatch(def, vcpus, &alloc) < 0)
99cbc7
+        goto cleanup;
99cbc7
+
99cbc7
+    if (!alloc) {
99cbc7
+        alloc = virResctrlAllocNew();
99cbc7
+        if (!alloc)
99cbc7
+            goto cleanup;
99cbc7
+    } else {
99cbc7
+        virReportError(VIR_ERR_XML_ERROR, "%s",
99cbc7
+                       _("Identical vcpus in cachetunes found"));
99cbc7
+        goto cleanup;
99cbc7
+    }
99cbc7
+
99cbc7
     for (i = 0; i < n; i++) {
99cbc7
         if (virDomainCachetuneDefParseCache(ctxt, nodes[i], alloc) < 0)
99cbc7
             goto cleanup;
99cbc7
@@ -19201,14 +19236,6 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
99cbc7
         goto cleanup;
99cbc7
     }
99cbc7
 
99cbc7
-    for (i = 0; i < def->nresctrls; i++) {
99cbc7
-        if (virBitmapOverlaps(def->resctrls[i]->vcpus, vcpus)) {
99cbc7
-            virReportError(VIR_ERR_XML_ERROR, "%s",
99cbc7
-                           _("Overlapping vcpus in cachetunes"));
99cbc7
-            goto cleanup;
99cbc7
-        }
99cbc7
-    }
99cbc7
-
99cbc7
     /* We need to format it back because we need to be consistent in the naming
99cbc7
      * even when users specify some "sub-optimal" string there. */
99cbc7
     VIR_FREE(vcpus_str);
99cbc7
-- 
99cbc7
2.21.0
99cbc7