From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@kernel.org, laijs@cn.fujitsu.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
josh@joshtriplett.org, tglx@linutronix.de, peterz@infradead.org,
rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com,
dvhart@linux.intel.com, fweisbec@gmail.com, oleg@redhat.com,
bobby.prani@gmail.com, Alexander Gordeev <agordeev@redhat.com>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: [PATCH tip/core/rcu 11/24] rcu: Limit count of static data to the number of RCU levels
Date: Tue, 12 May 2015 15:30:41 -0700 [thread overview]
Message-ID: <1431469854-3826-11-git-send-email-paulmck@linux.vnet.ibm.com> (raw)
In-Reply-To: <1431469854-3826-1-git-send-email-paulmck@linux.vnet.ibm.com>
From: Alexander Gordeev <agordeev@redhat.com>
Although a number of RCU levels may be less than the current
maximum of four, some static data associated with each level
are allocated for all four levels. As result, the extra data
never get accessed and just wast memory. This update limits
count of allocated items to the number of used RCU levels.
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---
kernel/rcu/tree.c | 21 ++++-----------------
kernel/rcu/tree.h | 12 ++++++++++++
2 files changed, 16 insertions(+), 17 deletions(-)
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 9ae53b08a2fd..56eeb01d581e 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -117,13 +117,8 @@ LIST_HEAD(rcu_struct_flavors);
static int rcu_fanout_leaf = CONFIG_RCU_FANOUT_LEAF;
module_param(rcu_fanout_leaf, int, 0444);
int rcu_num_lvls __read_mostly = RCU_NUM_LVLS;
-static int num_rcu_lvl[] = { /* Number of rcu_nodes at specified level. */
- NUM_RCU_LVL_0,
- NUM_RCU_LVL_1,
- NUM_RCU_LVL_2,
- NUM_RCU_LVL_3,
- NUM_RCU_LVL_4,
-};
+/* Number of rcu_nodes at specified level. */
+static int num_rcu_lvl[] = NUM_RCU_LVL_INIT;
int rcu_num_nodes __read_mostly = NUM_RCU_NODES; /* Total # rcu_nodes in use. */
/*
@@ -3964,16 +3959,8 @@ static void __init rcu_init_levelspread(int *levelspread, const int *levelcnt)
static void __init rcu_init_one(struct rcu_state *rsp,
struct rcu_data __percpu *rda)
{
- static const char * const buf[] = {
- "rcu_node_0",
- "rcu_node_1",
- "rcu_node_2",
- "rcu_node_3" };
- static const char * const fqs[] = {
- "rcu_node_fqs_0",
- "rcu_node_fqs_1",
- "rcu_node_fqs_2",
- "rcu_node_fqs_3" };
+ static const char * const buf[] = RCU_NODE_NAME_INIT;
+ static const char * const fqs[] = RCU_FQS_NAME_INIT;
static u8 fl_mask = 0x1;
int levelcnt[RCU_NUM_LVLS]; /* # nodes in each level. */
diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h
index 740100a17f72..c1ac06ad6239 100644
--- a/kernel/rcu/tree.h
+++ b/kernel/rcu/tree.h
@@ -47,6 +47,9 @@
# define NUM_RCU_LVL_2 0
# define NUM_RCU_LVL_3 0
# define NUM_RCU_LVL_4 0
+# define NUM_RCU_LVL_INIT { NUM_RCU_LVL_0 }
+# define RCU_NODE_NAME_INIT { "rcu_node_0" }
+# define RCU_FQS_NAME_INIT { "rcu_node_fqs_0" }
#elif NR_CPUS <= RCU_FANOUT_2
# define RCU_NUM_LVLS 2
# define NUM_RCU_LVL_0 1
@@ -54,6 +57,9 @@
# define NUM_RCU_LVL_2 (NR_CPUS)
# define NUM_RCU_LVL_3 0
# define NUM_RCU_LVL_4 0
+# define NUM_RCU_LVL_INIT { NUM_RCU_LVL_0, NUM_RCU_LVL_1 }
+# define RCU_NODE_NAME_INIT { "rcu_node_0", "rcu_node_1" }
+# define RCU_FQS_NAME_INIT { "rcu_node_fqs_0", "rcu_node_fqs_1" }
#elif NR_CPUS <= RCU_FANOUT_3
# define RCU_NUM_LVLS 3
# define NUM_RCU_LVL_0 1
@@ -61,6 +67,9 @@
# define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_1)
# define NUM_RCU_LVL_3 (NR_CPUS)
# define NUM_RCU_LVL_4 0
+# define NUM_RCU_LVL_INIT { NUM_RCU_LVL_0, NUM_RCU_LVL_1, NUM_RCU_LVL_2 }
+# define RCU_NODE_NAME_INIT { "rcu_node_0", "rcu_node_1", "rcu_node_2" }
+# define RCU_FQS_NAME_INIT { "rcu_node_fqs_0", "rcu_node_fqs_1", "rcu_node_fqs_2" }
#elif NR_CPUS <= RCU_FANOUT_4
# define RCU_NUM_LVLS 4
# define NUM_RCU_LVL_0 1
@@ -68,6 +77,9 @@
# define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_2)
# define NUM_RCU_LVL_3 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_1)
# define NUM_RCU_LVL_4 (NR_CPUS)
+# define NUM_RCU_LVL_INIT { NUM_RCU_LVL_0, NUM_RCU_LVL_1, NUM_RCU_LVL_2, NUM_RCU_LVL_3 }
+# define RCU_NODE_NAME_INIT { "rcu_node_0", "rcu_node_1", "rcu_node_2", "rcu_node_3" }
+# define RCU_FQS_NAME_INIT { "rcu_node_fqs_0", "rcu_node_fqs_1", "rcu_node_fqs_2", "rcu_node_fqs_3" }
#else
# error "CONFIG_RCU_FANOUT insufficient for NR_CPUS"
#endif /* #if (NR_CPUS) <= RCU_FANOUT_1 */
--
1.8.1.5
next prev parent reply other threads:[~2015-05-12 22:34 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-12 22:30 [PATCH tip/core/rcu 0/24] Initialization/Kconfig updates for 4.2 Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 01/24] rcu: Control grace-period delays directly from value Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 02/24] rcu: Modulate grace-period slow init to normalize delay Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 03/24] rcu: Shut up spurious gcc uninitialized-variable warning Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 04/24] rcu: Panic if RCU tree can not accommodate all CPUs Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 05/24] rcu: Remove superfluous local variable in rcu_init_geometry() Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 06/24] rcu: Cleanup rcu_init_geometry() code and arithmetics Paul E. McKenney
2015-05-13 3:22 ` Steven Rostedt
2015-05-13 13:20 ` Paul E. McKenney
2015-05-14 21:15 ` Alexander Gordeev
2015-05-12 22:30 ` [PATCH tip/core/rcu 07/24] rcu: Simplify rcu_init_geometry() capacity arithmetics Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 08/24] rcu: Limit rcu_state::levelcnt[] to RCU_NUM_LVLS items Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 09/24] rcu: Limit rcu_capacity[] size " Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 10/24] rcu: Remove unnecessary fields from rcu_state structure Paul E. McKenney
2015-05-12 22:30 ` Paul E. McKenney [this message]
2015-05-12 22:30 ` [PATCH tip/core/rcu 12/24] rcu: Simplify arithmetic to calculate number of RCU nodes Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 13/24] rcu: Provide diagnostic option to slow down grace-period scans Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 14/24] rcu: Directly drive TASKS_RCU from Kconfig Paul E. McKenney
2015-05-13 13:31 ` Steven Rostedt
2015-05-13 17:14 ` Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 15/24] rcu: Directly drive RCU_USER_QS " Paul E. McKenney
2015-05-13 0:37 ` Frederic Weisbecker
2015-05-13 17:45 ` Paul E. McKenney
2015-05-14 0:27 ` Frederic Weisbecker
2015-05-14 21:12 ` Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 16/24] rcu: Convert CONFIG_RCU_FANOUT_EXACT to boot parameter Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 17/24] rcu: Enable diagnostic dump of rcu_node combining tree Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 18/24] rcu: Create RCU_EXPERT Kconfig and hide booleans behind it Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 19/24] rcu: Break dependency of RCU_FANOUT_LEAF on RCU_FANOUT Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 20/24] rcu: Make RCU able to tolerate undefined CONFIG_RCU_FANOUT Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 21/24] rcu: Make RCU able to tolerate undefined CONFIG_RCU_FANOUT_LEAF Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 22/24] rcu: Make RCU able to tolerate undefined CONFIG_RCU_KTHREAD_PRIO Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 23/24] rcu: Remove prompt for RCU implementation Paul E. McKenney
2015-05-12 22:30 ` [PATCH tip/core/rcu 24/24] rcu: Conditionally compile RCU's eqs warnings Paul E. McKenney
2015-05-13 13:46 ` Steven Rostedt
2015-05-13 15:06 ` Paul E. McKenney
2015-06-29 9:39 ` Geert Uytterhoeven
2015-06-29 20:55 ` Paul E. McKenney
2015-06-29 20:58 ` Geert Uytterhoeven
2015-06-30 16:57 ` Paul E. McKenney
2015-05-13 2:59 ` [PATCH tip/core/rcu 01/24] rcu: Control grace-period delays directly from value Steven Rostedt
2015-05-13 17:15 ` Paul E. McKenney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1431469854-3826-11-git-send-email-paulmck@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=agordeev@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=bobby.prani@gmail.com \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=dvhart@linux.intel.com \
--cc=edumazet@google.com \
--cc=fweisbec@gmail.com \
--cc=josh@joshtriplett.org \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®