From: Syed Nayyar Waris <syednwaris@gmail.com>
To: akpm@linux-foundation.org
Cc: andriy.shevchenko@linux.intel.com, vilhelm.gray@gmail.com,
linus.walleij@linaro.org, linux-kernel@vger.kernel.org
Subject: [PATCH 2/6] lib/test_bitmap.c: Add for_each_set_clump test cases
Date: Fri, 24 Apr 2020 17:56:19 +0530 [thread overview]
Message-ID: <20200424122619.GA5573@syed> (raw)
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>
---
lib/test_bitmap.c | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 159 insertions(+)
diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c
index 6b13150..5c1f98f 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,46 @@ 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,
+};
+
static void __init test_for_each_set_clump8(void)
{
#define CLUMP_EXP_NUMBITS 64
@@ -610,6 +683,88 @@ static void __init test_for_each_set_clump8(void)
expect_eq_clump8(start, CLUMP_EXP_NUMBITS, clump_exp, &clump);
}
+static void __init test_for_each_set_clump_8(void) /* 8 bit clumps test using
+ new for_each_set_clump */
+{
+#define CLUMP_EXP_NUMBITS 64
+ DECLARE_BITMAP(bits, CLUMP_EXP_NUMBITS);
+ unsigned long start, clump, clump_size = 8;
+
+ /* set bitmap to test case */
+ bitmap_zero(bits, CLUMP_EXP_NUMBITS);
+ bitmap_set_value(bits, 0x38000201, 0, 32);
+ bitmap_set_value(bits, 0x05ff0f38, 32, 32);
+
+ for_each_set_clump(start, clump, bits, CLUMP_EXP_NUMBITS, clump_size)
+ expect_eq_clump(start, CLUMP_EXP_NUMBITS, clump_exp1, &clump, clump_size);
+}
+
+static void __init test_for_each_set_clump_24(void) /* 24 bit clumps */
+{
+#define CLUMP_EXP_NUMBITS_2 256
+ DECLARE_BITMAP(bits, CLUMP_EXP_NUMBITS_2);
+ unsigned long start, clump, clump_size = 24;
+ unsigned long size = clump_size * 10;
+
+ /* set bitmap to test case */
+ bitmap_zero(bits, CLUMP_EXP_NUMBITS_2);
+ bitmap_set_value(bits, 0xeffedcba, 0, 32);
+ bitmap_set_value(bits, 0xbbbbabcd, 32, 32);
+ bitmap_set_value(bits, 0x000000aa, 64, 32);
+ bitmap_set_value(bits, 0x000000aa, 96, 32);
+ bitmap_set_value(bits, 0x00ff0000, 128, 32);
+ bitmap_set_value(bits, 0xaaaaaa00, 160, 32);
+ bitmap_set_value(bits, 0xff000000, 192, 32);
+ bitmap_set_value(bits, 0x00aa0000, 224, 32);
+
+ for_each_set_clump(start, clump, bits, size, clump_size)
+ expect_eq_clump(start, size, clump_exp2, &clump, clump_size);
+}
+
+static void __init test_for_each_set_clump_30(void) /* 30 bit clumps */
+{
+#define CLUMP_EXP_NUMBITS_2 256
+ DECLARE_BITMAP(bits, CLUMP_EXP_NUMBITS_2);
+ unsigned long start, clump, clump_size = 30;
+ unsigned long size = clump_size * 8;
+
+ /* set bitmap to test case */
+ bitmap_zero(bits, CLUMP_EXP_NUMBITS_2);
+ bitmap_set_value(bits, 0x00000000, 0, 32);
+ bitmap_set_value(bits, 0x00000000, 32, 32);
+ bitmap_set_value(bits, 0x00000000, 64, 32);
+ bitmap_set_value(bits, 0x0f000000, 96, 32);
+ bitmap_set_value(bits, 0x00ff0000, 128, 32);
+ bitmap_set_value(bits, 0xaaaaaa00, 160, 32);
+ bitmap_set_value(bits, 0xff000000, 192, 32);
+ bitmap_set_value(bits, 0x00aa0000, 224, 32);
+
+ for_each_set_clump(start, clump, bits, size, clump_size)
+ expect_eq_clump(start, size, clump_exp3, &clump, clump_size);
+}
+
+static void __init test_for_each_set_clump_6(void) /* 6 bit clumps */
+{
+#define CLUMP_EXP_NUMBITS_2 256
+ DECLARE_BITMAP(bits, CLUMP_EXP_NUMBITS_2);
+ unsigned long start, clump, clump_size = 6;
+ unsigned long size = clump_size * 3;
+
+ /* set bitmap to test case */
+ bitmap_zero(bits, CLUMP_EXP_NUMBITS_2);
+ bitmap_set_value(bits, 0x00000ac0, 0, 32);
+ bitmap_set_value(bits, 0x00000000, 32, 32);
+ bitmap_set_value(bits, 0x00000000, 64, 32);
+ bitmap_set_value(bits, 0x0f000000, 96, 32);
+ bitmap_set_value(bits, 0x00ff0000, 128, 32);
+ bitmap_set_value(bits, 0xaaaaaa00, 160, 32);
+ bitmap_set_value(bits, 0xff000000, 192, 32);
+ bitmap_set_value(bits, 0x00aa0000, 224, 32);
+
+ for_each_set_clump(start, clump, bits, size, clump_size)
+ expect_eq_clump(start, size, clump_exp4, &clump, clump_size);
+}
+
static void __init selftest(void)
{
test_zero_clear();
@@ -623,6 +778,10 @@ static void __init selftest(void)
test_bitmap_parselist_user();
test_mem_optimisations();
test_for_each_set_clump8();
+ test_for_each_set_clump_8();
+ test_for_each_set_clump_24();
+ test_for_each_set_clump_30();
+ test_for_each_set_clump_6();
}
KSTM_MODULE_LOADERS(test_bitmap);
--
2.7.4
next reply other threads:[~2020-04-24 12:26 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-24 12:26 Syed Nayyar Waris [this message]
2020-04-24 13:11 ` [PATCH 2/6] lib/test_bitmap.c: Add for_each_set_clump test cases Andy Shevchenko
2020-04-24 18:26 ` Syed Nayyar Waris
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200424122619.GA5573@syed \
--to=syednwaris@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=vilhelm.gray@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.