On Fri, May 15, 2020 at 04:48:46AM +0530, Syed Nayyar Waris wrote: > 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.
Thanks for an update. Looks pretty much okay to me, though one nit below. After addressing, Reviewed-by: Andy Shevchenko <[email protected]> > Cc: Andy Shevchenko <[email protected]> > Cc: Linus Walleij <[email protected]> > Signed-off-by: Syed Nayyar Waris <[email protected]> > Signed-off-by: William Breathitt Gray <[email protected]> > --- > Changes in v6: > - Make 'for loop' inside 'test_for_each_set_clump' more succinct. > > Changes in v5: > - No change. > > 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 | 142 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 142 insertions(+) > > diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c > index 6b13150667f5..673c512a5bbd 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) > { > @@ -577,6 +610,28 @@ static void noinline __init test_mem_optimisations(void) > } > } > > +static const unsigned long clump_bitmap_data[] __initconst = { > + 0x38000201, > + 0x05ff0f38, > + 0xeffedcba, > + 0xbbbbabcd, > + 0x000000aa, > + 0x000000aa, > + 0x00ff0000, > + 0xaaaaaa00, > + 0xff000000, > + 0x00aa0000, > + 0x00000000, > + 0x00000000, > + 0x00000000, > + 0x0f000000, > + 0x00ff0000, > + 0xaaaaaa00, > + 0xff000000, > + 0x00aa0000, > + 0x00000ac0, > +}; > + > static const unsigned char clump_exp[] __initconst = { > 0x01, /* 1 bit set */ > 0x02, /* non-edge 1 bit set */ > @@ -588,6 +643,92 @@ static const unsigned char clump_exp[] __initconst = { > 0x05, /* non-adjacent 2 bits set */ > }; > > +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, > +}; > + > +struct clump_test_data { > + unsigned long data[256]; DECLARE_BITMAP() ? > + unsigned long count; > + unsigned long offset; > + unsigned long limit; > + unsigned long clump_size; > + unsigned long const *exp; > +} clump_test_data[] = { {{0}, 2, 0, 64, 8, clump_exp1}, > + {{0}, 8, 2, 240, 24, clump_exp2}, > + {{0}, 8, 10, 240, 30, clump_exp3}, > + {{0}, 1, 18, 18, 6, clump_exp4} }; Please, split structure definition and test data. > + > +static void __init prepare_test_data(unsigned int index) > +{ > + int i; > + unsigned long width = 0; > + > + for(i = 0; i < clump_test_data[index].count; i++) > + { > + bitmap_set_value(clump_test_data[index].data, > + clump_bitmap_data[(clump_test_data[index].offset)++], > width, 32); > + width += 32; > + } > +} > + > +static void __init execute_for_each_set_clump_test(unsigned int index) > +{ > + unsigned long start, clump; > + > + for_each_set_clump(start, clump, clump_test_data[index].data, > + clump_test_data[index].limit, > + > clump_test_data[index].clump_size) > + expect_eq_clump(start, clump_test_data[index].limit, > clump_test_data[index].exp, > + &clump, > clump_test_data[index].clump_size); > +} > + > +static void __init test_for_each_set_clump(void) > +{ > + unsigned int i; > + > + for (i = 0; i < ARRAY_SIZE(clump_test_data); i++) { > + prepare_test_data(i); > + execute_for_each_set_clump_test(i); > + } > +} > + > static void __init test_for_each_set_clump8(void) > { > #define CLUMP_EXP_NUMBITS 64 > @@ -623,6 +764,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 > -- With Best Regards, Andy Shevchenko

