lib/tests: extend KUnit test for bitops with more cases

Extend a KUnit test suite for the bitops API to cover more APIs from
include/asm-generic/bitops/instrumented-atomic.h.

- change_bit()
- test_and_set_bit()
- test_and_clear_bit()
- test_and_change_bit()

Verified on x86_64, i386, and arm64 architectures.

Sample KUnit output:

        KTAP version 1
        # Subtest: test_change_bit
        ok 1 BITOPS_4
        ok 2 BITOPS_7
        ok 3 BITOPS_11
        ok 4 BITOPS_31
        ok 5 BITOPS_88
    # test_change_bit: pass:5 fail:0 skip:0 total:5
    ok 2 test_change_bit
        KTAP version 1
        # Subtest: test_test_and_set_bit_test_and_clear_bit
        ok 1 BITOPS_4
        ok 2 BITOPS_7
        ok 3 BITOPS_11
        ok 4 BITOPS_31
        ok 5 BITOPS_88
    # test_test_and_set_bit_test_and_clear_bit: pass:5 fail:0 skip:0 total:5
    ok 3 test_test_and_set_bit_test_and_clear_bit
        KTAP version 1
        # Subtest: test_test_and_change_bit
        ok 1 BITOPS_4
        ok 2 BITOPS_7
        ok 3 BITOPS_11
        ok 4 BITOPS_31
        ok 5 BITOPS_88
    # test_test_and_change_bit: pass:5 fail:0 skip:0 total:5
    ok 4 test_test_and_change_bit

Signed-off-by: Ryota Sakamoto <sakamo.ryota@gmail.com>
Signed-off-by: Yury Norov <ynorov@nvidia.com>
This commit is contained in:
Ryota Sakamoto 2026-01-23 00:40:41 +09:00 committed by Yury Norov
parent 9d6f676493
commit 6711069dd7
2 changed files with 65 additions and 2 deletions

View File

@ -2660,8 +2660,8 @@ config BITOPS_KUNIT
This option enables the KUnit test for the bitops library This option enables the KUnit test for the bitops library
which provides functions for bit operations. which provides functions for bit operations.
Note that this is a partial copy of the original test_bitops module. Note that this is derived from the original test_bitops module.
For the full coverage, enable TEST_BITOPS. For micro-benchmarks and compiler warning checks, enable TEST_BITOPS.
If unsure, say N. If unsure, say N.

View File

@ -66,6 +66,66 @@ static void test_set_bit_clear_bit(struct kunit *test)
KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH); KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH);
} }
static void test_change_bit(struct kunit *test)
{
const struct bitops_test_case *params = test->param_value;
DECLARE_BITMAP(bitmap, BITOPS_LENGTH);
int bit_set;
bitmap_zero(bitmap, BITOPS_LENGTH);
change_bit(params->nr, bitmap);
KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
change_bit(params->nr, bitmap);
KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
bit_set = find_first_bit(bitmap, BITOPS_LENGTH);
KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH);
}
static void test_test_and_set_bit_test_and_clear_bit(struct kunit *test)
{
const struct bitops_test_case *params = test->param_value;
DECLARE_BITMAP(bitmap, BITOPS_LENGTH);
int bit_set;
bitmap_zero(bitmap, BITOPS_LENGTH);
KUNIT_EXPECT_FALSE(test, test_and_set_bit(params->nr, bitmap));
KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
KUNIT_EXPECT_TRUE(test, test_and_set_bit(params->nr, bitmap));
KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
KUNIT_EXPECT_TRUE(test, test_and_clear_bit(params->nr, bitmap));
KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
KUNIT_EXPECT_FALSE(test, test_and_clear_bit(params->nr, bitmap));
KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
bit_set = find_first_bit(bitmap, BITOPS_LENGTH);
KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH);
}
static void test_test_and_change_bit(struct kunit *test)
{
const struct bitops_test_case *params = test->param_value;
DECLARE_BITMAP(bitmap, BITOPS_LENGTH);
int bit_set;
bitmap_zero(bitmap, BITOPS_LENGTH);
KUNIT_EXPECT_FALSE(test, test_and_change_bit(params->nr, bitmap));
KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
KUNIT_EXPECT_TRUE(test, test_and_change_bit(params->nr, bitmap));
KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
bit_set = find_first_bit(bitmap, BITOPS_LENGTH);
KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH);
}
struct order_test_case { struct order_test_case {
const char *str; const char *str;
const unsigned int count; const unsigned int count;
@ -121,6 +181,9 @@ static void test_get_count_order_long(struct kunit *test)
static struct kunit_case bitops_test_cases[] = { static struct kunit_case bitops_test_cases[] = {
KUNIT_CASE_PARAM(test_set_bit_clear_bit, bitops_gen_params), KUNIT_CASE_PARAM(test_set_bit_clear_bit, bitops_gen_params),
KUNIT_CASE_PARAM(test_change_bit, bitops_gen_params),
KUNIT_CASE_PARAM(test_test_and_set_bit_test_and_clear_bit, bitops_gen_params),
KUNIT_CASE_PARAM(test_test_and_change_bit, bitops_gen_params),
KUNIT_CASE_PARAM(test_get_count_order, order_gen_params), KUNIT_CASE_PARAM(test_get_count_order, order_gen_params),
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
KUNIT_CASE_PARAM(test_get_count_order_long, order_long_gen_params), KUNIT_CASE_PARAM(test_get_count_order_long, order_long_gen_params),