]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bitmap: test bitmap_weight() for more
authorYury Norov <ynorov@nvidia.com>
Thu, 19 Mar 2026 00:43:46 +0000 (20:43 -0400)
committerYury Norov <ynorov@nvidia.com>
Mon, 23 Mar 2026 17:56:25 +0000 (13:56 -0400)
Test the function for correctness when some bits are set in the last word
of bitmap beyond nbits. This is motivated by commit a9dadc1c512807f9
("powerpc/xive: Fix the size of the cpumask used in
xive_find_target_in_mask()").

Signed-off-by: Yury Norov <ynorov@nvidia.com>
lib/test_bitmap.c

index cd4cb36e42a51c7a1e0b78413b5c8c9e48e5e9ea..eeb497016ed373dd6d4eef803263f3e169b4df8d 100644 (file)
@@ -858,6 +858,7 @@ static void __init test_bitmap_weight(void)
 {
        unsigned int bit, w1, w2, w;
        DECLARE_BITMAP(b, 30);
+       DECLARE_BITMAP(b1, 128);
 
        bitmap_parselist("all:1/2", b, 30);
 
@@ -877,6 +878,24 @@ static void __init test_bitmap_weight(void)
                w2 = bitmap_weight_from(exp1, bit, EXP1_IN_BITS);
                expect_eq_uint(w1 + w2, w);
        }
+
+       /* Test out-of-range */
+       w = bitmap_weight_from(b, 31, 30);
+       expect_eq_uint(0, !!(w < 30));
+
+       /*
+        * Test bitmap_weight() for correctness in case of some bits set between
+        * nbits and end of the last word.
+        */
+       bitmap_fill(b1, 128);
+
+       /* Inline */
+       expect_eq_uint(30, bitmap_weight(b1, 30));
+       expect_eq_uint(100, bitmap_weight(b1, 100));
+
+       /* Outline */
+       for (int i  = 1; i < 128; i++)
+               expect_eq_uint(i, bitmap_weight(b1, i));
 }
 
 static void __init test_for_each_clear_bit(void)