diff options
Diffstat (limited to 'kernel/rcutree.c')
-rw-r--r-- | kernel/rcutree.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 9970116163ba..ade788320dd6 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -545,6 +545,7 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | |||
545 | int cpu; | 545 | int cpu; |
546 | long delta; | 546 | long delta; |
547 | unsigned long flags; | 547 | unsigned long flags; |
548 | int ndetected; | ||
548 | struct rcu_node *rnp = rcu_get_root(rsp); | 549 | struct rcu_node *rnp = rcu_get_root(rsp); |
549 | 550 | ||
550 | /* Only let one CPU complain about others per time interval. */ | 551 | /* Only let one CPU complain about others per time interval. */ |
@@ -561,7 +562,7 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | |||
561 | * Now rat on any tasks that got kicked up to the root rcu_node | 562 | * Now rat on any tasks that got kicked up to the root rcu_node |
562 | * due to CPU offlining. | 563 | * due to CPU offlining. |
563 | */ | 564 | */ |
564 | rcu_print_task_stall(rnp); | 565 | ndetected = rcu_print_task_stall(rnp); |
565 | raw_spin_unlock_irqrestore(&rnp->lock, flags); | 566 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
566 | 567 | ||
567 | /* | 568 | /* |
@@ -573,17 +574,21 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | |||
573 | rsp->name); | 574 | rsp->name); |
574 | rcu_for_each_leaf_node(rsp, rnp) { | 575 | rcu_for_each_leaf_node(rsp, rnp) { |
575 | raw_spin_lock_irqsave(&rnp->lock, flags); | 576 | raw_spin_lock_irqsave(&rnp->lock, flags); |
576 | rcu_print_task_stall(rnp); | 577 | ndetected += rcu_print_task_stall(rnp); |
577 | raw_spin_unlock_irqrestore(&rnp->lock, flags); | 578 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
578 | if (rnp->qsmask == 0) | 579 | if (rnp->qsmask == 0) |
579 | continue; | 580 | continue; |
580 | for (cpu = 0; cpu <= rnp->grphi - rnp->grplo; cpu++) | 581 | for (cpu = 0; cpu <= rnp->grphi - rnp->grplo; cpu++) |
581 | if (rnp->qsmask & (1UL << cpu)) | 582 | if (rnp->qsmask & (1UL << cpu)) { |
582 | printk(" %d", rnp->grplo + cpu); | 583 | printk(" %d", rnp->grplo + cpu); |
584 | ndetected++; | ||
585 | } | ||
583 | } | 586 | } |
584 | printk("} (detected by %d, t=%ld jiffies)\n", | 587 | printk("} (detected by %d, t=%ld jiffies)\n", |
585 | smp_processor_id(), (long)(jiffies - rsp->gp_start)); | 588 | smp_processor_id(), (long)(jiffies - rsp->gp_start)); |
586 | if (!trigger_all_cpu_backtrace()) | 589 | if (ndetected == 0) |
590 | printk(KERN_ERR "INFO: Stall ended before state dump start\n"); | ||
591 | else if (!trigger_all_cpu_backtrace()) | ||
587 | dump_stack(); | 592 | dump_stack(); |
588 | 593 | ||
589 | /* If so configured, complain about tasks blocking the grace period. */ | 594 | /* If so configured, complain about tasks blocking the grace period. */ |