diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2008-10-02 19:06:39 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-10-03 04:36:08 -0400 |
| commit | 2133b5d7ff531bc15a923db4a6a50bf96c561be9 (patch) | |
| tree | 5917515eaec573fbc3d4a734769d6184beb83dbb /include/linux | |
| parent | b5259d944279d0b7e78a83849a352d8ba0447c4c (diff) | |
rcu: RCU-based detection of stalled CPUs for Classic RCU
This patch adds stalled-CPU detection to Classic RCU. This capability
is enabled by a new config variable CONFIG_RCU_CPU_STALL_DETECTOR, which
defaults disabled.
This is a debugging feature to detect infinite loops in kernel code, not
something that non-kernel-hackers would be expected to care about.
This feature can detect looping CPUs in !PREEMPT builds and looping CPUs
with preemption disabled in PREEMPT builds. This is essentially a port of
this functionality from the treercu patch, replacing the stall debug patch
that is already in tip/core/rcu (commit 67182ae1c4).
The changes from the patch in tip/core/rcu include making the config
variable name match that in treercu, changing from seconds to jiffies to
avoid spurious warnings, and printing a boot message when this feature
is enabled.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/rcuclassic.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/include/linux/rcuclassic.h b/include/linux/rcuclassic.h index 29bf528c7dcc..5f89b62e6983 100644 --- a/include/linux/rcuclassic.h +++ b/include/linux/rcuclassic.h | |||
| @@ -40,15 +40,21 @@ | |||
| 40 | #include <linux/cpumask.h> | 40 | #include <linux/cpumask.h> |
| 41 | #include <linux/seqlock.h> | 41 | #include <linux/seqlock.h> |
| 42 | 42 | ||
| 43 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | ||
| 44 | #define RCU_SECONDS_TILL_STALL_CHECK ( 3 * HZ) /* for rcp->jiffies_stall */ | ||
| 45 | #define RCU_SECONDS_TILL_STALL_RECHECK (30 * HZ) /* for rcp->jiffies_stall */ | ||
| 46 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | ||
| 43 | 47 | ||
| 44 | /* Global control variables for rcupdate callback mechanism. */ | 48 | /* Global control variables for rcupdate callback mechanism. */ |
| 45 | struct rcu_ctrlblk { | 49 | struct rcu_ctrlblk { |
| 46 | long cur; /* Current batch number. */ | 50 | long cur; /* Current batch number. */ |
| 47 | long completed; /* Number of the last completed batch */ | 51 | long completed; /* Number of the last completed batch */ |
| 48 | long pending; /* Number of the last pending batch */ | 52 | long pending; /* Number of the last pending batch */ |
| 49 | #ifdef CONFIG_DEBUG_RCU_STALL | 53 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
| 50 | unsigned long gp_check; /* Time grace period should end, in seconds. */ | 54 | unsigned long gp_start; /* Time at which GP started in jiffies. */ |
| 51 | #endif /* #ifdef CONFIG_DEBUG_RCU_STALL */ | 55 | unsigned long jiffies_stall; |
| 56 | /* Time at which to check for CPU stalls. */ | ||
| 57 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | ||
| 52 | 58 | ||
| 53 | int signaled; | 59 | int signaled; |
| 54 | 60 | ||
