Blame view
kernel/rcutree.h
15.2 KB
9f77da9f4 rcu: Move private... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/* * Read-Copy Update mechanism for mutual exclusion (tree-based version) * Internal non-public definitions. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Copyright IBM Corporation, 2008 * * Author: Ingo Molnar <mingo@elte.hu> * Paul E. McKenney <paulmck@linux.vnet.ibm.com> */ #include <linux/cache.h> #include <linux/spinlock.h> #include <linux/threads.h> #include <linux/cpumask.h> #include <linux/seqlock.h> /* * Define shape of hierarchy based on NR_CPUS and CONFIG_RCU_FANOUT. * In theory, it should be possible to add more levels straightforwardly. * In practice, this has not been tested, so there is probably some * bug somewhere. */ |
cf244dc01 rcu: Enable fourt... |
37 |
#define MAX_RCU_LVLS 4 |
9f77da9f4 rcu: Move private... |
38 39 40 |
#define RCU_FANOUT (CONFIG_RCU_FANOUT) #define RCU_FANOUT_SQ (RCU_FANOUT * RCU_FANOUT) #define RCU_FANOUT_CUBE (RCU_FANOUT_SQ * RCU_FANOUT) |
cf244dc01 rcu: Enable fourt... |
41 |
#define RCU_FANOUT_FOURTH (RCU_FANOUT_CUBE * RCU_FANOUT) |
9f77da9f4 rcu: Move private... |
42 43 44 45 46 47 48 |
#if NR_CPUS <= RCU_FANOUT # define NUM_RCU_LVLS 1 # define NUM_RCU_LVL_0 1 # define NUM_RCU_LVL_1 (NR_CPUS) # define NUM_RCU_LVL_2 0 # define NUM_RCU_LVL_3 0 |
cf244dc01 rcu: Enable fourt... |
49 |
# define NUM_RCU_LVL_4 0 |
9f77da9f4 rcu: Move private... |
50 51 52 |
#elif NR_CPUS <= RCU_FANOUT_SQ # define NUM_RCU_LVLS 2 # define NUM_RCU_LVL_0 1 |
fc2219d49 rcu: Clean up cod... |
53 |
# define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) |
9f77da9f4 rcu: Move private... |
54 55 |
# define NUM_RCU_LVL_2 (NR_CPUS) # define NUM_RCU_LVL_3 0 |
cf244dc01 rcu: Enable fourt... |
56 |
# define NUM_RCU_LVL_4 0 |
9f77da9f4 rcu: Move private... |
57 58 59 |
#elif NR_CPUS <= RCU_FANOUT_CUBE # define NUM_RCU_LVLS 3 # define NUM_RCU_LVL_0 1 |
fc2219d49 rcu: Clean up cod... |
60 61 |
# define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_SQ) # define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) |
9f77da9f4 rcu: Move private... |
62 |
# define NUM_RCU_LVL_3 NR_CPUS |
cf244dc01 rcu: Enable fourt... |
63 64 65 66 67 68 69 70 |
# define NUM_RCU_LVL_4 0 #elif NR_CPUS <= RCU_FANOUT_FOURTH # define NUM_RCU_LVLS 4 # define NUM_RCU_LVL_0 1 # define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_CUBE) # define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_SQ) # define NUM_RCU_LVL_3 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) # define NUM_RCU_LVL_4 NR_CPUS |
9f77da9f4 rcu: Move private... |
71 72 73 |
#else # error "CONFIG_RCU_FANOUT insufficient for NR_CPUS" #endif /* #if (NR_CPUS) <= RCU_FANOUT */ |
cf244dc01 rcu: Enable fourt... |
74 |
#define RCU_SUM (NUM_RCU_LVL_0 + NUM_RCU_LVL_1 + NUM_RCU_LVL_2 + NUM_RCU_LVL_3 + NUM_RCU_LVL_4) |
9f77da9f4 rcu: Move private... |
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
#define NUM_RCU_NODES (RCU_SUM - NR_CPUS) /* * Dynticks per-CPU state. */ struct rcu_dynticks { int dynticks_nesting; /* Track nesting level, sort of. */ int dynticks; /* Even value for dynticks-idle, else odd. */ int dynticks_nmi; /* Even value for either dynticks-idle or */ /* not in nmi handler, else odd. So this */ /* remains even for nmi from irq handler. */ }; /* * Definition for node within the RCU grace-period-detection hierarchy. */ struct rcu_node { |
1304afb22 rcu: Convert to r... |
92 |
raw_spinlock_t lock; /* Root rcu_node's lock protects some */ |
1eba8f843 rcu: Clean up cod... |
93 |
/* rcu_state fields as well as following. */ |
20133cfce rcu: Stop overflo... |
94 |
unsigned long gpnum; /* Current grace period for this node. */ |
868489660 rcu: Changes from... |
95 96 |
/* This will either be equal to or one */ /* behind the root rcu_node's gpnum. */ |
20133cfce rcu: Stop overflo... |
97 |
unsigned long completed; /* Last GP completed for this node. */ |
d09b62dfa rcu: Fix synchron... |
98 99 |
/* This will either be equal to or one */ /* behind the root rcu_node's gpnum. */ |
9f77da9f4 rcu: Move private... |
100 101 |
unsigned long qsmask; /* CPUs or groups that need to switch in */ /* order for current grace period to proceed.*/ |
1eba8f843 rcu: Clean up cod... |
102 103 104 105 |
/* In leaf rcu_node, each bit corresponds to */ /* an rcu_data structure, otherwise, each */ /* bit corresponds to a child rcu_node */ /* structure. */ |
d9a3da069 rcu: Add expedite... |
106 107 108 109 |
unsigned long expmask; /* Groups that have ->blocked_tasks[] */ /* elements that need to drain to allow the */ /* current expedited grace period to */ /* complete (only for TREE_PREEMPT_RCU). */ |
9f77da9f4 rcu: Move private... |
110 |
unsigned long qsmaskinit; |
d9a3da069 rcu: Add expedite... |
111 |
/* Per-GP initial value for qsmask & expmask. */ |
9f77da9f4 rcu: Move private... |
112 |
unsigned long grpmask; /* Mask to apply to parent qsmask. */ |
1eba8f843 rcu: Clean up cod... |
113 |
/* Only one bit will be set in this mask. */ |
9f77da9f4 rcu: Move private... |
114 115 116 117 118 |
int grplo; /* lowest-numbered CPU or group here. */ int grphi; /* highest-numbered CPU or group here. */ u8 grpnum; /* CPU/group number for next level up. */ u8 level; /* root is at level 0. */ struct rcu_node *parent; |
d9a3da069 rcu: Add expedite... |
119 |
struct list_head blocked_tasks[4]; |
f41d911f8 rcu: Merge preemp... |
120 |
/* Tasks blocked in RCU read-side critsect. */ |
1eba8f843 rcu: Clean up cod... |
121 122 123 |
/* Grace period number (->gpnum) x blocked */ /* by tasks on the (x & 0x1) element of the */ /* blocked_tasks[] array. */ |
9f77da9f4 rcu: Move private... |
124 |
} ____cacheline_internodealigned_in_smp; |
a0b6c9a78 rcu: Clean up cod... |
125 126 127 128 129 130 131 |
/* * Do a full breadth-first scan of the rcu_node structures for the * specified rcu_state structure. */ #define rcu_for_each_node_breadth_first(rsp, rnp) \ for ((rnp) = &(rsp)->node[0]; \ (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) |
d9a3da069 rcu: Add expedite... |
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
/* * Do a breadth-first scan of the non-leaf rcu_node structures for the * specified rcu_state structure. Note that if there is a singleton * rcu_node tree with but one rcu_node structure, this loop is a no-op. */ #define rcu_for_each_nonleaf_node_breadth_first(rsp, rnp) \ for ((rnp) = &(rsp)->node[0]; \ (rnp) < (rsp)->level[NUM_RCU_LVLS - 1]; (rnp)++) /* * Scan the leaves of the rcu_node hierarchy for the specified rcu_state * structure. Note that if there is a singleton rcu_node tree with but * one rcu_node structure, this loop -will- visit the rcu_node structure. * It is still a leaf node, even if it is also the root node. */ |
a0b6c9a78 rcu: Clean up cod... |
147 148 149 |
#define rcu_for_each_leaf_node(rsp, rnp) \ for ((rnp) = (rsp)->level[NUM_RCU_LVLS - 1]; \ (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) |
9f77da9f4 rcu: Move private... |
150 151 152 153 154 155 156 157 158 159 |
/* Index values for nxttail array in struct rcu_data. */ #define RCU_DONE_TAIL 0 /* Also RCU_WAIT head. */ #define RCU_WAIT_TAIL 1 /* Also RCU_NEXT_READY head. */ #define RCU_NEXT_READY_TAIL 2 /* Also RCU_NEXT head. */ #define RCU_NEXT_TAIL 3 #define RCU_NEXT_SIZE 4 /* Per-CPU data for read-copy update. */ struct rcu_data { /* 1) quiescent-state and grace-period handling : */ |
20133cfce rcu: Stop overflo... |
160 |
unsigned long completed; /* Track rsp->completed gp number */ |
9f77da9f4 rcu: Move private... |
161 |
/* in order to detect GP end. */ |
20133cfce rcu: Stop overflo... |
162 |
unsigned long gpnum; /* Highest gp number that this CPU */ |
9f77da9f4 rcu: Move private... |
163 |
/* is aware of having started. */ |
20133cfce rcu: Stop overflo... |
164 |
unsigned long passed_quiesc_completed; |
9f77da9f4 rcu: Move private... |
165 166 167 168 |
/* Value of completed at time of qs. */ bool passed_quiesc; /* User-mode/idle loop etc. */ bool qs_pending; /* Core waits for quiesc state. */ bool beenonline; /* CPU online at least once. */ |
f41d911f8 rcu: Merge preemp... |
169 |
bool preemptable; /* Preemptable RCU? */ |
9f77da9f4 rcu: Move private... |
170 171 172 173 174 175 176 177 178 |
struct rcu_node *mynode; /* This CPU's leaf of hierarchy */ unsigned long grpmask; /* Mask to apply to leaf qsmask. */ /* 2) batch handling */ /* * If nxtlist is not NULL, it is partitioned as follows. * Any of the partitions might be empty, in which case the * pointer to that partition will be equal to the pointer for * the following partition. When the list is empty, all of |
1eba8f843 rcu: Clean up cod... |
179 180 |
* the nxttail elements point to the ->nxtlist pointer itself, * which in that case is NULL. |
9f77da9f4 rcu: Move private... |
181 |
* |
9f77da9f4 rcu: Move private... |
182 183 184 185 186 |
* [nxtlist, *nxttail[RCU_DONE_TAIL]): * Entries that batch # <= ->completed * The grace period for these entries has completed, and * the other grace-period-completed entries may be moved * here temporarily in rcu_process_callbacks(). |
1eba8f843 rcu: Clean up cod... |
187 188 189 190 191 192 193 194 |
* [*nxttail[RCU_DONE_TAIL], *nxttail[RCU_WAIT_TAIL]): * Entries that batch # <= ->completed - 1: waiting for current GP * [*nxttail[RCU_WAIT_TAIL], *nxttail[RCU_NEXT_READY_TAIL]): * Entries known to have arrived before current GP ended * [*nxttail[RCU_NEXT_READY_TAIL], *nxttail[RCU_NEXT_TAIL]): * Entries that might have arrived after current GP ended * Note that the value of *nxttail[RCU_NEXT_TAIL] will * always be NULL, as this is the end of the list. |
9f77da9f4 rcu: Move private... |
195 196 197 |
*/ struct rcu_head *nxtlist; struct rcu_head **nxttail[RCU_NEXT_SIZE]; |
a71fca58b rcu: Fix whitespa... |
198 |
long qlen; /* # of queued callbacks */ |
37c72e56f rcu: Prevent RCU ... |
199 200 201 202 |
long qlen_last_fqs_check; /* qlen at last check for QS forcing */ unsigned long n_force_qs_snap; /* did other CPU force QS recently? */ |
9f77da9f4 rcu: Move private... |
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
long blimit; /* Upper limit on a processed batch */ #ifdef CONFIG_NO_HZ /* 3) dynticks interface. */ struct rcu_dynticks *dynticks; /* Shared per-CPU dynticks state. */ int dynticks_snap; /* Per-GP tracking for dynticks. */ int dynticks_nmi_snap; /* Per-GP tracking for dynticks_nmi. */ #endif /* #ifdef CONFIG_NO_HZ */ /* 4) reasons this CPU needed to be kicked by force_quiescent_state */ #ifdef CONFIG_NO_HZ unsigned long dynticks_fqs; /* Kicked due to dynticks idle. */ #endif /* #ifdef CONFIG_NO_HZ */ unsigned long offline_fqs; /* Kicked due to being offline. */ unsigned long resched_ipi; /* Sent a resched IPI. */ /* 5) __rcu_pending() statistics. */ |
20133cfce rcu: Stop overflo... |
220 221 222 223 224 225 226 227 |
unsigned long n_rcu_pending; /* rcu_pending() calls since boot. */ unsigned long n_rp_qs_pending; unsigned long n_rp_cb_ready; unsigned long n_rp_cpu_needs_gp; unsigned long n_rp_gp_completed; unsigned long n_rp_gp_started; unsigned long n_rp_need_fqs; unsigned long n_rp_need_nothing; |
9f77da9f4 rcu: Move private... |
228 229 230 231 232 |
int cpu; }; /* Values for signaled field in struct rcu_state. */ |
83f5b01ff rcu: Fix long-gra... |
233 234 235 |
#define RCU_GP_IDLE 0 /* No grace period in progress. */ #define RCU_GP_INIT 1 /* Grace period being initialized. */ #define RCU_SAVE_DYNTICK 2 /* Need to scan dyntick state. */ |
ee47eb9f4 rcu: Remove leg o... |
236 |
#define RCU_FORCE_QS 3 /* Need to force quiescent state. */ |
9f77da9f4 rcu: Move private... |
237 238 239 |
#ifdef CONFIG_NO_HZ #define RCU_SIGNAL_INIT RCU_SAVE_DYNTICK #else /* #ifdef CONFIG_NO_HZ */ |
ee47eb9f4 rcu: Remove leg o... |
240 |
#define RCU_SIGNAL_INIT RCU_FORCE_QS |
9f77da9f4 rcu: Move private... |
241 242 243 244 |
#endif /* #else #ifdef CONFIG_NO_HZ */ #define RCU_JIFFIES_TILL_FORCE_QS 3 /* for rsp->jiffies_force_qs */ #ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
007b09243 rcu: Increase RCU... |
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
#ifdef CONFIG_PROVE_RCU #define RCU_STALL_DELAY_DELTA (5 * HZ) #else #define RCU_STALL_DELAY_DELTA 0 #endif #define RCU_SECONDS_TILL_STALL_CHECK (10 * HZ + RCU_STALL_DELAY_DELTA) /* for rsp->jiffies_stall */ #define RCU_SECONDS_TILL_STALL_RECHECK (30 * HZ + RCU_STALL_DELAY_DELTA) /* for rsp->jiffies_stall */ #define RCU_STALL_RAT_DELAY 2 /* Allow other CPUs time */ /* to take at least one */ /* scheduling clock irq */ /* before ratting on them. */ |
9f77da9f4 rcu: Move private... |
260 261 |
#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ |
20133cfce rcu: Stop overflo... |
262 263 |
#define ULONG_CMP_GE(a, b) (ULONG_MAX / 2 >= (a) - (b)) #define ULONG_CMP_LT(a, b) (ULONG_MAX / 2 < (a) - (b)) |
9f77da9f4 rcu: Move private... |
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
/* * RCU global state, including node hierarchy. This hierarchy is * represented in "heap" form in a dense array. The root (first level) * of the hierarchy is in ->node[0] (referenced by ->level[0]), the second * level in ->node[1] through ->node[m] (->node[1] referenced by ->level[1]), * and the third level in ->node[m+1] and following (->node[m+1] referenced * by ->level[2]). The number of levels is determined by the number of * CPUs and by CONFIG_RCU_FANOUT. Small systems will have a "hierarchy" * consisting of a single rcu_node. */ struct rcu_state { struct rcu_node node[NUM_RCU_NODES]; /* Hierarchy. */ struct rcu_node *level[NUM_RCU_LVLS]; /* Hierarchy levels. */ u32 levelcnt[MAX_RCU_LVLS + 1]; /* # nodes in each level. */ u8 levelspread[NUM_RCU_LVLS]; /* kids/node in each level. */ struct rcu_data *rda[NR_CPUS]; /* array of rdp pointers. */ /* The following fields are guarded by the root rcu_node's lock. */ u8 signaled ____cacheline_internodealigned_in_smp; /* Force QS state. */ |
07079d535 rcu: Prohibit sta... |
285 286 |
u8 fqs_active; /* force_quiescent_state() */ /* is running. */ |
46a1e34ed rcu: Make force_q... |
287 288 289 290 291 |
u8 fqs_need_gp; /* A CPU was prevented from */ /* starting a new grace */ /* period because */ /* force_quiescent_state() */ /* was running. */ |
20133cfce rcu: Stop overflo... |
292 293 |
unsigned long gpnum; /* Current gp number. */ unsigned long completed; /* # of last completed gp. */ |
1eba8f843 rcu: Clean up cod... |
294 |
|
d9a3da069 rcu: Add expedite... |
295 |
/* End of fields guarded by root rcu_node's lock. */ |
1eba8f843 rcu: Clean up cod... |
296 |
|
1304afb22 rcu: Convert to r... |
297 |
raw_spinlock_t onofflock; /* exclude on/offline and */ |
e74f4c456 rcu: Make hot-unp... |
298 299 300 301 302 303 304 305 306 |
/* starting new GP. Also */ /* protects the following */ /* orphan_cbs fields. */ struct rcu_head *orphan_cbs_list; /* list of rcu_head structs */ /* orphaned by all CPUs in */ /* a given leaf rcu_node */ /* going offline. */ struct rcu_head **orphan_cbs_tail; /* And tail pointer. */ long orphan_qlen; /* Number of orphaned cbs. */ |
1304afb22 rcu: Convert to r... |
307 |
raw_spinlock_t fqslock; /* Only one task forcing */ |
9f77da9f4 rcu: Move private... |
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 |
/* quiescent states. */ unsigned long jiffies_force_qs; /* Time at which to invoke */ /* force_quiescent_state(). */ unsigned long n_force_qs; /* Number of calls to */ /* force_quiescent_state(). */ unsigned long n_force_qs_lh; /* ~Number of calls leaving */ /* due to lock unavailable. */ unsigned long n_force_qs_ngp; /* Number of calls leaving */ /* due to no GP active. */ #ifdef CONFIG_RCU_CPU_STALL_DETECTOR unsigned long gp_start; /* Time at which GP started, */ /* but in jiffies. */ unsigned long jiffies_stall; /* Time at which to check */ /* for CPU stalls. */ #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ |
9f77da9f4 rcu: Move private... |
323 |
}; |
d9a3da069 rcu: Add expedite... |
324 325 326 327 328 329 |
/* Return values for rcu_preempt_offline_tasks(). */ #define RCU_OFL_TASKS_NORM_GP 0x1 /* Tasks blocking normal */ /* GP were moved to root. */ #define RCU_OFL_TASKS_EXP_GP 0x2 /* Tasks blocking expedited */ /* GP were moved to root. */ |
6258c4fb5 kmemtrace, rcu: f... |
330 331 332 |
/* * RCU implementation internal declarations: */ |
d6714c22b rcu: Renamings to... |
333 334 |
extern struct rcu_state rcu_sched_state; DECLARE_PER_CPU(struct rcu_data, rcu_sched_data); |
6258c4fb5 kmemtrace, rcu: f... |
335 336 337 |
extern struct rcu_state rcu_bh_state; DECLARE_PER_CPU(struct rcu_data, rcu_bh_data); |
f41d911f8 rcu: Merge preemp... |
338 339 340 341 |
#ifdef CONFIG_TREE_PREEMPT_RCU extern struct rcu_state rcu_preempt_state; DECLARE_PER_CPU(struct rcu_data, rcu_preempt_data); #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
017c42613 rcu: Fix sparse w... |
342 |
#ifndef RCU_TREE_NONCORE |
9f77da9f4 rcu: Move private... |
343 |
|
9b2619aff rcu: Clean up cod... |
344 |
/* Forward declarations for rcutree_plugin.h */ |
dbe01350f rcu: Remove inlin... |
345 |
static void rcu_bootup_announce(void); |
9b2619aff rcu: Clean up cod... |
346 347 348 |
long rcu_batches_completed(void); static void rcu_preempt_note_context_switch(int cpu); static int rcu_preempted_readers(struct rcu_node *rnp); |
b668c9cf3 rcu: Fix grace-pe... |
349 |
#ifdef CONFIG_HOTPLUG_CPU |
d3f6bad39 rcu: Rename "quie... |
350 351 |
static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags); |
b668c9cf3 rcu: Fix grace-pe... |
352 |
#endif /* #ifdef CONFIG_HOTPLUG_CPU */ |
9b2619aff rcu: Clean up cod... |
353 |
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
1ed509a22 rcu: Add RCU_CPU_... |
354 |
static void rcu_print_detail_task_stall(struct rcu_state *rsp); |
9b2619aff rcu: Clean up cod... |
355 356 357 358 |
static void rcu_print_task_stall(struct rcu_node *rnp); #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp); #ifdef CONFIG_HOTPLUG_CPU |
237c80c5c rcu: Fix TREE_PRE... |
359 360 361 |
static int rcu_preempt_offline_tasks(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp); |
9b2619aff rcu: Clean up cod... |
362 363 364 365 366 |
static void rcu_preempt_offline_cpu(int cpu); #endif /* #ifdef CONFIG_HOTPLUG_CPU */ static void rcu_preempt_check_callbacks(int cpu); static void rcu_preempt_process_callbacks(void); void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)); |
d9a3da069 rcu: Add expedite... |
367 368 369 |
#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU) static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp); #endif /* #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU) */ |
9b2619aff rcu: Clean up cod... |
370 371 372 |
static int rcu_preempt_pending(int cpu); static int rcu_preempt_needs_cpu(int cpu); static void __cpuinit rcu_preempt_init_percpu_data(int cpu); |
e74f4c456 rcu: Make hot-unp... |
373 |
static void rcu_preempt_send_cbs_to_orphanage(void); |
9b2619aff rcu: Clean up cod... |
374 |
static void __init __rcu_init_preempt(void); |
a47cd880b rcu: Fix accelera... |
375 |
static void rcu_needs_cpu_flush(void); |
9b2619aff rcu: Clean up cod... |
376 |
|
017c42613 rcu: Fix sparse w... |
377 |
#endif /* #ifndef RCU_TREE_NONCORE */ |