diff options
| author | Jason Baron <jbaron@redhat.com> | 2007-02-10 01:44:59 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-11 10:51:26 -0800 | 
| commit | 068135e63518314d4efd711142f674ad0841599e (patch) | |
| tree | dbf8193b0e8f3b6c0e735b48c1f8201a6df207ac /kernel/lockdep_proc.c | |
| parent | 381a229209aa6f7f72375797b7bcfcfe2ae6fcbb (diff) | |
| download | olio-linux-3.10-068135e63518314d4efd711142f674ad0841599e.tar.xz olio-linux-3.10-068135e63518314d4efd711142f674ad0841599e.zip  | |
[PATCH] lockdep: add graph depth information to /proc/lockdep
Generate locking graph information into /proc/lockdep, for lock hierarchy
documentation and visualization purposes.
sample output:
 c089fd5c OPS:     138 FD:   14 BD:    1 --..: &tty->termios_mutex
  -> [c07a3430] tty_ldisc_lock
  -> [c07a37f0] &port_lock_key
  -> [c07afdc0] &rq->rq_lock_key#2
The lock classes listed are all the first-hop lock dependencies that
lockdep has seen so far.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/lockdep_proc.c')
| -rw-r--r-- | kernel/lockdep_proc.c | 41 | 
1 files changed, 29 insertions, 12 deletions
diff --git a/kernel/lockdep_proc.c b/kernel/lockdep_proc.c index b554b40a4aa..57a547a2da3 100644 --- a/kernel/lockdep_proc.c +++ b/kernel/lockdep_proc.c @@ -77,12 +77,29 @@ static unsigned long count_backward_deps(struct lock_class *class)  	return ret;  } +static void print_name(struct seq_file *m, struct lock_class *class) +{ +	char str[128]; +	const char *name = class->name; + +	if (!name) { +		name = __get_key_name(class->key, str); +		seq_printf(m, "%s", name); +	} else{ +		seq_printf(m, "%s", name); +		if (class->name_version > 1) +			seq_printf(m, "#%d", class->name_version); +		if (class->subclass) +			seq_printf(m, "/%d", class->subclass); +	} +} +  static int l_show(struct seq_file *m, void *v)  {  	unsigned long nr_forward_deps, nr_backward_deps;  	struct lock_class *class = m->private; -	char str[128], c1, c2, c3, c4; -	const char *name; +	struct lock_list *entry; +	char c1, c2, c3, c4;  	seq_printf(m, "%p", class->key);  #ifdef CONFIG_DEBUG_LOCKDEP @@ -97,16 +114,16 @@ static int l_show(struct seq_file *m, void *v)  	get_usage_chars(class, &c1, &c2, &c3, &c4);  	seq_printf(m, " %c%c%c%c", c1, c2, c3, c4); -	name = class->name; -	if (!name) { -		name = __get_key_name(class->key, str); -		seq_printf(m, ": %s", name); -	} else{ -		seq_printf(m, ": %s", name); -		if (class->name_version > 1) -			seq_printf(m, "#%d", class->name_version); -		if (class->subclass) -			seq_printf(m, "/%d", class->subclass); +	seq_printf(m, ": "); +	print_name(m, class); +	seq_puts(m, "\n"); + +	list_for_each_entry(entry, &class->locks_after, entry) { +		if (entry->distance == 1) { +			seq_printf(m, " -> [%p] ", entry->class); +			print_name(m, entry->class); +			seq_puts(m, "\n"); +		}  	}  	seq_puts(m, "\n");  |