[libvirt] [PATCH v2 2/3] util: Clear unused part of the map in virBitmapShrink
Martin Kletzander
mkletzan at redhat.com
Fri Feb 2 13:37:14 UTC 2018
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 <mkletzan at 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 at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180202/6896ab1c/attachment-0001.sig>
More information about the libvir-list
mailing list