lkml.org 
[lkml]   [2020]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v4 2/4] lib/test_bitmap.c: Add for_each_set_clump test cases
    The introduction of the generic for_each_set_clump macro need test
    cases to verify the implementation. This patch adds test cases for
    scenarios in which clump sizes are 8 bits, 24 bits, 30 bits and 6 bits.
    The cases contain situations where clump is getting split at the word
    boundary and also when zeroes are present in the start and middle of
    bitmap.

    Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Syed Nayyar Waris <syednwaris@gmail.com>
    Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com>
    ---
    Changes in v4:
    - Use 'for' loop in test function of 'for_each_set_clump'.

    Changes in v3:
    - No Change.

    Changes in v2:
    - Unify different tests for 'for_each_set_clump'. Pass test data as
    function parameters.
    - Remove unnecessary bitmap_zero calls.

    lib/test_bitmap.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 141 insertions(+)

    diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c
    index 6b13150667f5..a2a1c411dd62 100644
    --- a/lib/test_bitmap.c
    +++ b/lib/test_bitmap.c
    @@ -155,6 +155,38 @@ static bool __init __check_eq_clump8(const char *srcfile, unsigned int line,
    return true;
    }

    +static bool __init __check_eq_clump(const char *srcfile, unsigned int line,
    + const unsigned int offset,
    + const unsigned int size,
    + const unsigned long *const clump_exp,
    + const unsigned long *const clump,
    + const unsigned long clump_size)
    +{
    + unsigned long exp;
    +
    + if (offset >= size) {
    + pr_warn("[%s:%u] bit offset for clump out-of-bounds: expected less than %u, got %u\n",
    + srcfile, line, size, offset);
    + return false;
    + }
    +
    + exp = clump_exp[offset / clump_size];
    + if (!exp) {
    + pr_warn("[%s:%u] bit offset for zero clump: expected nonzero clump, got bit offset %u with clump value 0",
    + srcfile, line, offset);
    + return false;
    + }
    +
    + if (*clump != exp) {
    + pr_warn("[%s:%u] expected clump value of 0x%lX, got clump value of 0x%lX",
    + srcfile, line, exp, *clump);
    + return false;
    + }
    +
    + return true;
    +}
    +
    +
    #define __expect_eq(suffix, ...) \
    ({ \
    int result = 0; \
    @@ -172,6 +204,7 @@ static bool __init __check_eq_clump8(const char *srcfile, unsigned int line,
    #define expect_eq_pbl(...) __expect_eq(pbl, ##__VA_ARGS__)
    #define expect_eq_u32_array(...) __expect_eq(u32_array, ##__VA_ARGS__)
    #define expect_eq_clump8(...) __expect_eq(clump8, ##__VA_ARGS__)
    +#define expect_eq_clump(...) __expect_eq(clump, ##__VA_ARGS__)

    static void __init test_zero_clear(void)
    {
    @@ -588,6 +621,71 @@ static const unsigned char clump_exp[] __initconst = {
    0x05, /* non-adjacent 2 bits set */
    };

    +static const unsigned long bitmap_test_data[] __initconst = {
    + 0x38000201,
    + 0x05ff0f38,
    + 0xeffedcba,
    + 0xbbbbabcd,
    + 0x000000aa,
    + 0x000000aa,
    + 0x00ff0000,
    + 0xaaaaaa00,
    + 0xff000000,
    + 0x00aa0000,
    + 0x00000000,
    + 0x00000000,
    + 0x00000000,
    + 0x0f000000,
    + 0x00000ac0,
    +};
    +
    +static const unsigned long clump_exp1[] __initconst = {
    + 0x01, /* 1 bit set */
    + 0x02, /* non-edge 1 bit set */
    + 0x00, /* zero bits set */
    + 0x38, /* 3 bits set across 4-bit boundary */
    + 0x38, /* Repeated clump */
    + 0x0F, /* 4 bits set */
    + 0xFF, /* all bits set */
    + 0x05, /* non-adjacent 2 bits set */
    +};
    +
    +static const unsigned long clump_exp2[] __initconst = {
    + 0xfedcba, /* 24 bits */
    + 0xabcdef,
    + 0xaabbbb, /* Clump split between 2 words */
    + 0x000000, /* zeroes in between */
    + 0x0000aa,
    + 0x000000,
    + 0x0000ff,
    + 0xaaaaaa,
    + 0x000000,
    + 0x0000ff,
    +};
    +
    +static const unsigned long clump_exp3[] __initconst = {
    + 0x00000000, /* starting with 0s*/
    + 0x00000000, /* All 0s */
    + 0x00000000,
    + 0x00000000,
    + 0x3f00000f, /* Non zero set */
    + 0x2aa80003,
    + 0x00000aaa,
    + 0x00003fc0,
    +};
    +
    +static const unsigned long clump_exp4[] __initconst = {
    + 0x00,
    + 0x2b,
    +};
    +
    +static const unsigned long * const clump_data[] __initconst = {
    + clump_exp1,
    + clump_exp2,
    + clump_exp3,
    + clump_exp4,
    +};
    +
    static void __init test_for_each_set_clump8(void)
    {
    #define CLUMP_EXP_NUMBITS 64
    @@ -610,6 +708,48 @@ static void __init test_for_each_set_clump8(void)
    expect_eq_clump8(start, CLUMP_EXP_NUMBITS, clump_exp, &clump);
    }

    +static void __init execute_for_each_set_clump_test(unsigned long *bits,
    + unsigned long size,
    + unsigned long clump_size,
    + const unsigned long *clump_exp)
    +{
    + unsigned long start, clump;
    +
    + for_each_set_clump(start, clump, bits, size, clump_size)
    + expect_eq_clump(start, size, clump_exp, &clump, clump_size);
    +}
    +
    +static void __init prepare_test_data(unsigned long * bits,
    + const unsigned long * test_data,
    + int start, int count)
    +{
    + int i;
    + unsigned long position = 0;
    +
    + for(i = 0; i < count; i++)
    + {
    + bitmap_set_value(bits, test_data[start++], position, 32);
    + position += 32;
    + }
    +}
    +
    +static void __init test_for_each_set_clump(void)
    +{
    + int i;
    + int count[] = {2, 8, 4, 1};
    + int offset[] = {0, 2, 10, 14};
    + unsigned long limit[] = {64, 240, 240, 18};
    + unsigned long clump_size[] = {8, 24, 30, 6};
    + DECLARE_BITMAP(bits, 256);
    +
    + for(i = 0; i < 4; i++)
    + {
    + prepare_test_data(bits, bitmap_test_data, offset[i], count[i]);
    + execute_for_each_set_clump_test(bits, limit[i],
    + clump_size[i], clump_data[i]);
    + }
    +}
    +
    static void __init selftest(void)
    {
    test_zero_clear();
    @@ -623,6 +763,7 @@ static void __init selftest(void)
    test_bitmap_parselist_user();
    test_mem_optimisations();
    test_for_each_set_clump8();
    + test_for_each_set_clump();
    }

    KSTM_MODULE_LOADERS(test_bitmap);
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-05-02 20:50    [W:3.237 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site