提交 d6e582da 编写于 作者: M Martin Kletzander

util: Clear unused part of the map in virBitmapShrink

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=1540817Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
上级 67954344
...@@ -18453,7 +18453,9 @@ virDomainCachetuneDefParse(virDomainDefPtr def, ...@@ -18453,7 +18453,9 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
/* We need to limit the bitmap to number of vCPUs. If there's nothing left, /* 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 */ * 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)) { if (virBitmapIsAllClear(vcpus)) {
ret = 0; ret = 0;
goto cleanup; goto cleanup;
......
...@@ -1201,21 +1201,35 @@ virBitmapSubtract(virBitmapPtr a, ...@@ -1201,21 +1201,35 @@ virBitmapSubtract(virBitmapPtr a,
/** /**
* virBitmapShrink: * virBitmapShrink:
* @map: Pointer to bitmap * @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 * Reduces the bitmap to size @b. Nothing will change if the size is already
* will change if the size is already smaller than @b. * smaller than or equal to @b.
*
* NB: Does not adjust the map->map_len so that a subsequent virBitmapExpand
* doesn't necessarily need to reallocate.
*/ */
void int
virBitmapShrink(virBitmapPtr map, virBitmapShrink(virBitmapPtr map,
size_t b) size_t b)
{ {
size_t nl = 0;
size_t nb = 0;
if (!map) if (!map)
return; return 0;
if (map->max_bit >= b) if (map->max_bit >= b)
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)
return -1;
map->map_len = nl;
return 0;
} }
...@@ -153,6 +153,6 @@ void virBitmapIntersect(virBitmapPtr a, virBitmapPtr b) ...@@ -153,6 +153,6 @@ void virBitmapIntersect(virBitmapPtr a, virBitmapPtr b)
void virBitmapSubtract(virBitmapPtr a, virBitmapPtr b) void virBitmapSubtract(virBitmapPtr a, virBitmapPtr b)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
void virBitmapShrink(virBitmapPtr map, size_t b); int virBitmapShrink(virBitmapPtr map, size_t b);
#endif #endif
...@@ -941,7 +941,8 @@ virResctrlAllocParseProcessCache(virResctrlInfoPtr resctrl, ...@@ -941,7 +941,8 @@ virResctrlAllocParseProcessCache(virResctrlInfoPtr resctrl,
if (!mask) if (!mask)
return -1; return -1;
virBitmapShrink(mask, resctrl->levels[level]->types[type]->bits); if (virBitmapShrink(mask, resctrl->levels[level]->types[type]->bits) < 0)
goto cleanup;
if (virResctrlAllocUpdateMask(alloc, level, type, cache_id, mask) < 0) if (virResctrlAllocUpdateMask(alloc, level, type, cache_id, mask) < 0)
goto cleanup; goto cleanup;
......
...@@ -656,6 +656,14 @@ test12(const void *opaque ATTRIBUTE_UNUSED) ...@@ -656,6 +656,14 @@ test12(const void *opaque ATTRIBUTE_UNUSED)
TEST_MAP(1024, "34,1023"); TEST_MAP(1024, "34,1023");
if (virBitmapShrink(map, 35) < 0)
goto cleanup;
TEST_MAP(35, "34");
if (virBitmapShrink(map, 34) < 0)
goto cleanup;
TEST_MAP(34, "");
ret = 0; ret = 0;
cleanup: cleanup:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册