From 704fa540eb79f4e024c5f6917a0042ff20768f3b Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 14 Dec 2018 08:23:25 +0100 Subject: [PATCH] 4.4-stable patches added patches: lib-interval_tree_test.c-allow-full-tree-search.patch lib-interval_tree_test.c-make-test-options-module-parameters.patch lib-rbtree-test-lower-default-params.patch lib-rbtree_test.c-make-input-module-parameters.patch --- ...l_tree_test.c-allow-full-tree-search.patch | 66 ++++++++ ...-make-test-options-module-parameters.patch | 144 ++++++++++++++++ ...lib-rbtree-test-lower-default-params.patch | 55 +++++++ ..._test.c-make-input-module-parameters.patch | 154 ++++++++++++++++++ queue-4.4/series | 4 + 5 files changed, 423 insertions(+) create mode 100644 queue-4.4/lib-interval_tree_test.c-allow-full-tree-search.patch create mode 100644 queue-4.4/lib-interval_tree_test.c-make-test-options-module-parameters.patch create mode 100644 queue-4.4/lib-rbtree-test-lower-default-params.patch create mode 100644 queue-4.4/lib-rbtree_test.c-make-input-module-parameters.patch diff --git a/queue-4.4/lib-interval_tree_test.c-allow-full-tree-search.patch b/queue-4.4/lib-interval_tree_test.c-allow-full-tree-search.patch new file mode 100644 index 00000000000..04e599ec8d1 --- /dev/null +++ b/queue-4.4/lib-interval_tree_test.c-allow-full-tree-search.patch @@ -0,0 +1,66 @@ +From c46ecce431ebe6b1a9551d1f530eb432dae5c39b Mon Sep 17 00:00:00 2001 +From: Davidlohr Bueso +Date: Mon, 10 Jul 2017 15:51:52 -0700 +Subject: lib/interval_tree_test.c: allow full tree search + +From: Davidlohr Bueso + +commit c46ecce431ebe6b1a9551d1f530eb432dae5c39b upstream. + +... such that a user can specify visiting all the nodes in the tree +(intersects with the world). This is a nice opposite from the very +basic default query which is a single point. + +Link: http://lkml.kernel.org/r/20170518174936.20265-5-dave@stgolabs.net +Signed-off-by: Davidlohr Bueso +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Cc: Guenter Roeck +Signed-off-by: Greg Kroah-Hartman + +--- + lib/interval_tree_test.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +--- a/lib/interval_tree_test.c ++++ b/lib/interval_tree_test.c +@@ -15,6 +15,7 @@ __param(int, perf_loops, 100000, "Number + + __param(int, nsearches, 100, "Number of searches to the interval tree"); + __param(int, search_loops, 10000, "Number of iterations searching the tree"); ++__param(bool, search_all, false, "Searches will iterate all nodes in the tree"); + + + static struct rb_root root = RB_ROOT; +@@ -24,13 +25,13 @@ static u32 *queries = NULL; + static struct rnd_state rnd; + + static inline unsigned long +-search(unsigned long query, struct rb_root *root) ++search(struct rb_root *root, unsigned long start, unsigned long last) + { + struct interval_tree_node *node; + unsigned long results = 0; + +- for (node = interval_tree_iter_first(root, query, query); node; +- node = interval_tree_iter_next(node, query, query)) ++ for (node = interval_tree_iter_first(root, start, last); node; ++ node = interval_tree_iter_next(node, start, last)) + results++; + return results; + } +@@ -99,8 +100,12 @@ static int interval_tree_test_init(void) + + results = 0; + for (i = 0; i < search_loops; i++) +- for (j = 0; j < nsearches; j++) +- results += search(queries[j], &root); ++ for (j = 0; j < nsearches; j++) { ++ unsigned long start = search_all ? 0 : queries[j]; ++ unsigned long last = search_all ? max_endpoint : queries[j]; ++ ++ results += search(&root, start, last); ++ } + + time2 = get_cycles(); + time = time2 - time1; diff --git a/queue-4.4/lib-interval_tree_test.c-make-test-options-module-parameters.patch b/queue-4.4/lib-interval_tree_test.c-make-test-options-module-parameters.patch new file mode 100644 index 00000000000..9349378f250 --- /dev/null +++ b/queue-4.4/lib-interval_tree_test.c-make-test-options-module-parameters.patch @@ -0,0 +1,144 @@ +From a54dae0338b7f01eb0f9c7571fb9b74f791d1c6b Mon Sep 17 00:00:00 2001 +From: Davidlohr Bueso +Date: Mon, 10 Jul 2017 15:51:46 -0700 +Subject: lib/interval_tree_test.c: make test options module parameters + +From: Davidlohr Bueso + +commit a54dae0338b7f01eb0f9c7571fb9b74f791d1c6b upstream. + +Allows for more flexible debugging. + +Link: http://lkml.kernel.org/r/20170518174936.20265-3-dave@stgolabs.net +Signed-off-by: Davidlohr Bueso +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Cc: Guenter Roeck +Signed-off-by: Greg Kroah-Hartman + +--- + lib/interval_tree_test.c | 57 ++++++++++++++++++++++++++++++++--------------- + 1 file changed, 40 insertions(+), 17 deletions(-) + +--- a/lib/interval_tree_test.c ++++ b/lib/interval_tree_test.c +@@ -1,16 +1,25 @@ + #include ++#include + #include + #include ++#include + #include + +-#define NODES 100 +-#define PERF_LOOPS 100000 +-#define SEARCHES 100 +-#define SEARCH_LOOPS 10000 ++#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 interval tree"); ++__param(int, perf_loops, 100000, "Number of iterations modifying the tree"); ++ ++__param(int, nsearches, 100, "Number of searches to the interval tree"); ++__param(int, search_loops, 10000, "Number of iterations searching the tree"); ++ + + static struct rb_root root = RB_ROOT; +-static struct interval_tree_node nodes[NODES]; +-static u32 queries[SEARCHES]; ++static struct interval_tree_node *nodes = NULL; ++static u32 *queries = NULL; + + static struct rnd_state rnd; + +@@ -29,7 +38,8 @@ search(unsigned long query, struct rb_ro + static void init(void) + { + int i; +- for (i = 0; i < NODES; i++) { ++ ++ for (i = 0; i < nnodes; i++) { + u32 a = prandom_u32_state(&rnd); + u32 b = prandom_u32_state(&rnd); + if (a <= b) { +@@ -40,7 +50,7 @@ static void init(void) + nodes[i].last = a; + } + } +- for (i = 0; i < SEARCHES; i++) ++ for (i = 0; i < nsearches; i++) + queries[i] = prandom_u32_state(&rnd); + } + +@@ -50,6 +60,16 @@ static int interval_tree_test_init(void) + unsigned long results; + cycles_t time1, time2, time; + ++ nodes = kmalloc(nnodes * sizeof(struct interval_tree_node), GFP_KERNEL); ++ if (!nodes) ++ return -ENOMEM; ++ ++ queries = kmalloc(nsearches * sizeof(int), GFP_KERNEL); ++ if (!queries) { ++ kfree(nodes); ++ return -ENOMEM; ++ } ++ + printk(KERN_ALERT "interval tree insert/remove"); + + prandom_seed_state(&rnd, 3141592653589793238ULL); +@@ -57,39 +77,42 @@ static int interval_tree_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++) + interval_tree_insert(nodes + j, &root); +- for (j = 0; j < NODES; j++) ++ for (j = 0; j < nnodes; j++) + interval_tree_remove(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); + + printk(KERN_ALERT "interval tree search"); + +- for (j = 0; j < NODES; j++) ++ for (j = 0; j < nnodes; j++) + interval_tree_insert(nodes + j, &root); + + time1 = get_cycles(); + + results = 0; +- for (i = 0; i < SEARCH_LOOPS; i++) +- for (j = 0; j < SEARCHES; j++) ++ for (i = 0; i < search_loops; i++) ++ for (j = 0; j < nsearches; j++) + results += search(queries[j], &root); + + time2 = get_cycles(); + time = time2 - time1; + +- time = div_u64(time, SEARCH_LOOPS); +- results = div_u64(results, SEARCH_LOOPS); ++ time = div_u64(time, search_loops); ++ results = div_u64(results, search_loops); + printk(" -> %llu cycles (%lu results)\n", + (unsigned long long)time, results); + ++ kfree(queries); ++ kfree(nodes); ++ + return -EAGAIN; /* Fail will directly unload the module */ + } + diff --git a/queue-4.4/lib-rbtree-test-lower-default-params.patch b/queue-4.4/lib-rbtree-test-lower-default-params.patch new file mode 100644 index 00000000000..36a89e626e5 --- /dev/null +++ b/queue-4.4/lib-rbtree-test-lower-default-params.patch @@ -0,0 +1,55 @@ +From 0b548e33e6cb2bff240fdaf1783783be15c29080 Mon Sep 17 00:00:00 2001 +From: Davidlohr Bueso +Date: Fri, 17 Nov 2017 15:28:27 -0800 +Subject: lib/rbtree-test: lower default params + +From: Davidlohr Bueso + +commit 0b548e33e6cb2bff240fdaf1783783be15c29080 upstream. + +Fengguang reported soft lockups while running the rbtree and interval +tree test modules. The logic for these tests all occur in init phase, +and we currently are pounding with the default values for number of +nodes and number of iterations of each test. Reduce the latter by two +orders of magnitude. This does not influence the value of the tests in +that one thousand times by default is enough to get the picture. + +Link: http://lkml.kernel.org/r/20171109161715.xai2dtwqw2frhkcm@linux-n805 +Signed-off-by: Davidlohr Bueso +Reported-by: Fengguang Wu +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Cc: Guenter Roeck +Signed-off-by: Greg Kroah-Hartman + +--- + lib/interval_tree_test.c | 4 ++-- + lib/rbtree_test.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +--- a/lib/interval_tree_test.c ++++ b/lib/interval_tree_test.c +@@ -11,10 +11,10 @@ + MODULE_PARM_DESC(name, msg); + + __param(int, nnodes, 100, "Number of nodes in the interval tree"); +-__param(int, perf_loops, 100000, "Number of iterations modifying the tree"); ++__param(int, perf_loops, 1000, "Number of iterations modifying the tree"); + + __param(int, nsearches, 100, "Number of searches to the interval tree"); +-__param(int, search_loops, 10000, "Number of iterations searching the tree"); ++__param(int, search_loops, 1000, "Number of iterations searching the tree"); + __param(bool, search_all, false, "Searches will iterate all nodes in the tree"); + + +--- a/lib/rbtree_test.c ++++ b/lib/rbtree_test.c +@@ -11,7 +11,7 @@ + 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, perf_loops, 1000, "Number of iterations modifying the rb-tree"); + __param(int, check_loops, 100, "Number of iterations modifying and verifying the rb-tree"); + + struct test_node { diff --git a/queue-4.4/lib-rbtree_test.c-make-input-module-parameters.patch b/queue-4.4/lib-rbtree_test.c-make-input-module-parameters.patch new file mode 100644 index 00000000000..2b1fc60139b --- /dev/null +++ b/queue-4.4/lib-rbtree_test.c-make-input-module-parameters.patch @@ -0,0 +1,154 @@ +From 223f8911eace60c787f8767c25148b80ece9732a Mon Sep 17 00:00:00 2001 +From: Davidlohr Bueso +Date: Fri, 8 Sep 2017 16:14:46 -0700 +Subject: lib/rbtree_test.c: make input module parameters + +From: Davidlohr Bueso + +commit 223f8911eace60c787f8767c25148b80ece9732a upstream. + +Allows for more flexible debugging. + +Link: http://lkml.kernel.org/r/20170719014603.19029-5-dave@stgolabs.net +Signed-off-by: Davidlohr Bueso +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Cc: Guenter Roeck +Signed-off-by: Greg Kroah-Hartman + +--- + lib/rbtree_test.c | 55 +++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 34 insertions(+), 21 deletions(-) + +--- a/lib/rbtree_test.c ++++ b/lib/rbtree_test.c +@@ -1,11 +1,18 @@ + #include ++#include + #include + #include ++#include + #include + +-#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_ + 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 */ + } + diff --git a/queue-4.4/series b/queue-4.4/series index 77d973c2c40..c2d8c485523 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -81,3 +81,7 @@ mm-replace-__access_remote_vm-write-parameter-with-gup_flags.patch mm-replace-access_remote_vm-write-parameter-with-gup_flags.patch proc-don-t-use-foll_force-for-reading-cmdline-and-environment.patch proc-do-not-access-cmdline-nor-environ-from-file-backed-areas.patch +lib-interval_tree_test.c-make-test-options-module-parameters.patch +lib-interval_tree_test.c-allow-full-tree-search.patch +lib-rbtree_test.c-make-input-module-parameters.patch +lib-rbtree-test-lower-default-params.patch -- 2.47.3