lib/test_bitops: Add benchmark test for fns()
authorKuan-Wei Chiu <visitorckw@gmail.com>
Thu, 2 May 2024 09:24:42 +0000 (17:24 +0800)
committerYury Norov <yury.norov@gmail.com>
Thu, 9 May 2024 16:25:08 +0000 (09:25 -0700)
Introduce a benchmark test for the fns(). It measures the total time
taken by fns() to process 10,000 test data generated using
get_random_bytes() for each n in the range [0, BITS_PER_LONG).

example:
test_bitops: fns:             7637268 ns

CC: Andrew Morton <akpm@linux-foundation.org>
CC: Rasmus Villemoes <linux@rasmusvillemoes.dk>
CC: David Laight <David.Laight@aculab.com>
Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com>
Suggested-by: Yury Norov <yury.norov@gmail.com>
Signed-off-by: Yury Norov <yury.norov@gmail.com>
lib/test_bitops.c

index 3b7bcbee84db4e2c64b5079712072a742c94d4dc..55669624bb28a00530b0382a89d759ff1853eb9d 100644 (file)
@@ -5,9 +5,11 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <linux/cleanup.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/printk.h>
+#include <linux/slab.h>
 
 /* a tiny module only meant to test
  *
@@ -50,6 +52,30 @@ static unsigned long order_comb_long[][2] = {
 };
 #endif
 
+static int __init test_fns(void)
+{
+       static volatile __always_used unsigned long tmp __initdata;
+       unsigned long *buf __free(kfree) = NULL;
+       unsigned int i, n;
+       ktime_t time;
+
+       buf = kmalloc_array(10000, sizeof(unsigned long), GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+
+       get_random_bytes(buf, 10000 * sizeof(unsigned long));
+       time = ktime_get();
+
+       for (n = 0; n < BITS_PER_LONG; n++)
+               for (i = 0; i < 10000; i++)
+                       tmp = fns(buf[i], n);
+
+       time = ktime_get() - time;
+       pr_err("fns:  %18llu ns\n", time);
+
+       return 0;
+}
+
 static int __init test_bitops_startup(void)
 {
        int i, bit_set;
@@ -94,6 +120,8 @@ static int __init test_bitops_startup(void)
        if (bit_set != BITOPS_LAST)
                pr_err("ERROR: FOUND SET BIT %d\n", bit_set);
 
+       test_fns();
+
        pr_info("Completed bitops test\n");
 
        return 0;