From nobody Mon Dec 15 01:54:25 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1517576726813523.3167396235519; Fri, 2 Feb 2018 05:05:26 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CC24F5B319; Fri, 2 Feb 2018 13:05:24 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 925047A2EF; Fri, 2 Feb 2018 13:05:21 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 103CF184B485; Fri, 2 Feb 2018 13:05:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w12D4sQe008348 for ; Fri, 2 Feb 2018 08:04:54 -0500 Received: by smtp.corp.redhat.com (Postfix) id 0F28A6312F; Fri, 2 Feb 2018 13:04:54 +0000 (UTC) Received: from caroline.localdomain (unknown [10.43.2.67]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4BAAA5F73D for ; Fri, 2 Feb 2018 13:04:39 +0000 (UTC) Received: from caroline.brq.redhat.com (caroline.usersys.redhat.com [127.0.0.1]) by caroline.localdomain (Postfix) with ESMTP id 3F0831200FE for ; Fri, 2 Feb 2018 14:04:38 +0100 (CET) From: Martin Kletzander To: libvir-list@redhat.com Date: Fri, 2 Feb 2018 14:04:31 +0100 Message-Id: <4ea103031dc57ff0468d60d84497d258e41e9dc2.1517576645.git.mkletzan@redhat.com> In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 2/3] util: Clear unused part of the map in virBitmapShrink X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Fri, 02 Feb 2018 13:05:25 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Some of the other functions depend on the fact that unused bits and longs a= re always zero and it's less error-prone to clear it than fix the other functi= ons. 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=3D1540817 Signed-off-by: Martin Kletzander --- 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, =20 /* 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 =3D 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. Noth= ing - * will change if the size is already smaller than @b. - * - * NB: Does not adjust the map->map_len so that a subsequent virBitmapExpa= nd - * doesn't necessarily need to reallocate. + * Reduces the bitmap to size @b. Nothing will change if the size is alre= ady + * smaller than or equal to @b. */ -void +int virBitmapShrink(virBitmapPtr map, size_t b) { + size_t nl =3D 0; + size_t nb =3D 0; + if (!map) - return; + return 0; =20 if (map->max_bit >=3D b) map->max_bit =3D b; + + nl =3D map->max_bit / VIR_BITMAP_BITS_PER_UNIT; + nb =3D map->max_bit % VIR_BITMAP_BITS_PER_UNIT; + map->map[nl] &=3D ((1UL << nb) - 1); + + nl++; + if (nl =3D=3D map->map_len) + return 0; + + if (VIR_REALLOC_N(map->map, nl) < 0) + return -1; + + map->map_len =3D nl; + return 0; } diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h index 2464814055de..5a3362a19f9f 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); =20 -void virBitmapShrink(virBitmapPtr map, size_t b); +int virBitmapShrink(virBitmapPtr map, size_t b); =20 #endif diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c index 70426199ce20..ef388757a704 100644 --- a/src/util/virresctrl.c +++ b/src/util/virresctrl.c @@ -941,7 +941,8 @@ virResctrlAllocParseProcessCache(virResctrlInfoPtr resc= trl, if (!mask) return -1; =20 - virBitmapShrink(mask, resctrl->levels[level]->types[type]->bits); + if (virBitmapShrink(mask, resctrl->levels[level]->types[type]->bits) <= 0) + goto cleanup; =20 if (virResctrlAllocUpdateMask(alloc, level, type, cache_id, mask) < 0) goto cleanup; diff --git a/tests/virbitmaptest.c b/tests/virbitmaptest.c index 9c0ffe70cb49..fffecdf1f6ed 100644 --- a/tests/virbitmaptest.c +++ b/tests/virbitmaptest.c @@ -656,6 +656,14 @@ test12(const void *opaque ATTRIBUTE_UNUSED) =20 TEST_MAP(1024, "34,1023"); =20 + if (virBitmapShrink(map, 35) < 0) + goto cleanup; + TEST_MAP(35, "34"); + + if (virBitmapShrink(map, 34) < 0) + goto cleanup; + TEST_MAP(34, ""); + ret =3D 0; =20 cleanup: --=20 2.16.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list