[libvirt] [PATCHv2] util: bitmap: Tolerate NULL bitmaps in virBitmapEqual

Peter Krempa pkrempa at redhat.com
Mon Jan 26 09:39:34 UTC 2015


After virBitmapEqual is able to compare NULL bitmaps few bits of code
can be cleaned up.
---
Version 2 cleans up code paths that would do a duplicate check now.

 src/conf/domain_conf.c   | 40 ++++++++++------------------------------
 src/conf/numatune_conf.c |  3 ---
 src/util/virbitmap.c     |  6 ++++++
 src/util/virbitmap.h     |  3 +--
 4 files changed, 17 insertions(+), 35 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 9ff3819..d364d3c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -15625,18 +15625,10 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
             goto error;
         }

-        if (src_huge->nodemask && dst_huge->nodemask) {
-            if (!virBitmapEqual(src_huge->nodemask, dst_huge->nodemask)) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("Target huge page nodemask does not match source"));
-                goto error;
-            }
-        } else {
-            if (src_huge->nodemask || dst_huge->nodemask) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("Target huge page nodemask does not match source"));
-                goto error;
-            }
+        if (!virBitmapEqual(src_huge->nodemask, dst_huge->nodemask)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("Target huge page nodemask does not match source"));
+            goto error;
         }
     }

@@ -19126,20 +19118,12 @@ virDomainIsAllVcpupinInherited(virDomainDefPtr def)
 {
     size_t i;

-    if (!def->cpumask) {
-        if (def->cputune.nvcpupin)
+    for (i = 0; i < def->cputune.nvcpupin; i++) {
+        if (!virBitmapEqual(def->cputune.vcpupin[i]->cpumask, def->cpumask))
             return false;
-        else
-            return true;
-    } else {
-        for (i = 0; i < def->cputune.nvcpupin; i++) {
-            if (!virBitmapEqual(def->cputune.vcpupin[i]->cpumask,
-                                def->cpumask))
-                return false;
-        }
+    }

-        return true;
-   }
+    return true;
 }


@@ -19477,9 +19461,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
     for (i = 0; i < def->cputune.nvcpupin; i++) {
         char *cpumask;
         /* Ignore the vcpupin which inherit from "cpuset of "<vcpu>." */
-        if (def->cpumask &&
-            virBitmapEqual(def->cpumask,
-                           def->cputune.vcpupin[i]->cpumask))
+        if (virBitmapEqual(def->cpumask, def->cputune.vcpupin[i]->cpumask))
             continue;

         virBufferAsprintf(buf, "<vcpupin vcpu='%u' ",
@@ -19506,9 +19488,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
     for (i = 0; i < def->cputune.niothreadspin; i++) {
         char *cpumask;
         /* Ignore the iothreadpin which inherit from "cpuset of "<vcpu>." */
-        if (def->cpumask &&
-            virBitmapEqual(def->cpumask,
-                           def->cputune.iothreadspin[i]->cpumask))
+        if (virBitmapEqual(def->cpumask, def->cputune.iothreadspin[i]->cpumask))
             continue;

         virBufferAsprintf(buf, "<iothreadpin iothread='%u' ",
diff --git a/src/conf/numatune_conf.c b/src/conf/numatune_conf.c
index ad928e0..323cd59 100644
--- a/src/conf/numatune_conf.c
+++ b/src/conf/numatune_conf.c
@@ -542,9 +542,6 @@ virDomainNumatuneNodesEqual(virDomainNumatunePtr n1,
         if (!nd1->nodeset && !nd2->nodeset)
             continue;

-        if (!nd1->nodeset || !nd2->nodeset)
-            return false;
-
         if (nd1->mode != nd2->mode)
             return false;

diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c
index 05c50e4..d5b0035 100644
--- a/src/util/virbitmap.c
+++ b/src/util/virbitmap.c
@@ -504,6 +504,12 @@ bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2)
     virBitmapPtr tmp;
     size_t i;

+    if (!b1 && !b2)
+        return true;
+
+    if (!b1 || !b2)
+        return false;
+
     if (b1->max_bit > b2->max_bit) {
         tmp = b1;
         b1 = b2;
diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h
index 565264c..a347f0a 100644
--- a/src/util/virbitmap.h
+++ b/src/util/virbitmap.h
@@ -84,8 +84,7 @@ virBitmapPtr virBitmapNewData(void *data, int len) ATTRIBUTE_NONNULL(1);
 int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

-bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2);

 size_t virBitmapSize(virBitmapPtr bitmap)
     ATTRIBUTE_NONNULL(1);
-- 
2.2.1




More information about the libvir-list mailing list