diff options
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 | ||