diff options
author | Davidlohr Bueso <dave@stgolabs.net> | 2017-09-08 19:14:46 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-08 21:26:48 -0400 |
commit | 223f8911eace60c787f8767c25148b80ece9732a (patch) | |
tree | aab15ffedbebdd756d23dcc96819b4bf2834683f /lib/rbtree_test.c | |
parent | 35dc67d7d922b2c9a1adb006c7a0f370eeb5c114 (diff) |
lib/rbtree_test.c: make input module parameters
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>
Diffstat (limited to 'lib/rbtree_test.c')
-rw-r--r-- | lib/rbtree_test.c | 55 |
1 files 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 @@ | |||
1 | #include <linux/module.h> | 1 | #include <linux/module.h> |
2 | #include <linux/moduleparam.h> | ||
2 | #include <linux/rbtree_augmented.h> | 3 | #include <linux/rbtree_augmented.h> |
3 | #include <linux/random.h> | 4 | #include <linux/random.h> |
5 | #include <linux/slab.h> | ||
4 | #include <asm/timex.h> | 6 | #include <asm/timex.h> |
5 | 7 | ||
6 | #define NODES 100 | 8 | #define __param(type, name, init, msg) \ |
7 | #define PERF_LOOPS 100000 | 9 | static type name = init; \ |
8 | #define CHECK_LOOPS 100 | 10 | module_param(name, type, 0444); \ |
11 | MODULE_PARM_DESC(name, msg); | ||
12 | |||
13 | __param(int, nnodes, 100, "Number of nodes in the rb-tree"); | ||
14 | __param(int, perf_loops, 100000, "Number of iterations modifying the rb-tree"); | ||
15 | __param(int, check_loops, 100, "Number of iterations modifying and verifying the rb-tree"); | ||
9 | 16 | ||
10 | struct test_node { | 17 | struct test_node { |
11 | u32 key; | 18 | u32 key; |
@@ -17,7 +24,7 @@ struct test_node { | |||
17 | }; | 24 | }; |
18 | 25 | ||
19 | static struct rb_root root = RB_ROOT; | 26 | static struct rb_root root = RB_ROOT; |
20 | static struct test_node nodes[NODES]; | 27 | static struct test_node *nodes = NULL; |
21 | 28 | ||
22 | static struct rnd_state rnd; | 29 | static struct rnd_state rnd; |
23 | 30 | ||
@@ -95,7 +102,7 @@ static void erase_augmented(struct test_node *node, struct rb_root *root) | |||
95 | static void init(void) | 102 | static void init(void) |
96 | { | 103 | { |
97 | int i; | 104 | int i; |
98 | for (i = 0; i < NODES; i++) { | 105 | for (i = 0; i < nnodes; i++) { |
99 | nodes[i].key = prandom_u32_state(&rnd); | 106 | nodes[i].key = prandom_u32_state(&rnd); |
100 | nodes[i].val = prandom_u32_state(&rnd); | 107 | nodes[i].val = prandom_u32_state(&rnd); |
101 | } | 108 | } |
@@ -177,6 +184,10 @@ static int __init rbtree_test_init(void) | |||
177 | int i, j; | 184 | int i, j; |
178 | cycles_t time1, time2, time; | 185 | cycles_t time1, time2, time; |
179 | 186 | ||
187 | nodes = kmalloc(nnodes * sizeof(*nodes), GFP_KERNEL); | ||
188 | if (!nodes) | ||
189 | return -ENOMEM; | ||
190 | |||
180 | printk(KERN_ALERT "rbtree testing"); | 191 | printk(KERN_ALERT "rbtree testing"); |
181 | 192 | ||
182 | prandom_seed_state(&rnd, 3141592653589793238ULL); | 193 | prandom_seed_state(&rnd, 3141592653589793238ULL); |
@@ -184,27 +195,27 @@ static int __init rbtree_test_init(void) | |||
184 | 195 | ||
185 | time1 = get_cycles(); | 196 | time1 = get_cycles(); |
186 | 197 | ||
187 | for (i = 0; i < PERF_LOOPS; i++) { | 198 | for (i = 0; i < perf_loops; i++) { |
188 | for (j = 0; j < NODES; j++) | 199 | for (j = 0; j < nnodes; j++) |
189 | insert(nodes + j, &root); | 200 | insert(nodes + j, &root); |
190 | for (j = 0; j < NODES; j++) | 201 | for (j = 0; j < nnodes; j++) |
191 | erase(nodes + j, &root); | 202 | erase(nodes + j, &root); |
192 | } | 203 | } |
193 | 204 | ||
194 | time2 = get_cycles(); | 205 | time2 = get_cycles(); |
195 | time = time2 - time1; | 206 | time = time2 - time1; |
196 | 207 | ||
197 | time = div_u64(time, PERF_LOOPS); | 208 | time = div_u64(time, perf_loops); |
198 | printk(" -> %llu cycles\n", (unsigned long long)time); | 209 | printk(" -> %llu cycles\n", (unsigned long long)time); |
199 | 210 | ||
200 | for (i = 0; i < CHECK_LOOPS; i++) { | 211 | for (i = 0; i < check_loops; i++) { |
201 | init(); | 212 | init(); |
202 | for (j = 0; j < NODES; j++) { | 213 | for (j = 0; j < nnodes; j++) { |
203 | check(j); | 214 | check(j); |
204 | insert(nodes + j, &root); | 215 | insert(nodes + j, &root); |
205 | } | 216 | } |
206 | for (j = 0; j < NODES; j++) { | 217 | for (j = 0; j < nnodes; j++) { |
207 | check(NODES - j); | 218 | check(nnodes - j); |
208 | erase(nodes + j, &root); | 219 | erase(nodes + j, &root); |
209 | } | 220 | } |
210 | check(0); | 221 | check(0); |
@@ -216,32 +227,34 @@ static int __init rbtree_test_init(void) | |||
216 | 227 | ||
217 | time1 = get_cycles(); | 228 | time1 = get_cycles(); |
218 | 229 | ||
219 | for (i = 0; i < PERF_LOOPS; i++) { | 230 | for (i = 0; i < perf_loops; i++) { |
220 | for (j = 0; j < NODES; j++) | 231 | for (j = 0; j < nnodes; j++) |
221 | insert_augmented(nodes + j, &root); | 232 | insert_augmented(nodes + j, &root); |
222 | for (j = 0; j < NODES; j++) | 233 | for (j = 0; j < nnodes; j++) |
223 | erase_augmented(nodes + j, &root); | 234 | erase_augmented(nodes + j, &root); |
224 | } | 235 | } |
225 | 236 | ||
226 | time2 = get_cycles(); | 237 | time2 = get_cycles(); |
227 | time = time2 - time1; | 238 | time = time2 - time1; |
228 | 239 | ||
229 | time = div_u64(time, PERF_LOOPS); | 240 | time = div_u64(time, perf_loops); |
230 | printk(" -> %llu cycles\n", (unsigned long long)time); | 241 | printk(" -> %llu cycles\n", (unsigned long long)time); |
231 | 242 | ||
232 | for (i = 0; i < CHECK_LOOPS; i++) { | 243 | for (i = 0; i < check_loops; i++) { |
233 | init(); | 244 | init(); |
234 | for (j = 0; j < NODES; j++) { | 245 | for (j = 0; j < nnodes; j++) { |
235 | check_augmented(j); | 246 | check_augmented(j); |
236 | insert_augmented(nodes + j, &root); | 247 | insert_augmented(nodes + j, &root); |
237 | } | 248 | } |
238 | for (j = 0; j < NODES; j++) { | 249 | for (j = 0; j < nnodes; j++) { |
239 | check_augmented(NODES - j); | 250 | check_augmented(nnodes - j); |
240 | erase_augmented(nodes + j, &root); | 251 | erase_augmented(nodes + j, &root); |
241 | } | 252 | } |
242 | check_augmented(0); | 253 | check_augmented(0); |
243 | } | 254 | } |
244 | 255 | ||
256 | kfree(nodes); | ||
257 | |||
245 | return -EAGAIN; /* Fail will directly unload the module */ | 258 | return -EAGAIN; /* Fail will directly unload the module */ |
246 | } | 259 | } |
247 | 260 | ||