diff options
| author | David Woodhouse <David.Woodhouse@intel.com> | 2008-07-25 10:40:14 -0400 |
|---|---|---|
| committer | David Woodhouse <David.Woodhouse@intel.com> | 2008-07-25 10:40:14 -0400 |
| commit | ff877ea80efa2015b6263766f78ee42c2a1b32f9 (patch) | |
| tree | 85205005c611ab774702148558321c6fb92f1ccd /kernel/lockdep_proc.c | |
| parent | 30821fee4f0cb3e6d241d9f7ddc37742212e3eb7 (diff) | |
| parent | d37e6bf68fc1eb34a4ad21d9ae8890ed37ea80e7 (diff) | |
Merge branch 'linux-next' of git://git.infradead.org/~dedekind/ubi-2.6
Diffstat (limited to 'kernel/lockdep_proc.c')
| -rw-r--r-- | kernel/lockdep_proc.c | 97 |
1 files changed, 96 insertions, 1 deletions
diff --git a/kernel/lockdep_proc.c b/kernel/lockdep_proc.c index dc5d29648d85..9b0e940e2545 100644 --- a/kernel/lockdep_proc.c +++ b/kernel/lockdep_proc.c | |||
| @@ -139,7 +139,7 @@ static int l_show(struct seq_file *m, void *v) | |||
| 139 | 139 | ||
| 140 | list_for_each_entry(entry, &class->locks_after, entry) { | 140 | list_for_each_entry(entry, &class->locks_after, entry) { |
| 141 | if (entry->distance == 1) { | 141 | if (entry->distance == 1) { |
| 142 | seq_printf(m, " -> [%p] ", entry->class); | 142 | seq_printf(m, " -> [%p] ", entry->class->key); |
| 143 | print_name(m, entry->class); | 143 | print_name(m, entry->class); |
| 144 | seq_puts(m, "\n"); | 144 | seq_puts(m, "\n"); |
| 145 | } | 145 | } |
| @@ -178,6 +178,95 @@ static const struct file_operations proc_lockdep_operations = { | |||
| 178 | .release = seq_release, | 178 | .release = seq_release, |
| 179 | }; | 179 | }; |
| 180 | 180 | ||
| 181 | #ifdef CONFIG_PROVE_LOCKING | ||
| 182 | static void *lc_next(struct seq_file *m, void *v, loff_t *pos) | ||
| 183 | { | ||
| 184 | struct lock_chain *chain; | ||
| 185 | |||
| 186 | (*pos)++; | ||
| 187 | |||
| 188 | if (v == SEQ_START_TOKEN) | ||
| 189 | chain = m->private; | ||
| 190 | else { | ||
| 191 | chain = v; | ||
| 192 | |||
| 193 | if (*pos < nr_lock_chains) | ||
| 194 | chain = lock_chains + *pos; | ||
| 195 | else | ||
| 196 | chain = NULL; | ||
| 197 | } | ||
| 198 | |||
| 199 | return chain; | ||
| 200 | } | ||
| 201 | |||
| 202 | static void *lc_start(struct seq_file *m, loff_t *pos) | ||
| 203 | { | ||
| 204 | if (*pos == 0) | ||
| 205 | return SEQ_START_TOKEN; | ||
| 206 | |||
| 207 | if (*pos < nr_lock_chains) | ||
| 208 | return lock_chains + *pos; | ||
| 209 | |||
| 210 | return NULL; | ||
| 211 | } | ||
| 212 | |||
| 213 | static void lc_stop(struct seq_file *m, void *v) | ||
| 214 | { | ||
| 215 | } | ||
| 216 | |||
| 217 | static int lc_show(struct seq_file *m, void *v) | ||
| 218 | { | ||
| 219 | struct lock_chain *chain = v; | ||
| 220 | struct lock_class *class; | ||
| 221 | int i; | ||
| 222 | |||
| 223 | if (v == SEQ_START_TOKEN) { | ||
| 224 | seq_printf(m, "all lock chains:\n"); | ||
| 225 | return 0; | ||
| 226 | } | ||
| 227 | |||
| 228 | seq_printf(m, "irq_context: %d\n", chain->irq_context); | ||
| 229 | |||
| 230 | for (i = 0; i < chain->depth; i++) { | ||
| 231 | class = lock_chain_get_class(chain, i); | ||
| 232 | seq_printf(m, "[%p] ", class->key); | ||
| 233 | print_name(m, class); | ||
| 234 | seq_puts(m, "\n"); | ||
| 235 | } | ||
| 236 | seq_puts(m, "\n"); | ||
| 237 | |||
| 238 | return 0; | ||
| 239 | } | ||
| 240 | |||
| 241 | static const struct seq_operations lockdep_chains_ops = { | ||
| 242 | .start = lc_start, | ||
| 243 | .next = lc_next, | ||
| 244 | .stop = lc_stop, | ||
| 245 | .show = lc_show, | ||
| 246 | }; | ||
| 247 | |||
| 248 | static int lockdep_chains_open(struct inode *inode, struct file *file) | ||
| 249 | { | ||
| 250 | int res = seq_open(file, &lockdep_chains_ops); | ||
| 251 | if (!res) { | ||
| 252 | struct seq_file *m = file->private_data; | ||
| 253 | |||
| 254 | if (nr_lock_chains) | ||
| 255 | m->private = lock_chains; | ||
| 256 | else | ||
| 257 | m->private = NULL; | ||
| 258 | } | ||
| 259 | return res; | ||
| 260 | } | ||
| 261 | |||
| 262 | static const struct file_operations proc_lockdep_chains_operations = { | ||
| 263 | .open = lockdep_chains_open, | ||
| 264 | .read = seq_read, | ||
| 265 | .llseek = seq_lseek, | ||
| 266 | .release = seq_release, | ||
| 267 | }; | ||
| 268 | #endif /* CONFIG_PROVE_LOCKING */ | ||
| 269 | |||
| 181 | static void lockdep_stats_debug_show(struct seq_file *m) | 270 | static void lockdep_stats_debug_show(struct seq_file *m) |
| 182 | { | 271 | { |
| 183 | #ifdef CONFIG_DEBUG_LOCKDEP | 272 | #ifdef CONFIG_DEBUG_LOCKDEP |
| @@ -294,6 +383,8 @@ static int lockdep_stats_show(struct seq_file *m, void *v) | |||
| 294 | #ifdef CONFIG_PROVE_LOCKING | 383 | #ifdef CONFIG_PROVE_LOCKING |
| 295 | seq_printf(m, " dependency chains: %11lu [max: %lu]\n", | 384 | seq_printf(m, " dependency chains: %11lu [max: %lu]\n", |
| 296 | nr_lock_chains, MAX_LOCKDEP_CHAINS); | 385 | nr_lock_chains, MAX_LOCKDEP_CHAINS); |
| 386 | seq_printf(m, " dependency chain hlocks: %11d [max: %lu]\n", | ||
| 387 | nr_chain_hlocks, MAX_LOCKDEP_CHAIN_HLOCKS); | ||
| 297 | #endif | 388 | #endif |
| 298 | 389 | ||
| 299 | #ifdef CONFIG_TRACE_IRQFLAGS | 390 | #ifdef CONFIG_TRACE_IRQFLAGS |
| @@ -661,6 +752,10 @@ static const struct file_operations proc_lock_stat_operations = { | |||
| 661 | static int __init lockdep_proc_init(void) | 752 | static int __init lockdep_proc_init(void) |
| 662 | { | 753 | { |
| 663 | proc_create("lockdep", S_IRUSR, NULL, &proc_lockdep_operations); | 754 | proc_create("lockdep", S_IRUSR, NULL, &proc_lockdep_operations); |
| 755 | #ifdef CONFIG_PROVE_LOCKING | ||
| 756 | proc_create("lockdep_chains", S_IRUSR, NULL, | ||
| 757 | &proc_lockdep_chains_operations); | ||
| 758 | #endif | ||
| 664 | proc_create("lockdep_stats", S_IRUSR, NULL, | 759 | proc_create("lockdep_stats", S_IRUSR, NULL, |
| 665 | &proc_lockdep_stats_operations); | 760 | &proc_lockdep_stats_operations); |
| 666 | 761 | ||
