]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Dec 2018 07:23:41 +0000 (08:23 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Dec 2018 07:23:41 +0000 (08:23 +0100)
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

queue-4.9/lib-interval_tree_test.c-allow-full-tree-search.patch [new file with mode: 0644]
queue-4.9/lib-interval_tree_test.c-make-test-options-module-parameters.patch [new file with mode: 0644]
queue-4.9/lib-rbtree-test-lower-default-params.patch [new file with mode: 0644]
queue-4.9/lib-rbtree_test.c-make-input-module-parameters.patch [new file with mode: 0644]
queue-4.9/pstore-convert-console-write-to-use-write_buf.patch
queue-4.9/series

diff --git a/queue-4.9/lib-interval_tree_test.c-allow-full-tree-search.patch b/queue-4.9/lib-interval_tree_test.c-allow-full-tree-search.patch
new file mode 100644 (file)
index 0000000..04e599e
--- /dev/null
@@ -0,0 +1,66 @@
+From c46ecce431ebe6b1a9551d1f530eb432dae5c39b Mon Sep 17 00:00:00 2001
+From: Davidlohr Bueso <dave@stgolabs.net>
+Date: Mon, 10 Jul 2017 15:51:52 -0700
+Subject: lib/interval_tree_test.c: allow full tree search
+
+From: Davidlohr Bueso <dave@stgolabs.net>
+
+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 <dbueso@suse.de>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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.9/lib-interval_tree_test.c-make-test-options-module-parameters.patch b/queue-4.9/lib-interval_tree_test.c-make-test-options-module-parameters.patch
new file mode 100644 (file)
index 0000000..9349378
--- /dev/null
@@ -0,0 +1,144 @@
+From a54dae0338b7f01eb0f9c7571fb9b74f791d1c6b Mon Sep 17 00:00:00 2001
+From: Davidlohr Bueso <dave@stgolabs.net>
+Date: Mon, 10 Jul 2017 15:51:46 -0700
+Subject: lib/interval_tree_test.c: make test options module parameters
+
+From: Davidlohr Bueso <dave@stgolabs.net>
+
+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 <dbueso@suse.de>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 <linux/module.h>
++#include <linux/moduleparam.h>
+ #include <linux/interval_tree.h>
+ #include <linux/random.h>
++#include <linux/slab.h>
+ #include <asm/timex.h>
+-#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.9/lib-rbtree-test-lower-default-params.patch b/queue-4.9/lib-rbtree-test-lower-default-params.patch
new file mode 100644 (file)
index 0000000..36a89e6
--- /dev/null
@@ -0,0 +1,55 @@
+From 0b548e33e6cb2bff240fdaf1783783be15c29080 Mon Sep 17 00:00:00 2001
+From: Davidlohr Bueso <dave@stgolabs.net>
+Date: Fri, 17 Nov 2017 15:28:27 -0800
+Subject: lib/rbtree-test: lower default params
+
+From: Davidlohr Bueso <dave@stgolabs.net>
+
+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 <dbueso@suse.de>
+Reported-by: Fengguang Wu <fengguang.wu@intel.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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.9/lib-rbtree_test.c-make-input-module-parameters.patch b/queue-4.9/lib-rbtree_test.c-make-input-module-parameters.patch
new file mode 100644 (file)
index 0000000..2b1fc60
--- /dev/null
@@ -0,0 +1,154 @@
+From 223f8911eace60c787f8767c25148b80ece9732a Mon Sep 17 00:00:00 2001
+From: Davidlohr Bueso <dave@stgolabs.net>
+Date: Fri, 8 Sep 2017 16:14:46 -0700
+Subject: lib/rbtree_test.c: make input module parameters
+
+From: Davidlohr Bueso <dave@stgolabs.net>
+
+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 <dbueso@suse.de>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 <linux/module.h>
++#include <linux/moduleparam.h>
+ #include <linux/rbtree_augmented.h>
+ #include <linux/random.h>
++#include <linux/slab.h>
+ #include <asm/timex.h>
+-#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 */
+ }
index ad81e8a0275036797ef406717811552dce1bca78..a4102a257f4735565d0b292ba646eec1aef657d6 100644 (file)
@@ -19,14 +19,12 @@ Signed-off-by: Namhyung Kim <namhyung@kernel.org>
 Signed-off-by: Kees Cook <keescook@chromium.org>
 Signed-off-by: Sasha Levin <sashal@kernel.org>
 ---
- 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 43033a3d66d5..2434bffbc6dd 100644
 --- a/fs/pstore/platform.c
 +++ b/fs/pstore/platform.c
-@@ -584,8 +584,8 @@ static void pstore_console_write(struct console *con, const char *s, unsigned c)
+@@ -584,8 +584,8 @@ static void pstore_console_write(struct
                } else {
                        spin_lock_irqsave(&psinfo->buf_lock, flags);
                }
@@ -37,6 +35,3 @@ index 43033a3d66d5..2434bffbc6dd 100644
                spin_unlock_irqrestore(&psinfo->buf_lock, flags);
                s += c;
                c = e - s;
--- 
-2.19.1
-
index ba3287be2b9a5cc536dee636786c449778c35922..79d8a83d7600eb38a3cbaa77a48b92624f97de6a 100644 (file)
@@ -48,3 +48,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