On Fri, Feb 02, 2018 at 02:15:05PM +0100, Peter Krempa wrote:
On Fri, Feb 02, 2018 at 14:04:31 +0100, Martin Kletzander wrote:
Some of the other functions depend on the fact that unused bits and longs are
always zero and it's less error-prone to clear it than fix the other functions.
It's enough to zero out one piece of the map since we're calling realloc() to
get rid of the rest (and updating map_len).

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1540817

Signed-off-by: Martin Kletzander <mklet...@redhat.com>
---
 src/conf/domain_conf.c |  4 +++-
 src/util/virbitmap.c   | 30 ++++++++++++++++++++++--------
 src/util/virbitmap.h   |  2 +-
 src/util/virresctrl.c  |  3 ++-
 tests/virbitmaptest.c  |  8 ++++++++
 5 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 01d168eb875b..e827b2a810f7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -18453,7 +18453,9 @@ virDomainCachetuneDefParse(virDomainDefPtr def,

     /* We need to limit the bitmap to number of vCPUs.  If there's nothing 
left,
      * then we can just clean up and return 0 immediately */
-    virBitmapShrink(vcpus, def->maxvcpus);
+    if (virBitmapShrink(vcpus, def->maxvcpus) < 0)
+        goto cleanup;
+
     if (virBitmapIsAllClear(vcpus)) {
         ret = 0;
         goto cleanup;
diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c
index b2c5c7a6a5ac..33cae2f30569 100644
--- a/src/util/virbitmap.c
+++ b/src/util/virbitmap.c
@@ -1201,21 +1201,35 @@ virBitmapSubtract(virBitmapPtr a,
 /**
  * virBitmapShrink:
  * @map: Pointer to bitmap
- * @b: last bit position to be excluded from bitmap
+ * @b: Size to reduce the bitmap to
  *
- * Resizes the bitmap so that no more than @b bits will fit into it.  Nothing
- * will change if the size is already smaller than @b.
- *
- * NB: Does not adjust the map->map_len so that a subsequent virBitmapExpand
- * doesn't necessarily need to reallocate.
+ * Reduces the bitmap to size @b.  Nothing will change if the size is already
+ * smaller than or equal to @b.
  */
-void
+int
 virBitmapShrink(virBitmapPtr map,
                 size_t b)
 {
+    size_t nl = 0;
+    size_t nb = 0;
+
     if (!map)
-        return;
+        return 0;

     if (map->max_bit >= b)
         map->max_bit = b;
+
+    nl = map->max_bit / VIR_BITMAP_BITS_PER_UNIT;
+    nb = map->max_bit % VIR_BITMAP_BITS_PER_UNIT;
+    map->map[nl] &= ((1UL << nb) - 1);
+
+    nl++;
+    if (nl == map->map_len)
+        return 0;
+
+    if (VIR_REALLOC_N(map->map, nl) < 0)

With VIR_SHRINK_N you can avoid the return value ;)


or with ignore_value, which is what VIR_SHRINK_N does over virReallocN anyway :D

Patches welcome

ACK

Thanks

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Attachment: signature.asc
Description: Digital signature

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to