diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2012-08-10 16:55:59 -0700 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2012-09-23 07:42:51 -0700 |
commit | c8020a67e625c714c4dbedc8ae2944b461e204ec (patch) | |
tree | 12ad0e02b6e30dffd8c7e2b24cdb278a6b799ad4 /kernel/rcutree.c | |
parent | 5fd4dc068c4ded1339180dbcd1a99e15b1c0a728 (diff) | |
download | kernel_goldelico_gta04-c8020a67e625c714c4dbedc8ae2944b461e204ec.zip kernel_goldelico_gta04-c8020a67e625c714c4dbedc8ae2944b461e204ec.tar.gz kernel_goldelico_gta04-c8020a67e625c714c4dbedc8ae2944b461e204ec.tar.bz2 |
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>
Diffstat (limited to 'kernel/rcutree.c')
-rw-r--r-- | kernel/rcutree.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 2c4ee4c..2cf8eb3 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c @@ -746,14 +746,15 @@ static void print_other_cpu_stall(struct rcu_state *rsp) rcu_for_each_leaf_node(rsp, rnp) { raw_spin_lock_irqsave(&rnp->lock, flags); ndetected += rcu_print_task_stall(rnp); + if (rnp->qsmask != 0) { + for (cpu = 0; cpu <= rnp->grphi - rnp->grplo; cpu++) + if (rnp->qsmask & (1UL << cpu)) { + print_cpu_stall_info(rsp, + rnp->grplo + cpu); + ndetected++; + } + } 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)) { - print_cpu_stall_info(rsp, rnp->grplo + cpu); - ndetected++; - } } /* |