diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e827b2a810f7ba0619591e59a3ddfccca4055862..34aae82f1597c32ee10ff91a0ff4bc0bb5c0ddca 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18453,8 +18453,7 @@ 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 */ - if (virBitmapShrink(vcpus, def->maxvcpus) < 0) - goto cleanup; + virBitmapShrink(vcpus, def->maxvcpus); if (virBitmapIsAllClear(vcpus)) { ret = 0; diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c index d1e5a9d1eacfd298a370dbd9bf8a02d037ee3a90..82b1f76427b6d2a62288fbb601af8e332f0b4a4b 100644 --- a/src/util/virbitmap.c +++ b/src/util/virbitmap.c @@ -1292,15 +1292,16 @@ virBitmapSubtract(virBitmapPtr a, * Reduces the bitmap to size @b. Nothing will change if the size is already * smaller than or equal to @b. */ -int +void virBitmapShrink(virBitmapPtr map, size_t b) { + size_t toremove; size_t nl = 0; size_t nb = 0; if (!map) - return 0; + return; if (map->nbits >= b) map->nbits = b; @@ -1309,14 +1310,13 @@ virBitmapShrink(virBitmapPtr map, nb = map->nbits % VIR_BITMAP_BITS_PER_UNIT; map->map[nl] &= ((1UL << nb) - 1); - nl++; - if (nl == map->map_len) - return 0; + toremove = map->map_alloc - (nl + 1); - if (VIR_REALLOC_N(map->map, nl) < 0) - return -1; + if (toremove == 0) + return; - map->map_len = nl; - map->map_alloc = nl; - return 0; + VIR_SHRINK_N(map->map, map->map_alloc, toremove); + + /* length needs to be fixed as well */ + map->map_len = map->map_alloc; } diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h index 5a3362a19f9f8acb599a727c015c509e1c6c973d..2464814055de9d74edc7b834a7817d5ae5d3901a 100644 --- a/src/util/virbitmap.h +++ b/src/util/virbitmap.h @@ -153,6 +153,6 @@ void virBitmapIntersect(virBitmapPtr a, virBitmapPtr b) void virBitmapSubtract(virBitmapPtr a, virBitmapPtr b) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); -int virBitmapShrink(virBitmapPtr map, size_t b); +void virBitmapShrink(virBitmapPtr map, size_t b); #endif diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c index 6860e86e649d493b17e1f117b1469b2f2746d9c8..9639e004681aae1729e206e38e2a718cae58a857 100644 --- a/src/util/virresctrl.c +++ b/src/util/virresctrl.c @@ -952,8 +952,7 @@ virResctrlAllocParseProcessCache(virResctrlInfoPtr resctrl, goto cleanup; } - if (virBitmapShrink(mask, resctrl->levels[level]->types[type]->bits) < 0) - goto cleanup; + virBitmapShrink(mask, resctrl->levels[level]->types[type]->bits); if (virResctrlAllocUpdateMask(alloc, level, type, cache_id, mask) < 0) goto cleanup; diff --git a/tests/virbitmaptest.c b/tests/virbitmaptest.c index fffecdf1f6edbdfd6237e459e095ce185e6e82cf..2fbafc0a76321c447b7a3f3f79004b8b91dfb314 100644 --- a/tests/virbitmaptest.c +++ b/tests/virbitmaptest.c @@ -656,12 +656,10 @@ test12(const void *opaque ATTRIBUTE_UNUSED) TEST_MAP(1024, "34,1023"); - if (virBitmapShrink(map, 35) < 0) - goto cleanup; + virBitmapShrink(map, 35); TEST_MAP(35, "34"); - if (virBitmapShrink(map, 34) < 0) - goto cleanup; + virBitmapShrink(map, 34); TEST_MAP(34, ""); ret = 0;