lib/rbtree: add random seed

Current test use pseudo rand function with fixed seed, which means the
test data is the same pattern each time.

Add random seed parameter to randomize the test.

Link: https://lkml.kernel.org/r/20250310074938.26756-4-richard.weiyang@gmail.com
Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Michel Lespinasse <michel@lespinasse.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Wei Yang 2025-03-10 07:49:34 +00:00 committed by Andrew Morton
parent 3e1d58cd5d
commit 16b1936ae6
6 changed files with 15 additions and 4 deletions

View file

@ -92,6 +92,7 @@ typedef unsigned char unchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef unsigned long long ullong;
#ifndef __BIT_TYPES_DEFINED__
#define __BIT_TYPES_DEFINED__

View file

@ -19,6 +19,7 @@ __param(int, search_loops, 1000, "Number of iterations searching the tree");
__param(bool, search_all, false, "Searches will iterate all nodes in the tree");
__param(uint, max_endpoint, ~0, "Largest value for the interval's endpoint");
__param(ullong, seed, 3141592653589793238ULL, "Random seed");
static struct rb_root_cached root = RB_ROOT_CACHED;
static struct interval_tree_node *nodes = NULL;
@ -137,7 +138,7 @@ static int interval_tree_test_init(void)
return -ENOMEM;
}
prandom_seed_state(&rnd, 3141592653589793238ULL);
prandom_seed_state(&rnd, seed);
basic_check();
search_check();

View file

@ -14,6 +14,7 @@
__param(int, nnodes, 100, "Number of nodes in the rb-tree");
__param(int, perf_loops, 1000, "Number of iterations modifying the rb-tree");
__param(int, check_loops, 100, "Number of iterations modifying and verifying the rb-tree");
__param(ullong, seed, 3141592653589793238ULL, "Random seed");
struct test_node {
u32 key;
@ -402,7 +403,7 @@ static int __init rbtree_test_init(void)
if (!nodes)
return -ENOMEM;
prandom_seed_state(&rnd, 3141592653589793238ULL);
prandom_seed_state(&rnd, seed);
basic_check();
augmented_check();

View file

@ -42,6 +42,8 @@ typedef __s16 s16;
typedef __u8 u8;
typedef __s8 s8;
typedef unsigned long long ullong;
#ifdef __CHECKER__
#define __bitwise __attribute__((bitwise))
#else

View file

@ -18,6 +18,7 @@ int usage(void)
fprintf(stderr, " -s: Number of iterations searching the tree\n");
fprintf(stderr, " -a: Searches will iterate all nodes in the tree\n");
fprintf(stderr, " -m: Largest value for the interval's endpoint\n");
fprintf(stderr, " -r: Random seed\n");
exit(-1);
}
@ -31,7 +32,7 @@ int main(int argc, char **argv)
{
int opt;
while ((opt = getopt(argc, argv, "n:p:q:s:am:")) != -1) {
while ((opt = getopt(argc, argv, "n:p:q:s:am:r:")) != -1) {
if (opt == 'n')
nnodes = strtoul(optarg, NULL, 0);
else if (opt == 'p')
@ -44,6 +45,8 @@ int main(int argc, char **argv)
search_all = true;
else if (opt == 'm')
max_endpoint = strtoul(optarg, NULL, 0);
else if (opt == 'r')
seed = strtoul(optarg, NULL, 0);
else
usage();
}

View file

@ -16,6 +16,7 @@ int usage(void)
fprintf(stderr, " -n: Number of nodes in the rb-tree\n");
fprintf(stderr, " -p: Number of iterations modifying the rb-tree\n");
fprintf(stderr, " -c: Number of iterations modifying and verifying the rb-tree\n");
fprintf(stderr, " -r: Random seed\n");
exit(-1);
}
@ -29,13 +30,15 @@ int main(int argc, char **argv)
{
int opt;
while ((opt = getopt(argc, argv, "n:p:c:")) != -1) {
while ((opt = getopt(argc, argv, "n:p:c:r:")) != -1) {
if (opt == 'n')
nnodes = strtoul(optarg, NULL, 0);
else if (opt == 'p')
perf_loops = strtoul(optarg, NULL, 0);
else if (opt == 'c')
check_loops = strtoul(optarg, NULL, 0);
else if (opt == 'r')
seed = strtoul(optarg, NULL, 0);
else
usage();
}