Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05b84aec authored by Alexander Gordeev's avatar Alexander Gordeev Committed by Paul E. McKenney
Browse files

rcu: Limit rcu_capacity[] size to RCU_NUM_LVLS items



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: default avatarAlexander Gordeev <agordeev@redhat.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent a6d77081
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -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. */
+0 −2
Original line number Diff line number Diff line
@@ -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 */