[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