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

Commit 2b34c43c authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

srcu: Move rcu_init_levelspread() to rcu_tree_node.h



This commit moves the rcu_init_levelspread() function from
kernel/rcu/tree.c to kernel/rcu/rcu.h so that SRCU can access it.  This is
another step towards enabling SRCU to create its own combining tree.
This commit is code-movement only, give or take knock-on adjustments.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent f2425b4e
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -96,7 +96,4 @@
# error "CONFIG_RCU_FANOUT insufficient for NR_CPUS"
#endif /* #if (NR_CPUS) <= RCU_FANOUT_1 */

extern int rcu_num_lvls;
extern int rcu_num_nodes;

#endif /* __LINUX_RCU_NODE_TREE_H */
+36 −0
Original line number Diff line number Diff line
@@ -190,4 +190,40 @@ void rcu_test_sync_prims(void);
 */
extern void resched_cpu(int cpu);

#if defined(SRCU) || !defined(TINY_RCU)

#include <linux/rcu_node_tree.h>

extern int rcu_num_lvls;
extern int rcu_num_nodes;
static bool rcu_fanout_exact;
static int rcu_fanout_leaf;

/*
 * Compute the per-level fanout, either using the exact fanout specified
 * or balancing the tree, depending on the rcu_fanout_exact boot parameter.
 */
static inline void rcu_init_levelspread(int *levelspread, const int *levelcnt)
{
	int i;

	if (rcu_fanout_exact) {
		levelspread[rcu_num_lvls - 1] = rcu_fanout_leaf;
		for (i = rcu_num_lvls - 2; i >= 0; i--)
			levelspread[i] = RCU_FANOUT;
	} else {
		int ccur;
		int cprv;

		cprv = nr_cpu_ids;
		for (i = rcu_num_lvls - 1; i >= 0; i--) {
			ccur = levelcnt[i];
			levelspread[i] = (cprv + ccur - 1) / ccur;
			cprv = ccur;
		}
	}
}

#endif /* #if defined(SRCU) || !defined(TINY_RCU) */

#endif /* __LINUX_RCU_H */
+1 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
#include <linux/delay.h>
#include <linux/srcu.h>

#include <linux/rcu_node_tree.h>
#include "rcu.h"

static int init_srcu_struct_fields(struct srcu_struct *sp)
+0 −25
Original line number Diff line number Diff line
@@ -3951,31 +3951,6 @@ void rcu_scheduler_starting(void)
	rcu_test_sync_prims();
}

/*
 * Compute the per-level fanout, either using the exact fanout specified
 * or balancing the tree, depending on the rcu_fanout_exact boot parameter.
 */
static void __init rcu_init_levelspread(int *levelspread, const int *levelcnt)
{
	int i;

	if (rcu_fanout_exact) {
		levelspread[rcu_num_lvls - 1] = rcu_fanout_leaf;
		for (i = rcu_num_lvls - 2; i >= 0; i--)
			levelspread[i] = RCU_FANOUT;
	} else {
		int ccur;
		int cprv;

		cprv = nr_cpu_ids;
		for (i = rcu_num_lvls - 1; i >= 0; i--) {
			ccur = levelcnt[i];
			levelspread[i] = (cprv + ccur - 1) / ccur;
			cprv = ccur;
		}
	}
}

/*
 * Helper function for rcu_init() that initializes one rcu_state structure.
 */
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@

#define RCU_TREE_NONCORE
#include "tree.h"
#include "rcu.h"

static int r_open(struct inode *inode, struct file *file,
					const struct seq_operations *op)