]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
patches for 4.9
authorSasha Levin <sashal@kernel.org>
Tue, 18 Dec 2018 00:34:53 +0000 (19:34 -0500)
committerSasha Levin <sashal@kernel.org>
Tue, 18 Dec 2018 00:34:53 +0000 (19:34 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
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-allow-users-to-limit-scope-.patch [new file with mode: 0644]
queue-4.9/lib-interval_tree_test.c-make-test-options-module-pa.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/series
queue-4.9/timer-debug-change-proc-timer_list-from-0444-to-0400.patch [new file with mode: 0644]

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..4215765
--- /dev/null
@@ -0,0 +1,67 @@
+From eba7bc83831fe6eec151094100d2db6bab366687 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
+
+[ Upstream commit c46ecce431ebe6b1a9551d1f530eb432dae5c39b ]
+
+...  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>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/interval_tree_test.c | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+diff --git a/lib/interval_tree_test.c b/lib/interval_tree_test.c
+index 1093f0496d5e..409383463879 100644
+--- a/lib/interval_tree_test.c
++++ b/lib/interval_tree_test.c
+@@ -15,6 +15,7 @@ __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");
++__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;
+-- 
+2.19.1
+
diff --git a/queue-4.9/lib-interval_tree_test.c-allow-users-to-limit-scope-.patch b/queue-4.9/lib-interval_tree_test.c-allow-users-to-limit-scope-.patch
new file mode 100644 (file)
index 0000000..10e516b
--- /dev/null
@@ -0,0 +1,65 @@
+From 4297f423184943789688abfcf8848238e1a44428 Mon Sep 17 00:00:00 2001
+From: Davidlohr Bueso <dave@stgolabs.net>
+Date: Mon, 10 Jul 2017 15:51:49 -0700
+Subject: lib/interval_tree_test.c: allow users to limit scope of endpoint
+
+[ Upstream commit a8ec14d4f6aa8e245efacc992c8ee6ea0464ce2a ]
+
+Add a 'max_endpoint' parameter such that users may easily limit the size
+of the intervals that are randomly generated.
+
+Link: http://lkml.kernel.org/r/20170518174936.20265-4-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>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/interval_tree_test.c | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+diff --git a/lib/interval_tree_test.c b/lib/interval_tree_test.c
+index bababcf7ffdd..222c8010bda0 100644
+--- a/lib/interval_tree_test.c
++++ b/lib/interval_tree_test.c
+@@ -17,6 +17,7 @@ __param(int, nsearches, 100, "Number of searches to the interval 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");
++__param(uint, max_endpoint, ~0, "Largest value for the interval's endpoint");
+ static struct rb_root root = RB_ROOT;
+ static struct interval_tree_node *nodes = NULL;
+@@ -41,18 +42,20 @@ static void init(void)
+       int i;
+       for (i = 0; i < nnodes; i++) {
+-              u32 a = prandom_u32_state(&rnd);
+-              u32 b = prandom_u32_state(&rnd);
+-              if (a <= b) {
+-                      nodes[i].start = a;
+-                      nodes[i].last = b;
+-              } else {
+-                      nodes[i].start = b;
+-                      nodes[i].last = a;
+-              }
++              u32 b = (prandom_u32_state(&rnd) >> 4) % max_endpoint;
++              u32 a = (prandom_u32_state(&rnd) >> 4) % b;
++
++              nodes[i].start = a;
++              nodes[i].last = b;
+       }
++
++      /*
++       * Limit the search scope to what the user defined.
++       * Otherwise we are merely measuring empty walks,
++       * which is pointless.
++       */
+       for (i = 0; i < nsearches; i++)
+-              queries[i] = prandom_u32_state(&rnd);
++              queries[i] = (prandom_u32_state(&rnd) >> 4) % max_endpoint;
+ }
+ static int interval_tree_test_init(void)
+-- 
+2.19.1
+
diff --git a/queue-4.9/lib-interval_tree_test.c-make-test-options-module-pa.patch b/queue-4.9/lib-interval_tree_test.c-make-test-options-module-pa.patch
new file mode 100644 (file)
index 0000000..6647691
--- /dev/null
@@ -0,0 +1,145 @@
+From cb648537a4c9809996ed6bf876409ec948249826 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
+
+[ Upstream commit a54dae0338b7f01eb0f9c7571fb9b74f791d1c6b ]
+
+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>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/interval_tree_test.c | 57 ++++++++++++++++++++++++++++------------
+ 1 file changed, 40 insertions(+), 17 deletions(-)
+
+diff --git a/lib/interval_tree_test.c b/lib/interval_tree_test.c
+index 245900b98c8e..1093f0496d5e 100644
+--- 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_root *root)
+ 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 */
+ }
+-- 
+2.19.1
+
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..7ed6739
--- /dev/null
@@ -0,0 +1,58 @@
+From f99b19636a29b908b844a254f20d83783cb8cc44 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
+
+[ Upstream commit 0b548e33e6cb2bff240fdaf1783783be15c29080 ]
+
+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>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/interval_tree_test.c | 4 ++--
+ lib/rbtree_test.c        | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/lib/interval_tree_test.c b/lib/interval_tree_test.c
+index 409383463879..bababcf7ffdd 100644
+--- 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");
+diff --git a/lib/rbtree_test.c b/lib/rbtree_test.c
+index e83331aa1b7f..afedd3770562 100644
+--- 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 {
+-- 
+2.19.1
+
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..c3f91eb
--- /dev/null
@@ -0,0 +1,155 @@
+From c44aee2f21aa2ef37cde6fc7d7eccb1738739734 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
+
+[ Upstream commit 223f8911eace60c787f8767c25148b80ece9732a ]
+
+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>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/rbtree_test.c | 55 +++++++++++++++++++++++++++++------------------
+ 1 file 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 @@
+ #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_node *node, struct rb_root *root)
+ 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 */
+ }
+-- 
+2.19.1
+
index 388ff9b105975165c0c7791f7b1698a75fb99cdd..8f047b18e9d8832b2900c75327fb1e70ec3b42fa 100644 (file)
@@ -1 +1,7 @@
 signal-introduce-compat_sigminstksz-for-use-in-compat_sys_sigaltstack.patch
+lib-interval_tree_test.c-make-test-options-module-pa.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
+lib-interval_tree_test.c-allow-users-to-limit-scope-.patch
+timer-debug-change-proc-timer_list-from-0444-to-0400.patch
diff --git a/queue-4.9/timer-debug-change-proc-timer_list-from-0444-to-0400.patch b/queue-4.9/timer-debug-change-proc-timer_list-from-0444-to-0400.patch
new file mode 100644 (file)
index 0000000..ecf8f16
--- /dev/null
@@ -0,0 +1,36 @@
+From d7d378a1d5503bf4d6d2cccd5cc7b6b7b7e6d469 Mon Sep 17 00:00:00 2001
+From: Ingo Molnar <mingo@kernel.org>
+Date: Mon, 13 Nov 2017 07:15:41 +0100
+Subject: timer/debug: Change /proc/timer_list from 0444 to 0400
+
+[ Upstream commit 8e7df2b5b7f245c9bd11064712db5cb69044a362 ]
+
+While it uses %pK, there's still few reasons to read this file
+as non-root.
+
+Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
+Acked-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: linux-kernel@vger.kernel.org
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/time/timer_list.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c
+index ef4f16e81283..1407ed20ea93 100644
+--- a/kernel/time/timer_list.c
++++ b/kernel/time/timer_list.c
+@@ -399,7 +399,7 @@ static int __init init_timer_list_procfs(void)
+ {
+       struct proc_dir_entry *pe;
+-      pe = proc_create("timer_list", 0444, NULL, &timer_list_fops);
++      pe = proc_create("timer_list", 0400, NULL, &timer_list_fops);
+       if (!pe)
+               return -ENOMEM;
+       return 0;
+-- 
+2.19.1
+