diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-01-04 19:04:02 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-01-13 03:06:07 -0500 |
commit | b6407e863934965cdc66cbc244d811ceeb6f4d77 (patch) | |
tree | 5fb8f9fe233a2084f283887e019e6bf5ac6fac29 | |
parent | cba8244a0f1c277b6b1e48ed6504fa434119e24d (diff) |
rcu: Give different levels of the rcu_node hierarchy distinct lockdep names
Previously, each level of the rcu_node hierarchy had the same
rather unimaginative name: "&rcu_node_class[i]". This makes
lockdep diagnostics involving these lockdep classes less helpful
than would be nice. This patch fixes this by giving each level
of the rcu_node hierarchy a distinct name: "rcu_node_level_0",
"rcu_node_level_1", and so on. This version of the patch
includes improved diagnostics suggested by Josh Triplett and
Peter Zijlstra.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: mathieu.desnoyers@polymtl.ca
Cc: josh@joshtriplett.org
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
Cc: Valdis.Kletnieks@vt.edu
Cc: dhowells@redhat.com
LKML-Reference: <12626498421830-git-send-email->
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | kernel/rcutree.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 0a4c32879398..3b13d64b010b 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -1811,11 +1811,17 @@ static void __init rcu_init_levelspread(struct rcu_state *rsp) | |||
1811 | */ | 1811 | */ |
1812 | static void __init rcu_init_one(struct rcu_state *rsp) | 1812 | static void __init rcu_init_one(struct rcu_state *rsp) |
1813 | { | 1813 | { |
1814 | static char *buf[] = { "rcu_node_level_0", | ||
1815 | "rcu_node_level_1", | ||
1816 | "rcu_node_level_2", | ||
1817 | "rcu_node_level_3" }; /* Match MAX_RCU_LVLS */ | ||
1814 | int cpustride = 1; | 1818 | int cpustride = 1; |
1815 | int i; | 1819 | int i; |
1816 | int j; | 1820 | int j; |
1817 | struct rcu_node *rnp; | 1821 | struct rcu_node *rnp; |
1818 | 1822 | ||
1823 | BUILD_BUG_ON(MAX_RCU_LVLS > ARRAY_SIZE(buf)); /* Fix buf[] init! */ | ||
1824 | |||
1819 | /* Initialize the level-tracking arrays. */ | 1825 | /* Initialize the level-tracking arrays. */ |
1820 | 1826 | ||
1821 | for (i = 1; i < NUM_RCU_LVLS; i++) | 1827 | for (i = 1; i < NUM_RCU_LVLS; i++) |
@@ -1829,7 +1835,8 @@ static void __init rcu_init_one(struct rcu_state *rsp) | |||
1829 | rnp = rsp->level[i]; | 1835 | rnp = rsp->level[i]; |
1830 | for (j = 0; j < rsp->levelcnt[i]; j++, rnp++) { | 1836 | for (j = 0; j < rsp->levelcnt[i]; j++, rnp++) { |
1831 | spin_lock_init(&rnp->lock); | 1837 | spin_lock_init(&rnp->lock); |
1832 | lockdep_set_class(&rnp->lock, &rcu_node_class[i]); | 1838 | lockdep_set_class_and_name(&rnp->lock, |
1839 | &rcu_node_class[i], buf[i]); | ||
1833 | rnp->gpnum = 0; | 1840 | rnp->gpnum = 0; |
1834 | rnp->qsmask = 0; | 1841 | rnp->qsmask = 0; |
1835 | rnp->qsmaskinit = 0; | 1842 | rnp->qsmaskinit = 0; |