diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 7717b95..4840331 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c @@ -437,6 +437,56 @@ static void record_gp_stall_check_time(struct rcu_state *rsp) rsp->jiffies_stall = jiffies + RCU_SECONDS_TILL_STALL_CHECK; } +static void print_other_cpu_stall_diags(struct rcu_state *rsp) +{ + int i; + struct rcu_data *rdp; + struct rcu_node *rnp; + struct rcu_node *rnp_end; + + /* Dump out rcu_state information. */ + + printk(KERN_ERR "\n"); + printk(KERN_ERR "rcu_state structure:\n"); + for (i = 0; i < NUM_RCU_LVLS; i++) { + printk(KERN_ERR + "%d: levelcnt: %u level: %p levelspread: %d\n", + i, rsp->levelcnt[i], rsp->level[i], rsp->levelspread[i]); + } + printk(KERN_ERR "%d: levelcnt: %u\n", i, rsp->levelcnt[i]); + printk(KERN_ERR "signaled: %u gpnum: %ld completed %ld\n", + rsp->signaled, rsp->gpnum, rsp->completed); + + /* Dump out rcu_node information. */ + + printk(KERN_ERR "\n"); + printk(KERN_ERR "rcu_node structures:\n"); + rnp_end = &rsp->node[NUM_RCU_NODES]; + for (rnp = &rsp->node[0]; rnp < rnp_end; rnp++) { + printk(KERN_ERR + "%d: qsmask: %lx/%lx grpmask: %lx " + "grplo/hi: %d/%d grpnum: %d level: %d\n", + rnp - &rsp->node[0], + rnp->qsmask, rnp->qsmaskinit, rnp->grpmask, + rnp->grplo, rnp->grphi, rnp->grpnum, rnp->level); + } + + /* Dump out rcu_data information. */ + + printk(KERN_ERR "\n"); + printk(KERN_ERR "rcu_data structures:\n"); + for_each_possible_cpu(i) { + rdp = rsp->rda[i]; + printk(KERN_ERR + "%d: %p gpnum: %ld completed: %ld pqc: %ld " + "pq: %d qsp: %d bol: %d grpmask: %lx\n", + i, rdp, rdp->gpnum, rdp->completed, + rdp->passed_quiesc_completed, + rdp->passed_quiesc, rdp->qs_pending, + rdp->beenonline, rdp->grpmask); + } +} + static void print_other_cpu_stall(struct rcu_state *rsp) { int cpu; @@ -469,6 +519,8 @@ static void print_other_cpu_stall(struct rcu_state *rsp) } printk(" (detected by %d, t=%ld jiffies)\n", smp_processor_id(), (long)(jiffies - rsp->gp_start)); + print_other_cpu_stall_diags(rsp); + force_quiescent_state(rsp, 0); /* Kick them all. */ }