lib/test_bitmap.c: add optimisation tests
authorMatthew Wilcox <mawilcox@microsoft.com>
Mon, 10 Jul 2017 22:51:26 +0000 (15:51 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 10 Jul 2017 23:32:34 +0000 (16:32 -0700)
Patch series "Bitmap optimisations", v2.

These three bitmap patches use more efficient specialisations when the
compiler can figure out that it's safe to do so.  Thanks to Rasmus's
eagle eyes, a nasty bug in v1 was avoided, and I've added a test case
which would have caught it.

This patch (of 4):

This version of the test is actually a no-op; the next patch will enable
it.

Link: http://lkml.kernel.org/r/20170628153221.11322-2-willy@infradead.org
Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib/test_bitmap.c

index e2cbd43d193cff9de5e92f5a7e85fd9f53790210..252d3bddbe7de47e9c245f9fee07b99bec523c7c 100644 (file)
@@ -333,10 +333,42 @@ static void __init test_bitmap_u32_array_conversions(void)
        }
 }
 
+#define __bitmap_set(a, b, c)  bitmap_set(a, b, c)
+#define __bitmap_clear(a, b, c)        bitmap_clear(a, b, c)
+
+static void noinline __init test_mem_optimisations(void)
+{
+       DECLARE_BITMAP(bmap1, 1024);
+       DECLARE_BITMAP(bmap2, 1024);
+       unsigned int start, nbits;
+
+       for (start = 0; start < 1024; start += 8) {
+               memset(bmap1, 0x5a, sizeof(bmap1));
+               memset(bmap2, 0x5a, sizeof(bmap2));
+               for (nbits = 0; nbits < 1024 - start; nbits += 8) {
+                       bitmap_set(bmap1, start, nbits);
+                       __bitmap_set(bmap2, start, nbits);
+                       if (!bitmap_equal(bmap1, bmap2, 1024))
+                               printk("set not equal %d %d\n", start, nbits);
+                       if (!__bitmap_equal(bmap1, bmap2, 1024))
+                               printk("set not __equal %d %d\n", start, nbits);
+
+                       bitmap_clear(bmap1, start, nbits);
+                       __bitmap_clear(bmap2, start, nbits);
+                       if (!bitmap_equal(bmap1, bmap2, 1024))
+                               printk("clear not equal %d %d\n", start, nbits);
+                       if (!__bitmap_equal(bmap1, bmap2, 1024))
+                               printk("clear not __equal %d %d\n", start,
+                                                                       nbits);
+               }
+       }
+}
+
 static int __init test_bitmap_init(void)
 {
        test_zero_fill_copy();
        test_bitmap_u32_array_conversions();
+       test_mem_optimisations();
 
        if (failed_tests == 0)
                pr_info("all %u tests passed\n", total_tests);