aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2012-08-10 19:55:59 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2012-09-23 10:42:51 -0400
commitc8020a67e625c714c4dbedc8ae2944b461e204ec (patch)
tree12ad0e02b6e30dffd8c7e2b24cdb278a6b799ad4
parent5fd4dc068c4ded1339180dbcd1a99e15b1c0a728 (diff)
rcu: Protect rcu_node accesses during CPU stall warnings
The print_other_cpu_stall() function accesses a number of rcu_node fields without protection from the ->lock. In theory, this is not a problem because the fields accessed are all integers, but in practice the compiler can get nasty. Therefore, the commit extends the existing critical section to cover the entire loop body. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
-rw-r--r--kernel/rcutree.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c
index 2c4ee4cdbc0e..2cf8eb3e2d43 100644
--- a/kernel/rcutree.c
+++ b/kernel/rcutree.c
@@ -746,14 +746,15 @@ static void print_other_cpu_stall(struct rcu_state *rsp)
746 rcu_for_each_leaf_node(rsp, rnp) { 746 rcu_for_each_leaf_node(rsp, rnp) {
747 raw_spin_lock_irqsave(&rnp->lock, flags); 747 raw_spin_lock_irqsave(&rnp->lock, flags);
748 ndetected += rcu_print_task_stall(rnp); 748 ndetected += rcu_print_task_stall(rnp);
749 if (rnp->qsmask != 0) {
750 for (cpu = 0; cpu <= rnp->grphi - rnp->grplo; cpu++)
751 if (rnp->qsmask & (1UL << cpu)) {
752 print_cpu_stall_info(rsp,
753 rnp->grplo + cpu);
754 ndetected++;
755 }
756 }
749 raw_spin_unlock_irqrestore(&rnp->lock, flags); 757 raw_spin_unlock_irqrestore(&rnp->lock, flags);
750 if (rnp->qsmask == 0)
751 continue;
752 for (cpu = 0; cpu <= rnp->grphi - rnp->grplo; cpu++)
753 if (rnp->qsmask & (1UL << cpu)) {
754 print_cpu_stall_info(rsp, rnp->grplo + cpu);
755 ndetected++;
756 }
757 } 758 }
758 759
759 /* 760 /*