aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/rcu/tree.c
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2015-01-21 01:44:13 -0500
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2015-02-26 15:01:27 -0500
commit2723249a31a68ccc0ec8ac59a905d7f9430bf8f6 (patch)
tree795977fb8960723ead95a6614784ed209a92172a /kernel/rcu/tree.c
parentd3f3f3f25b1d4ee152f3f19a812c3a282da4c120 (diff)
rcu: Wire ->rda pointers at compile time
This commit wires up the rcu_state structures' ->rda pointers to the per-CPU rcu_data structures at compile time, thus ensuring that this linkage is present at early boot, in turn allowing posting of callbacks before rcu_init() is executed. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/rcu/tree.c')
-rw-r--r--kernel/rcu/tree.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index f8cdb92da10b..d2fa95e4a268 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -91,8 +91,10 @@ static const char *tp_##sname##_varname __used __tracepoint_string = sname##_var
91 91
92#define RCU_STATE_INITIALIZER(sname, sabbr, cr) \ 92#define RCU_STATE_INITIALIZER(sname, sabbr, cr) \
93DEFINE_RCU_TPS(sname) \ 93DEFINE_RCU_TPS(sname) \
94DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_data, sname##_data); \
94struct rcu_state sname##_state = { \ 95struct rcu_state sname##_state = { \
95 .level = { &sname##_state.node[0] }, \ 96 .level = { &sname##_state.node[0] }, \
97 .rda = &sname##_data, \
96 .call = cr, \ 98 .call = cr, \
97 .fqs_state = RCU_GP_IDLE, \ 99 .fqs_state = RCU_GP_IDLE, \
98 .gpnum = 0UL - 300UL, \ 100 .gpnum = 0UL - 300UL, \
@@ -104,8 +106,7 @@ struct rcu_state sname##_state = { \
104 .onoff_mutex = __MUTEX_INITIALIZER(sname##_state.onoff_mutex), \ 106 .onoff_mutex = __MUTEX_INITIALIZER(sname##_state.onoff_mutex), \
105 .name = RCU_STATE_NAME(sname), \ 107 .name = RCU_STATE_NAME(sname), \
106 .abbr = sabbr, \ 108 .abbr = sabbr, \
107}; \ 109}
108DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_data, sname##_data)
109 110
110RCU_STATE_INITIALIZER(rcu_sched, 's', call_rcu_sched); 111RCU_STATE_INITIALIZER(rcu_sched, 's', call_rcu_sched);
111RCU_STATE_INITIALIZER(rcu_bh, 'b', call_rcu_bh); 112RCU_STATE_INITIALIZER(rcu_bh, 'b', call_rcu_bh);
@@ -3843,7 +3844,6 @@ static void __init rcu_init_one(struct rcu_state *rsp,
3843 } 3844 }
3844 } 3845 }
3845 3846
3846 rsp->rda = rda;
3847 init_waitqueue_head(&rsp->gp_wq); 3847 init_waitqueue_head(&rsp->gp_wq);
3848 rnp = rsp->level[rcu_num_lvls - 1]; 3848 rnp = rsp->level[rcu_num_lvls - 1];
3849 for_each_possible_cpu(i) { 3849 for_each_possible_cpu(i) {