|
@@ -545,6 +545,7 @@ static void print_other_cpu_stall(struct rcu_state *rsp)
|
|
|
int cpu;
|
|
|
long delta;
|
|
|
unsigned long flags;
|
|
|
+ int ndetected;
|
|
|
struct rcu_node *rnp = rcu_get_root(rsp);
|
|
|
|
|
|
/* Only let one CPU complain about others per time interval. */
|
|
@@ -561,7 +562,7 @@ static void print_other_cpu_stall(struct rcu_state *rsp)
|
|
|
* Now rat on any tasks that got kicked up to the root rcu_node
|
|
|
* due to CPU offlining.
|
|
|
*/
|
|
|
- rcu_print_task_stall(rnp);
|
|
|
+ ndetected = rcu_print_task_stall(rnp);
|
|
|
raw_spin_unlock_irqrestore(&rnp->lock, flags);
|
|
|
|
|
|
/*
|
|
@@ -573,17 +574,21 @@ static void print_other_cpu_stall(struct rcu_state *rsp)
|
|
|
rsp->name);
|
|
|
rcu_for_each_leaf_node(rsp, rnp) {
|
|
|
raw_spin_lock_irqsave(&rnp->lock, flags);
|
|
|
- rcu_print_task_stall(rnp);
|
|
|
+ ndetected += rcu_print_task_stall(rnp);
|
|
|
raw_spin_unlock_irqrestore(&rnp->lock, flags);
|
|
|
if (rnp->qsmask == 0)
|
|
|
continue;
|
|
|
for (cpu = 0; cpu <= rnp->grphi - rnp->grplo; cpu++)
|
|
|
- if (rnp->qsmask & (1UL << cpu))
|
|
|
+ if (rnp->qsmask & (1UL << cpu)) {
|
|
|
printk(" %d", rnp->grplo + cpu);
|
|
|
+ ndetected++;
|
|
|
+ }
|
|
|
}
|
|
|
printk("} (detected by %d, t=%ld jiffies)\n",
|
|
|
smp_processor_id(), (long)(jiffies - rsp->gp_start));
|
|
|
- if (!trigger_all_cpu_backtrace())
|
|
|
+ if (ndetected == 0)
|
|
|
+ printk(KERN_ERR "INFO: Stall ended before state dump start\n");
|
|
|
+ else if (!trigger_all_cpu_backtrace())
|
|
|
dump_stack();
|
|
|
|
|
|
/* If so configured, complain about tasks blocking the grace period. */
|