From: Greg Kroah-Hartman Date: Fri, 14 Dec 2018 07:22:38 +0000 (+0100) Subject: 3.18-stable patches X-Git-Tag: v4.19.10~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8f0b7f5280949d14dca285a68f6f4c148fffec22;p=thirdparty%2Fkernel%2Fstable-queue.git 3.18-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 --- diff --git a/queue-3.18/ipv4-ipv6-netfilter-adjust-the-frag-mem-limit-when-truesize-changes.patch b/queue-3.18/ipv4-ipv6-netfilter-adjust-the-frag-mem-limit-when-truesize-changes.patch index ec3ef7606d6..4cc352770bc 100644 --- a/queue-3.18/ipv4-ipv6-netfilter-adjust-the-frag-mem-limit-when-truesize-changes.patch +++ b/queue-3.18/ipv4-ipv6-netfilter-adjust-the-frag-mem-limit-when-truesize-changes.patch @@ -69,7 +69,7 @@ Signed-off-by: Greg Kroah-Hartman + delta += head->truesize; + if (delta) -+ add_frag_mem_limit(qp->q.net, delta); ++ add_frag_mem_limit(&qp->q, delta); + /* If the first fragment is fragmented itself, we split * it to two chunks: the first with data and paged part diff --git a/queue-3.18/lib-interval_tree_test.c-allow-full-tree-search.patch b/queue-3.18/lib-interval_tree_test.c-allow-full-tree-search.patch new file mode 100644 index 00000000000..04e599ec8d1 --- /dev/null +++ b/queue-3.18/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-3.18/lib-interval_tree_test.c-make-test-options-module-parameters.patch b/queue-3.18/lib-interval_tree_test.c-make-test-options-module-parameters.patch new file mode 100644 index 00000000000..9349378f250 --- /dev/null +++ b/queue-3.18/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-3.18/lib-rbtree-test-lower-default-params.patch b/queue-3.18/lib-rbtree-test-lower-default-params.patch new file mode 100644 index 00000000000..36a89e626e5 --- /dev/null +++ b/queue-3.18/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-3.18/lib-rbtree_test.c-make-input-module-parameters.patch b/queue-3.18/lib-rbtree_test.c-make-input-module-parameters.patch new file mode 100644 index 00000000000..2b1fc60139b --- /dev/null +++ b/queue-3.18/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-3.18/pstore-convert-console-write-to-use-write_buf.patch b/queue-3.18/pstore-convert-console-write-to-use-write_buf.patch index ca958d809be..39561d3a19f 100644 --- a/queue-3.18/pstore-convert-console-write-to-use-write_buf.patch +++ b/queue-3.18/pstore-convert-console-write-to-use-write_buf.patch @@ -19,14 +19,12 @@ Signed-off-by: Namhyung Kim Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- - fs/pstore/platform.c | 4 ++-- + fs/pstore/platform.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c -index 0a9b72cdfeca..75fc2b70fcdb 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c -@@ -371,8 +371,8 @@ static void pstore_console_write(struct console *con, const char *s, unsigned c) +@@ -371,8 +371,8 @@ static void pstore_console_write(struct } else { spin_lock_irqsave(&psinfo->buf_lock, flags); } @@ -37,6 +35,3 @@ index 0a9b72cdfeca..75fc2b70fcdb 100644 spin_unlock_irqrestore(&psinfo->buf_lock, flags); s += c; c = e - s; --- -2.19.1 - diff --git a/queue-3.18/series b/queue-3.18/series index c384ff81496..403a573ede8 100644 --- a/queue-3.18/series +++ b/queue-3.18/series @@ -28,3 +28,7 @@ hfsplus-do-not-free-node-before-using.patch debugobjects-avoid-recursive-calls-with-kmemleak.patch ocfs2-fix-potential-use-after-free.patch pstore-convert-console-write-to-use-write_buf.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