Thread (7 messages) flat view 7 messages, 3 authors, 2008-08-13
DORMANTno replies

[PATCH diagnostic] Prevent console flood when one CPU sees another AWOL via RCU

From: Paul E. McKenney <hidden>
Date: 2008-08-13 00:25:23
Also in: lkml
Subsystem: the rest · Maintainer: Linus Torvalds

On Mon, Aug 11, 2008 at 06:17:28AM -0700, Paul E. McKenney wrote:
On Mon, Aug 11, 2008 at 01:38:17PM +0200, Ingo Molnar wrote:
quoted
* Paul E. McKenney [off-list ref] wrote:
quoted
And here is the patch.  It is still a bit raw, so the results should 
be viewed with some suspicion.  It adds a default-off kernel parameter 
CONFIG_RCU_CPU_STALL which must be enabled.

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...
while this wont debug problems were timer irqs are genuinely stuck for 
long periods of time, it should find problems with RCU completion logic 
itself in the presence of correct timer irqs - and the lack of any 
messages from this debug option should point the finger more firmly in 
the direction of stalled timer irqs.

So i find this debug feature rather useful and have applied it to 
tip/core/rcu (and cleaned it up a bit). I renamed the config option to 
CONFIG_DEBUG_RCU_STALL to make it more in line with usual debug option 
names. Lets see whether -tip testing finds any false positives.
Sounds good!

For whatever it is worth, this diagnostic can also locate latency issues
in non-CONFIG_PREEMPT kernels, even when those problems are outside of
preempt_disable() regions.  Latency tracer is of course a better tool
for things -inside- of preempt_disable() regions.
One small change needed to keep from flooding the console when one
CPU notices that another is AWOL.  Unless I am missing something subtle.
Otherwise the cleanups look good!

Signed-off-by: Paul E. McKenney <redacted>
---

 rcuclassic.c |    1 +
 1 file changed, 1 insertion(+)
diff --git a/kernel/rcuclassic.c b/kernel/rcuclassic.c
index 56b8712..dab2676 100644
--- a/kernel/rcuclassic.c
+++ b/kernel/rcuclassic.c
@@ -308,6 +308,7 @@ static void print_other_cpu_stall(struct rcu_ctrlblk *rcp)
 		spin_unlock(&rcp->lock);
 		return;
 	}
+	rcp->gp_check = get_seconds() + 30;
 	spin_unlock(&rcp->lock);
 
 	/* OK, time to rat on our buddy... */
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help