RCU changes for v3.2
Subsystems (6)
Linus,
Please pull the latest core-rcu-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core-rcu-for-linus
Thanks,
Ingo
------------------>
Andi Kleen (1):
rcu: Fix mismatched variable in rcutree_trace.c
Eric Dumazet (2):
rcu: Use kthread_create_on_node()
rcu: Make rcu_assign_pointer() unconditionally insert a memory barrier
Michal Hocko (1):
rcu: Not necessary to pass rcu_read_lock_held() to rcu_dereference_protected()
Mike Galbraith (1):
rcu: Wire up RCU_BOOST_PRIO for rcutree
Paul E. McKenney (38):
rcu: Update documentation to flag RCU_BOOST trace information
rcu: Restore checks for blocking in RCU read-side critical sections
rcu: Move rcu_head definition to types.h
rcu: Update rcutorture documentation
rcu: Abstract common code for RCU grace-period-wait primitives
rcu: Catch rcutorture up to new RCU API additions
rcu: Fix RCU's NMI documentation
rcu: Drive configuration directly from SMP and PREEMPT
rcu: Don't destroy rcu_torture_boost() callback until it is done
rcu: Add event-tracing for RCU callback invocation
rcu: Event-trace markers for computing RCU CPU utilization
rcu: Put names into TINY_RCU structures under RCU_TRACE
rcu: Add RCU type to callback-invocation tracing
rcu: Update comments to reflect softirqs vs. kthreads
rcu: Move RCU_BOOST declarations to allow compiler checking
rcu: Add event-trace markers to TREE_RCU kthreads
rcu: Make TINY_RCU also use softirq for RCU_BOOST=n
rcu: Add grace-period, quiescent-state, and call_rcu trace events
rcu: Simplify quiescent-state accounting
rcu: Update documentation for additional RCU lockdep functions
rcu: Remove unused and redundant interfaces
rcu: Allow rcutorture's stat_interval parameter to be changed at runtime
rcu: Document interpretation of RCU-lockdep splats
rcu: Eliminate in_irq() checks in rcu_enter_nohz()
rcu: Make rcu_implicit_dynticks_qs() locals be correct size
rcu: Improve rcu_assign_pointer() and RCU_INIT_POINTER() documentation
rcu: Move __rcu_read_unlock()'s barrier() within if-statement
rcu: Dump local stack if cannot dump all CPUs' stacks
rcu: Prevent early boot set_need_resched() from __rcu_pending()
rcu: Simplify unboosting checks
rcu: Prohibit grace periods during early boot
rcu: Suppress NMI backtraces when stall ends before dump
rcu: Avoid having just-onlined CPU resched itself when RCU is idle
rcu: Permit rt_mutex_unlock() with irqs disabled
rcu: Make rcu_torture_fqs() exit loops at end of test
rcu: Make rcu_torture_boost() exit loops at end of test
rcu: Remove rcu_needs_cpu_flush() to avoid false quiescent states
rcu: Move propagation of ->completed from rcu_start_gp() to rcu_report_qs_rsp()
Shaohua Li (1):
rcu: Avoid unnecessary self-wakeup of per-CPU kthreads
Shi, Alex (1):
nohz: Remove nohz_cpu_mask
Documentation/RCU/NMI-RCU.txt | 2 +- Documentation/RCU/lockdep-splat.txt | 110 +++++++++ Documentation/RCU/lockdep.txt | 34 ++- Documentation/RCU/torture.txt | 137 ++++++++--- Documentation/RCU/trace.txt | 38 ++-- include/linux/lockdep.h | 2 +- include/linux/rcupdate.h | 300 +++++++++++------------- include/linux/rcutiny.h | 20 ++- include/linux/rcutree.h | 2 + include/linux/sched.h | 4 - include/linux/types.h | 10 + include/trace/events/rcu.h | 459 +++++++++++++++++++++++++++++++++++ init/Kconfig | 6 +- kernel/lockdep.c | 84 ++++--- kernel/pid.c | 4 +- kernel/rcu.h | 85 +++++++ kernel/rcupdate.c | 26 ++- kernel/rcutiny.c | 117 ++------- kernel/rcutiny_plugin.h | 134 +++++++---- kernel/rcutorture.c | 77 +++---- kernel/rcutree.c | 290 ++++++++++++++-------- kernel/rcutree.h | 17 +- kernel/rcutree_plugin.h | 150 +++++++----- kernel/rcutree_trace.c | 13 +- kernel/rtmutex.c | 8 + kernel/sched.c | 13 +- kernel/time/tick-sched.c | 6 - 27 files changed, 1489 insertions(+), 659 deletions(-) create mode 100644 Documentation/RCU/lockdep-splat.txt create mode 100644 include/trace/events/rcu.h create mode 100644 kernel/rcu.h
Documentation/RCU/NMI-RCU.txt +1 -1
@@ -95,7 +95,7 @@ not to return until all ongoing NMI handlers exit. It is therefore safe to free up the handler's data as soon as synchronize_sched() returns. Important note: for this to work, the architecture in question must -invoke irq_enter() and irq_exit() on NMI entry and exit, respectively. +invoke nmi_enter() and nmi_exit() on NMI entry and exit, respectively. Answer to Quick Quiz
Documentation/RCU/lockdep-splat.txt new file +110 -0
110 lines not on this page · raw message
Documentation/RCU/lockdep.txt +25 -9
@@ -32,9 +32,27 @@ checking of rcu_dereference() primitives: srcu_dereference(p, sp): Check for SRCU read-side critical section. rcu_dereference_check(p, c): - Use explicit check expression "c". This is useful in - code that is invoked by both readers and updaters. - rcu_dereference_raw(p) + Use explicit check expression "c" along with + rcu_read_lock_held(). This is useful in code that is + invoked by both RCU readers and updaters. + rcu_dereference_bh_check(p, c): + Use explicit check expression "c" along with + rcu_read_lock_bh_held(). This is useful in code that + is invoked by both RCU-bh readers and updaters. + rcu_dereference_sched_check(p, c): + Use explicit check expression "c" along with + rcu_read_lock_sched_held(). This is useful in code that + is invoked by both RCU-sched readers and updaters. + srcu_dereference_check(p, c): + Use explicit check expression "c" along with + srcu_read_lock_held()(). This is useful in code that + is invoked by both SRCU readers and updaters. + rcu_dereference_index_check(p, c): + Use explicit check expression "c", but the caller + must supply one of the rcu_read_lock_held() functions. + This is useful in code that uses RCU-protected arrays + that is invoked by both RCU readers and updaters. + rcu_dereference_raw(p): Don't check. (Use sparingly, if at all.) rcu_dereference_protected(p, c): Use explicit check expression "c", and omit all barriers
@@ -48,13 +66,11 @@ checking of rcu_dereference() primitives: value of the pointer itself, for example, against NULL. The rcu_dereference_check() check expression can be any boolean -expression, but would normally include one of the rcu_read_lock_held() -family of functions and a lockdep expression. However, any boolean -expression can be used. For a moderately ornate example, consider -the following: +expression, but would normally include a lockdep expression. However, +any boolean expression can be used. For a moderately ornate example, +consider the following: file = rcu_dereference_check(fdt->fd[fd], - rcu_read_lock_held() || lockdep_is_held(&files->file_lock) || atomic_read(&files->count) == 1);
@@ -62,7 +78,7 @@ This expression picks up the pointer "fdt->fd[fd]" in an RCU-safe manner, and, if CONFIG_PROVE_RCU is configured, verifies that this expression is used in: -1. An RCU read-side critical section, or +1. An RCU read-side critical section (implicit), or 2. with files->file_lock held, or 3. on an unshared files_struct.
Documentation/RCU/torture.txt +102 -35
192 lines not on this page · raw message
Documentation/RCU/trace.txt +21 -17
@@ -33,23 +33,23 @@ rcu/rcuboost: The output of "cat rcu/rcudata" looks as follows: rcu_sched: - 0 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=545/1/0 df=50 of=0 ri=0 ql=163 qs=NRW. kt=0/W/0 ktl=ebc3 b=10 ci=153737 co=0 ca=0 - 1 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=967/1/0 df=58 of=0 ri=0 ql=634 qs=NRW. kt=0/W/1 ktl=58c b=10 ci=191037 co=0 ca=0 - 2 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=1081/1/0 df=175 of=0 ri=0 ql=74 qs=N.W. kt=0/W/2 ktl=da94 b=10 ci=75991 co=0 ca=0 - 3 c=20942 g=20943 pq=1 pqc=20942 qp=1 dt=1846/0/0 df=404 of=0 ri=0 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=72261 co=0 ca=0 - 4 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=369/1/0 df=83 of=0 ri=0 ql=48 qs=N.W. kt=0/W/4 ktl=e0e7 b=10 ci=128365 co=0 ca=0 - 5 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=381/1/0 df=64 of=0 ri=0 ql=169 qs=NRW. kt=0/W/5 ktl=fb2f b=10 ci=164360 co=0 ca=0 - 6 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=1037/1/0 df=183 of=0 ri=0 ql=62 qs=N.W. kt=0/W/6 ktl=d2ad b=10 ci=65663 co=0 ca=0 - 7 c=20897 g=20897 pq=1 pqc=20896 qp=0 dt=1572/0/0 df=382 of=0 ri=0 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=75006 co=0 ca=0 + 0 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=545/1/0 df=50 of=0 ri=0 ql=163 qs=NRW. kt=0/W/0 ktl=ebc3 b=10 ci=153737 co=0 ca=0 + 1 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=967/1/0 df=58 of=0 ri=0 ql=634 qs=NRW. kt=0/W/1 ktl=58c b=10 ci=191037 co=0 ca=0 + 2 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=1081/1/0 df=175 of=0 ri=0 ql=74 qs=N.W. kt=0/W/2 ktl=da94 b=10 ci=75991 co=0 ca=0 + 3 c=20942 g=20943 pq=1 pgp=20942 qp=1 dt=1846/0/0 df=404 of=0 ri=0 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=72261 co=0 ca=0 + 4 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=369/1/0 df=83 of=0 ri=0 ql=48 qs=N.W. kt=0/W/4 ktl=e0e7 b=10 ci=128365 co=0 ca=0 + 5 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=381/1/0 df=64 of=0 ri=0 ql=169 qs=NRW. kt=0/W/5 ktl=fb2f b=10 ci=164360 co=0 ca=0 + 6 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=1037/1/0 df=183 of=0 ri=0 ql=62 qs=N.W. kt=0/W/6 ktl=d2ad b=10 ci=65663 co=0 ca=0 + 7 c=20897 g=20897 pq=1 pgp=20896 qp=0 dt=1572/0/0 df=382 of=0 ri=0 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=75006 co=0 ca=0 rcu_bh: - 0 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=545/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/0 ktl=ebc3 b=10 ci=0 co=0 ca=0 - 1 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=967/1/0 df=3 of=0 ri=1 ql=0 qs=.... kt=0/W/1 ktl=58c b=10 ci=151 co=0 ca=0 - 2 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1081/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/2 ktl=da94 b=10 ci=0 co=0 ca=0 - 3 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1846/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=0 co=0 ca=0 - 4 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=369/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/4 ktl=e0e7 b=10 ci=0 co=0 ca=0 - 5 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=381/1/0 df=4 of=0 ri=1 ql=0 qs=.... kt=0/W/5 ktl=fb2f b=10 ci=0 co=0 ca=0 - 6 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1037/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/6 ktl=d2ad b=10 ci=0 co=0 ca=0 - 7 c=1474 g=1474 pq=1 pqc=1473 qp=0 dt=1572/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=0 co=0 ca=0 + 0 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=545/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/0 ktl=ebc3 b=10 ci=0 co=0 ca=0 + 1 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=967/1/0 df=3 of=0 ri=1 ql=0 qs=.... kt=0/W/1 ktl=58c b=10 ci=151 co=0 ca=0 + 2 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=1081/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/2 ktl=da94 b=10 ci=0 co=0 ca=0 + 3 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=1846/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=0 co=0 ca=0 + 4 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=369/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/4 ktl=e0e7 b=10 ci=0 co=0 ca=0 + 5 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=381/1/0 df=4 of=0 ri=1 ql=0 qs=.... kt=0/W/5 ktl=fb2f b=10 ci=0 co=0 ca=0 + 6 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=1037/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/6 ktl=d2ad b=10 ci=0 co=0 ca=0 + 7 c=1474 g=1474 pq=1 pgp=1473 qp=0 dt=1572/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=0 co=0 ca=0 The first section lists the rcu_data structures for rcu_sched, the second for rcu_bh. Note that CONFIG_TREE_PREEMPT_RCU kernels will have an
@@ -84,7 +84,7 @@ o "pq" indicates that this CPU has passed through a quiescent state CPU has not yet reported that fact, (2) some other CPU has not yet reported for this grace period, or (3) both. -o "pqc" indicates which grace period the last-observed quiescent +o "pgp" indicates which grace period the last-observed quiescent state for this CPU corresponds to. This is important for handling the race between CPU 0 reporting an extended dynticks-idle quiescent state for CPU 1 and CPU 1 suddenly waking up and
@@ -184,10 +184,14 @@ o "kt" is the per-CPU kernel-thread state. The digit preceding The number after the final slash is the CPU that the kthread is actually running on. + This field is displayed only for CONFIG_RCU_BOOST kernels. + o "ktl" is the low-order 16 bits (in hexadecimal) of the count of the number of times that this CPU's per-CPU kthread has gone through its loop servicing invoke_rcu_cpu_kthread() requests. + This field is displayed only for CONFIG_RCU_BOOST kernels. + o "b" is the batch limit for this CPU. If more than this number of RCU callbacks is ready to invoke, then the remainder will be deferred.
include/linux/lockdep.h +1 -1
@@ -548,7 +548,7 @@ do { \#endif #ifdef CONFIG_PROVE_RCU -extern void lockdep_rcu_dereference (const char *file,const int line); +void lockdep_rcu_suspicious (const char *file,const int line,const char *s);#endif #endif /* __LINUX_LOCKDEP_H */
include/linux/rcupdate.h +137 -163
403 lines not on this page · raw message
include/linux/rcutiny.h +19 -1
@@ -27,9 +27,23 @@#include <linux/cache.h> +#ifdef CONFIG_RCU_BOOST static inline void rcu_init (void ) { } +#else /* #ifdef CONFIG_RCU_BOOST */ +void rcu_init (void ); +#endif /* #else #ifdef CONFIG_RCU_BOOST */ + +static inline void rcu_barrier_bh (void ) +{ +wait_rcu_gp (call_rcu_bh); +} + +static inline void rcu_barrier_sched (void ) +{ +wait_rcu_gp (call_rcu_sched); +}#ifdef CONFIG_TINY_RCU
@@ -45,9 +59,13 @@ static inline void rcu_barrier(void)#else /* #ifdef CONFIG_TINY_RCU */ -void rcu_barrier (void );void synchronize_rcu_expedited (void ); +static inline void rcu_barrier (void ) +{ +wait_rcu_gp (call_rcu); +} +#endif /* #else #ifdef CONFIG_TINY_RCU */ static inline void synchronize_rcu_bh (void )
include/linux/rcutree.h +2 -0
@@ -67,6 +67,8 @@ static inline void synchronize_rcu_bh_expedited(void) }extern void rcu_barrier (void ); +extern void rcu_barrier_bh (void ); +extern void rcu_barrier_sched (void );extern unsigned long rcutorture_testseq;extern unsigned long rcutorture_vernum;
include/linux/sched.h +0 -4
@@ -270,7 +270,6 @@ extern void init_idle_bootup_task(struct task_struct *idle);extern int runqueue_is_locked (int cpu); -extern cpumask_var_t nohz_cpu_mask;#if defined(CONFIG_SMP ) && defined(CONFIG_NO_HZ )extern void select_nohz_load_balancer (int stop_tick);extern int get_nohz_timer_target (void );
@@ -1260,9 +1259,6 @@ struct task_struct {#ifdef CONFIG_PREEMPT_RCU int rcu_read_lock_nesting;char rcu_read_unlock_special; -#if defined(CONFIG_RCU_BOOST ) && defined(CONFIG_TREE_PREEMPT_RCU ) -int rcu_boosted; -#endif /* #if defined(CONFIG_RCU_BOOST) && defined(CONFIG_TREE_PREEMPT_RCU) */ struct list_head rcu_node_entry;#endif /* #ifdef CONFIG_PREEMPT_RCU */ #ifdef CONFIG_TREE_PREEMPT_RCU
include/linux/types.h +10 -0
@@ -238,6 +238,16 @@ struct ustat {char f_fpack[6 ]; }; +/** +* struct rcu_head - callback structure for use with RCU +* @next: next update requests in a list +* @func: actual update function to call after the grace period. +*/ +struct rcu_head { +struct rcu_head *next; +void (*func)(struct rcu_head *head); +}; +#endif /* __KERNEL__ */ #endif /* __ASSEMBLY__ */ #endif /* _LINUX_TYPES_H */
include/trace/events/rcu.h new file +459 -0
459 lines not on this page · raw message
init/Kconfig +3 -3
@@ -391,7 +391,7 @@ config TREE_RCU config TREE_PREEMPT_RCU bool "Preemptible tree-based hierarchical RCU" - depends on PREEMPT + depends on PREEMPT && SMP help This option selects the RCU implementation that is designed for very large SMP systems with hundreds or
@@ -401,7 +401,7 @@ config TREE_PREEMPT_RCU config TINY_RCU bool "UP-only small-memory-footprint RCU" - depends on !SMP + depends on !PREEMPT && !SMP help This option selects the RCU implementation that is designed for UP systems from which real-time response
@@ -410,7 +410,7 @@ config TINY_RCU config TINY_PREEMPT_RCU bool "Preemptible UP-only small-memory-footprint RCU" - depends on !SMP && PREEMPT + depends on PREEMPT && !SMP help This option selects the RCU implementation that is designed for real-time UP systems. This option greatly reduces the
kernel/lockdep.c +47 -37
165 lines not on this page · raw message
kernel/pid.c +3 -1
@@ -418,7 +418,9 @@ EXPORT_SYMBOL(pid_task);*/ struct task_struct *find_task_by_pid_ns (pid_t nr,struct pid_namespace *ns) { -rcu_lockdep_assert (rcu_read_lock_held ()); +rcu_lockdep_assert (rcu_read_lock_held (), +"find_task_by_pid_ns() needs rcu_read_lock()" +" protection" );return pid_task (find_pid_ns (nr, ns),PIDTYPE_PID ); }
kernel/rcu.h new file +85 -0
85 lines not on this page · raw message
kernel/rcupdate.c +25 -1
@@ -46,6 +46,11 @@#include <linux/module.h> #include <linux/hardirq.h> +#define CREATE_TRACE_POINTS +#include <trace/events/rcu.h> + +#include "rcu.h" +#ifdef CONFIG_DEBUG_LOCK_ALLOC static struct lock_class_key rcu_lock_key; struct lockdep_map rcu_lock_map =
@@ -94,11 +99,16 @@ EXPORT_SYMBOL_GPL(rcu_read_lock_bh_held);#endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ +struct rcu_synchronize { +struct rcu_head head; +struct completion completion; +}; +/* * Awaken the corresponding synchronize_rcu() instance now that a * grace period has elapsed. */ -void wakeme_after_rcu (struct rcu_head *head) +static void wakeme_after_rcu (struct rcu_head *head) {struct rcu_synchronize *rcu;
@@ -106,6 +116,20 @@ void wakeme_after_rcu(struct rcu_head *head)complete (&rcu->completion); } +void wait_rcu_gp (call_rcu_func_t crf) +{ +struct rcu_synchronize rcu; + +init_rcu_head_on_stack (&rcu.head); +init_completion (&rcu.completion); +/* Will wake me after RCU finished. */ +crf (&rcu.head, wakeme_after_rcu); +/* Wait for it. */ +wait_for_completion (&rcu.completion); +destroy_rcu_head_on_stack (&rcu.head); +} +EXPORT_SYMBOL_GPL (wait_rcu_gp); +#ifdef CONFIG_PROVE_RCU /* * wrapper function to avoid #include problems.
kernel/rcutiny.c +24 -93
182 lines not on this page · raw message
kernel/rcutiny_plugin.h +87 -47
223 lines not on this page · raw message
kernel/rcutorture.c +34 -43
174 lines not on this page · raw message
kernel/rcutree.c +185 -105
676 lines not on this page · raw message
kernel/rcutree.h +12 -5
@@ -230,9 +230,9 @@ struct rcu_data {/* in order to detect GP end. */ unsigned long gpnum;/* Highest gp number that this CPU */ /* is aware of having started. */ -unsigned long passed_quiesc_completed; -/* Value of completed at time of qs. */ -bool passed_quiesc;/* User-mode/idle loop etc. */ +unsigned long passed_quiesce_gpnum; +/* gpnum at time of quiescent state. */ +bool passed_quiesce;/* User-mode/idle loop etc. */ bool qs_pending;/* Core waits for quiesc state. */ bool beenonline;/* CPU online at least once. */ bool preemptible;/* Preemptible RCU? */
@@ -299,6 +299,7 @@ struct rcu_data {unsigned long n_rp_need_nothing;int cpu; +struct rcu_state *rsp; };/* Values for signaled field in struct rcu_state. */
@@ -417,6 +418,13 @@ extern struct rcu_state rcu_preempt_state; DECLARE_PER_CPU(struct rcu_data, rcu_preempt_data);#endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ +#ifdef CONFIG_RCU_BOOST +DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_status); +DECLARE_PER_CPU (int, rcu_cpu_kthread_cpu); +DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_loops); +DECLARE_PER_CPU (char, rcu_cpu_has_work); +#endif /* #ifdef CONFIG_RCU_BOOST */ +#ifndef RCU_TREE_NONCORE /* Forward declarations for rcutree_plugin.h */
@@ -430,7 +438,7 @@ static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp,static void rcu_stop_cpu_kthread (int cpu);#endif /* #ifdef CONFIG_HOTPLUG_CPU */ static void rcu_print_detail_task_stall (struct rcu_state *rsp); -static void rcu_print_task_stall (struct rcu_node *rnp); +static int rcu_print_task_stall (struct rcu_node *rnp);static void rcu_preempt_stall_reset (void );static void rcu_preempt_check_blocked_tasks (struct rcu_node *rnp);#ifdef CONFIG_HOTPLUG_CPU
@@ -450,7 +458,6 @@ static int rcu_preempt_needs_cpu(int cpu);static void __cpuinit rcu_preempt_init_percpu_data (int cpu);
Lines of this file are not shown. View the raw message.
kernel/rcutree_plugin.h +83 -67
150 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.