/* 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;
* 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;
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;
}
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
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;
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;