summaryrefslogtreecommitdiffstats
path: root/lib/rbtree_test.c
diff options
context:
space:
mode:
authorDavidlohr Bueso <dave@stgolabs.net>2017-09-08 19:14:46 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-08 21:26:48 -0400
commit223f8911eace60c787f8767c25148b80ece9732a (patch)
treeaab15ffedbebdd756d23dcc96819b4bf2834683f /lib/rbtree_test.c
parent35dc67d7d922b2c9a1adb006c7a0f370eeb5c114 (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.c55
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
10struct test_node { 17struct test_node {
11 u32 key; 18 u32 key;
@@ -17,7 +24,7 @@ struct test_node {
17}; 24};
18 25
19static struct rb_root root = RB_ROOT; 26static struct rb_root root = RB_ROOT;
20static struct test_node nodes[NODES]; 27static struct test_node *nodes = NULL;
21 28
22static struct rnd_state rnd; 29static struct rnd_state rnd;
23 30
@@ -95,7 +102,7 @@ static void erase_augmented(struct test_node *node, struct rb_root *root)
95static void init(void) 102static 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