diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-04-13 19:18:22 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-05-10 14:08:34 -0400 |
commit | 4300aa642cc9ecb35f2e0683dd294fb790ef028c (patch) | |
tree | b70d676b02c6311a638fdaa6f3df8773b39fade1 /kernel | |
parent | 26845c2860cebebe6ce2d9d01ae3cb3db84b7e29 (diff) |
rcu: improve RCU CPU stall-warning messages
The existing RCU CPU stall-warning messages can be confusing, especially
in the case where one CPU detects a single other stalled CPU. In addition,
the console messages did not say which flavor of RCU detected the stall,
which can make it difficult to work out exactly what is causing the stall.
This commit improves these messages.
Requested-by: Dhaval Giani <dhaval.giani@gmail.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rcutree.c | 20 | ||||
-rw-r--r-- | kernel/rcutree.h | 1 |
2 files changed, 12 insertions, 9 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index ec6196fcd1fa..f391886be8f0 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -54,8 +54,8 @@ | |||
54 | 54 | ||
55 | static struct lock_class_key rcu_node_class[NUM_RCU_LVLS]; | 55 | static struct lock_class_key rcu_node_class[NUM_RCU_LVLS]; |
56 | 56 | ||
57 | #define RCU_STATE_INITIALIZER(name) { \ | 57 | #define RCU_STATE_INITIALIZER(structname) { \ |
58 | .level = { &name.node[0] }, \ | 58 | .level = { &structname.node[0] }, \ |
59 | .levelcnt = { \ | 59 | .levelcnt = { \ |
60 | NUM_RCU_LVL_0, /* root of hierarchy. */ \ | 60 | NUM_RCU_LVL_0, /* root of hierarchy. */ \ |
61 | NUM_RCU_LVL_1, \ | 61 | NUM_RCU_LVL_1, \ |
@@ -66,13 +66,14 @@ static struct lock_class_key rcu_node_class[NUM_RCU_LVLS]; | |||
66 | .signaled = RCU_GP_IDLE, \ | 66 | .signaled = RCU_GP_IDLE, \ |
67 | .gpnum = -300, \ | 67 | .gpnum = -300, \ |
68 | .completed = -300, \ | 68 | .completed = -300, \ |
69 | .onofflock = __RAW_SPIN_LOCK_UNLOCKED(&name.onofflock), \ | 69 | .onofflock = __RAW_SPIN_LOCK_UNLOCKED(&structname.onofflock), \ |
70 | .orphan_cbs_list = NULL, \ | 70 | .orphan_cbs_list = NULL, \ |
71 | .orphan_cbs_tail = &name.orphan_cbs_list, \ | 71 | .orphan_cbs_tail = &structname.orphan_cbs_list, \ |
72 | .orphan_qlen = 0, \ | 72 | .orphan_qlen = 0, \ |
73 | .fqslock = __RAW_SPIN_LOCK_UNLOCKED(&name.fqslock), \ | 73 | .fqslock = __RAW_SPIN_LOCK_UNLOCKED(&structname.fqslock), \ |
74 | .n_force_qs = 0, \ | 74 | .n_force_qs = 0, \ |
75 | .n_force_qs_ngp = 0, \ | 75 | .n_force_qs_ngp = 0, \ |
76 | .name = #structname, \ | ||
76 | } | 77 | } |
77 | 78 | ||
78 | struct rcu_state rcu_sched_state = RCU_STATE_INITIALIZER(rcu_sched_state); | 79 | struct rcu_state rcu_sched_state = RCU_STATE_INITIALIZER(rcu_sched_state); |
@@ -483,7 +484,8 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | |||
483 | 484 | ||
484 | /* OK, time to rat on our buddy... */ | 485 | /* OK, time to rat on our buddy... */ |
485 | 486 | ||
486 | printk(KERN_ERR "INFO: RCU detected CPU stalls:"); | 487 | printk(KERN_ERR "INFO: %s detected stalls on CPUs/tasks: {", |
488 | rsp->name); | ||
487 | rcu_for_each_leaf_node(rsp, rnp) { | 489 | rcu_for_each_leaf_node(rsp, rnp) { |
488 | raw_spin_lock_irqsave(&rnp->lock, flags); | 490 | raw_spin_lock_irqsave(&rnp->lock, flags); |
489 | rcu_print_task_stall(rnp); | 491 | rcu_print_task_stall(rnp); |
@@ -494,7 +496,7 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | |||
494 | if (rnp->qsmask & (1UL << cpu)) | 496 | if (rnp->qsmask & (1UL << cpu)) |
495 | printk(" %d", rnp->grplo + cpu); | 497 | printk(" %d", rnp->grplo + cpu); |
496 | } | 498 | } |
497 | printk(" (detected by %d, t=%ld jiffies)\n", | 499 | printk("} (detected by %d, t=%ld jiffies)\n", |
498 | smp_processor_id(), (long)(jiffies - rsp->gp_start)); | 500 | smp_processor_id(), (long)(jiffies - rsp->gp_start)); |
499 | trigger_all_cpu_backtrace(); | 501 | trigger_all_cpu_backtrace(); |
500 | 502 | ||
@@ -510,8 +512,8 @@ static void print_cpu_stall(struct rcu_state *rsp) | |||
510 | unsigned long flags; | 512 | unsigned long flags; |
511 | struct rcu_node *rnp = rcu_get_root(rsp); | 513 | struct rcu_node *rnp = rcu_get_root(rsp); |
512 | 514 | ||
513 | printk(KERN_ERR "INFO: RCU detected CPU %d stall (t=%lu jiffies)\n", | 515 | printk(KERN_ERR "INFO: %s detected stall on CPU %d (t=%lu jiffies)\n", |
514 | smp_processor_id(), jiffies - rsp->gp_start); | 516 | rsp->name, smp_processor_id(), jiffies - rsp->gp_start); |
515 | trigger_all_cpu_backtrace(); | 517 | trigger_all_cpu_backtrace(); |
516 | 518 | ||
517 | raw_spin_lock_irqsave(&rnp->lock, flags); | 519 | raw_spin_lock_irqsave(&rnp->lock, flags); |
diff --git a/kernel/rcutree.h b/kernel/rcutree.h index 4a525a30e08e..11f171121ad9 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h | |||
@@ -326,6 +326,7 @@ struct rcu_state { | |||
326 | unsigned long jiffies_stall; /* Time at which to check */ | 326 | unsigned long jiffies_stall; /* Time at which to check */ |
327 | /* for CPU stalls. */ | 327 | /* for CPU stalls. */ |
328 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | 328 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ |
329 | char *name; /* Name of structure. */ | ||
329 | }; | 330 | }; |
330 | 331 | ||
331 | /* Return values for rcu_preempt_offline_tasks(). */ | 332 | /* Return values for rcu_preempt_offline_tasks(). */ |