| From e20e600a8d2c98665ec9b80008f199a778acdd93 Mon Sep 17 00:00:00 2001 |
| From: Davidlohr Bueso <dave@stgolabs.net> |
| Date: Fri, 8 Sep 2017 16:14:46 -0700 |
| Subject: lib/rbtree_test.c: make input module parameters |
| |
| [ Upstream commit 223f8911eace60c787f8767c25148b80ece9732a ] |
| |
| Allows for more flexible debugging. |
| |
| Link: http://lkml.kernel.org/r/20170719014603.19029-5-dave@stgolabs.net |
| Signed-off-by: Davidlohr Bueso <dbueso@suse.de> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| lib/rbtree_test.c | 55 +++++++++++++++++++++++++++++------------------ |
| 1 file changed, 34 insertions(+), 21 deletions(-) |
| |
| diff --git a/lib/rbtree_test.c b/lib/rbtree_test.c |
| index 8b3c9dc88262..e83331aa1b7f 100644 |
| --- a/lib/rbtree_test.c |
| +++ b/lib/rbtree_test.c |
| @@ -1,11 +1,18 @@ |
| #include <linux/module.h> |
| +#include <linux/moduleparam.h> |
| #include <linux/rbtree_augmented.h> |
| #include <linux/random.h> |
| +#include <linux/slab.h> |
| #include <asm/timex.h> |
| |
| -#define NODES 100 |
| -#define PERF_LOOPS 100000 |
| -#define CHECK_LOOPS 100 |
| +#define __param(type, name, init, msg) \ |
| + static type name = init; \ |
| + module_param(name, type, 0444); \ |
| + MODULE_PARM_DESC(name, msg); |
| + |
| +__param(int, nnodes, 100, "Number of nodes in the rb-tree"); |
| +__param(int, perf_loops, 100000, "Number of iterations modifying the rb-tree"); |
| +__param(int, check_loops, 100, "Number of iterations modifying and verifying the rb-tree"); |
| |
| struct test_node { |
| u32 key; |
| @@ -17,7 +24,7 @@ struct test_node { |
| }; |
| |
| static struct rb_root root = RB_ROOT; |
| -static struct test_node nodes[NODES]; |
| +static struct test_node *nodes = NULL; |
| |
| static struct rnd_state rnd; |
| |
| @@ -95,7 +102,7 @@ static void erase_augmented(struct test_node *node, struct rb_root *root) |
| static void init(void) |
| { |
| int i; |
| - for (i = 0; i < NODES; i++) { |
| + for (i = 0; i < nnodes; i++) { |
| nodes[i].key = prandom_u32_state(&rnd); |
| nodes[i].val = prandom_u32_state(&rnd); |
| } |
| @@ -177,6 +184,10 @@ static int __init rbtree_test_init(void) |
| int i, j; |
| cycles_t time1, time2, time; |
| |
| + nodes = kmalloc(nnodes * sizeof(*nodes), GFP_KERNEL); |
| + if (!nodes) |
| + return -ENOMEM; |
| + |
| printk(KERN_ALERT "rbtree testing"); |
| |
| prandom_seed_state(&rnd, 3141592653589793238ULL); |
| @@ -184,27 +195,27 @@ static int __init rbtree_test_init(void) |
| |
| time1 = get_cycles(); |
| |
| - for (i = 0; i < PERF_LOOPS; i++) { |
| - for (j = 0; j < NODES; j++) |
| + for (i = 0; i < perf_loops; i++) { |
| + for (j = 0; j < nnodes; j++) |
| insert(nodes + j, &root); |
| - for (j = 0; j < NODES; j++) |
| + for (j = 0; j < nnodes; j++) |
| erase(nodes + j, &root); |
| } |
| |
| time2 = get_cycles(); |
| time = time2 - time1; |
| |
| - time = div_u64(time, PERF_LOOPS); |
| + time = div_u64(time, perf_loops); |
| printk(" -> %llu cycles\n", (unsigned long long)time); |
| |
| - for (i = 0; i < CHECK_LOOPS; i++) { |
| + for (i = 0; i < check_loops; i++) { |
| init(); |
| - for (j = 0; j < NODES; j++) { |
| + for (j = 0; j < nnodes; j++) { |
| check(j); |
| insert(nodes + j, &root); |
| } |
| - for (j = 0; j < NODES; j++) { |
| - check(NODES - j); |
| + for (j = 0; j < nnodes; j++) { |
| + check(nnodes - j); |
| erase(nodes + j, &root); |
| } |
| check(0); |
| @@ -216,32 +227,34 @@ static int __init rbtree_test_init(void) |
| |
| time1 = get_cycles(); |
| |
| - for (i = 0; i < PERF_LOOPS; i++) { |
| - for (j = 0; j < NODES; j++) |
| + for (i = 0; i < perf_loops; i++) { |
| + for (j = 0; j < nnodes; j++) |
| insert_augmented(nodes + j, &root); |
| - for (j = 0; j < NODES; j++) |
| + for (j = 0; j < nnodes; j++) |
| erase_augmented(nodes + j, &root); |
| } |
| |
| time2 = get_cycles(); |
| time = time2 - time1; |
| |
| - time = div_u64(time, PERF_LOOPS); |
| + time = div_u64(time, perf_loops); |
| printk(" -> %llu cycles\n", (unsigned long long)time); |
| |
| - for (i = 0; i < CHECK_LOOPS; i++) { |
| + for (i = 0; i < check_loops; i++) { |
| init(); |
| - for (j = 0; j < NODES; j++) { |
| + for (j = 0; j < nnodes; j++) { |
| check_augmented(j); |
| insert_augmented(nodes + j, &root); |
| } |
| - for (j = 0; j < NODES; j++) { |
| - check_augmented(NODES - j); |
| + for (j = 0; j < nnodes; j++) { |
| + check_augmented(nnodes - j); |
| erase_augmented(nodes + j, &root); |
| } |
| check_augmented(0); |
| } |
| |
| + kfree(nodes); |
| + |
| return -EAGAIN; /* Fail will directly unload the module */ |
| } |
| |
| -- |
| 2.19.1 |
| |