]> git.karo-electronics.de Git - linux-beck.git/commitdiff
rcu: Limit rcu_capacity[] size to RCU_NUM_LVLS items
authorAlexander Gordeev <agordeev@redhat.com>
Wed, 3 Jun 2015 06:18:28 +0000 (08:18 +0200)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 15 Jul 2015 21:45:18 +0000 (14:45 -0700)
Number of items in rcu_capacity[] array is defined by macro
MAX_RCU_LVLS. However, that array is never accessed beyond
RCU_NUM_LVLS index. Therefore, we can limit the array to
RCU_NUM_LVLS items and eliminate MAX_RCU_LVLS. As result,
in most cases the memory is conserved.

Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/tree.c
kernel/rcu/tree.h

index 2103beedb49fa844cdc2e141c5e41f056f70f268..2ec7b796f660dfd41095f07e208eed1f1c607f12 100644 (file)
@@ -3998,19 +3998,19 @@ static void __init rcu_init_one(struct rcu_state *rsp,
                "rcu_node_0",
                "rcu_node_1",
                "rcu_node_2",
-               "rcu_node_3" };  /* Match MAX_RCU_LVLS */
+               "rcu_node_3" };
        static const char * const fqs[] = {
                "rcu_node_fqs_0",
                "rcu_node_fqs_1",
                "rcu_node_fqs_2",
-               "rcu_node_fqs_3" };  /* Match MAX_RCU_LVLS */
+               "rcu_node_fqs_3" };
        static u8 fl_mask = 0x1;
        int cpustride = 1;
        int i;
        int j;
        struct rcu_node *rnp;
 
-       BUILD_BUG_ON(MAX_RCU_LVLS > ARRAY_SIZE(buf));  /* Fix buf[] init! */
+       BUILD_BUG_ON(RCU_NUM_LVLS > ARRAY_SIZE(buf));  /* Fix buf[] init! */
 
        /* Silence gcc 4.8 false positive about array index out of range. */
        if (rcu_num_lvls <= 0 || rcu_num_lvls > RCU_NUM_LVLS)
@@ -4082,7 +4082,7 @@ static void __init rcu_init_geometry(void)
 {
        ulong d;
        int i;
-       int rcu_capacity[MAX_RCU_LVLS];
+       int rcu_capacity[RCU_NUM_LVLS];
 
        /*
         * Initialize any unspecified boot parameters.
@@ -4122,14 +4122,14 @@ static void __init rcu_init_geometry(void)
         * with the given number of levels.
         */
        rcu_capacity[0] = rcu_fanout_leaf;
-       for (i = 1; i < MAX_RCU_LVLS; i++)
+       for (i = 1; i < RCU_NUM_LVLS; i++)
                rcu_capacity[i] = rcu_capacity[i - 1] * RCU_FANOUT;
 
        /*
         * The tree must be able to accommodate the configured number of CPUs.
         * If this limit is exceeded than we have a serious problem elsewhere.
         */
-       if (nr_cpu_ids > rcu_capacity[MAX_RCU_LVLS - 1])
+       if (nr_cpu_ids > rcu_capacity[RCU_NUM_LVLS - 1])
                panic("rcu_init_geometry: rcu_capacity[] is too small");
 
        /* Calculate the number of levels in the tree. */
index a6faae53ea8f6fa3df2c9f94d5202d8608863e18..d625e9ff0fafb57fe3ca2c3cfba892d5fbaeb9ab 100644 (file)
@@ -36,8 +36,6 @@
  * Of course, your mileage may vary.
  */
 
-#define MAX_RCU_LVLS 4
-
 #ifdef CONFIG_RCU_FANOUT
 #define RCU_FANOUT CONFIG_RCU_FANOUT
 #else /* #ifdef CONFIG_RCU_FANOUT */