aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/rcuclassic.h
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2008-08-10 21:35:38 -0400
committerIngo Molnar <mingo@elte.hu>2008-08-11 07:35:18 -0400
commit67182ae1c42206e516f7efb292b745e826497b24 (patch)
treed2d402550a0432489090264df95a8154597dc989 /include/linux/rcuclassic.h
parentc4c0c56a7a85ed5725786219e4fbca7e840b1531 (diff)
rcu, debug: detect stalled grace periods
this is a diagnostic patch for Classic RCU. The approach is to record a timestamp at the beginning of the grace period (in rcu_start_batch()), then have rcu_check_callbacks() complain if: 1. it is running on a CPU that has holding up grace periods for a long time (say one second). This will identify the culprit assuming that the culprit has not disabled hardware irqs, instruction execution, or some such. 2. it is running on a CPU that is not holding up grace periods, but grace periods have been held up for an even longer time (say two seconds). It is enabled via the default-off CONFIG_DEBUG_RCU_STALL kernel parameter. Rather than exponential backoff, it backs off to once per 30 seconds. My feeling upon thinking on it was that if you have stalled RCU grace periods for that long, a few extra printk() messages are probably the least of your worries... Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Yinghai Lu <yhlu.kernel@gmail.com> Cc: David Witbrodt <dawitbro@sbcglobal.net> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/linux/rcuclassic.h')
-rw-r--r--include/linux/rcuclassic.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/rcuclassic.h b/include/linux/rcuclassic.h
index 04c728147be0..16589958b40e 100644
--- a/include/linux/rcuclassic.h
+++ b/include/linux/rcuclassic.h
@@ -46,6 +46,9 @@ struct rcu_ctrlblk {
46 long cur; /* Current batch number. */ 46 long cur; /* Current batch number. */
47 long completed; /* Number of the last completed batch */ 47 long completed; /* Number of the last completed batch */
48 long pending; /* Number of the last pending batch */ 48 long pending; /* Number of the last pending batch */
49#ifdef CONFIG_DEBUG_RCU_STALL
50 unsigned long gp_check; /* Time grace period should end, in seconds. */
51#endif /* #ifdef CONFIG_DEBUG_RCU_STALL */
49 52
50 int signaled; 53 int signaled;
51 54