diff options
Diffstat (limited to 'kernel/locking/lockdep_proc.c')
-rw-r--r-- | kernel/locking/lockdep_proc.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/kernel/locking/lockdep_proc.c b/kernel/locking/lockdep_proc.c index ef43ac4bafb5..d83d798bef95 100644 --- a/kernel/locking/lockdep_proc.c +++ b/kernel/locking/lockdep_proc.c | |||
@@ -426,10 +426,12 @@ static void seq_lock_time(struct seq_file *m, struct lock_time *lt) | |||
426 | 426 | ||
427 | static void seq_stats(struct seq_file *m, struct lock_stat_data *data) | 427 | static void seq_stats(struct seq_file *m, struct lock_stat_data *data) |
428 | { | 428 | { |
429 | char name[39]; | 429 | struct lockdep_subclass_key *ckey; |
430 | struct lock_class *class; | ||
431 | struct lock_class_stats *stats; | 430 | struct lock_class_stats *stats; |
431 | struct lock_class *class; | ||
432 | const char *cname; | ||
432 | int i, namelen; | 433 | int i, namelen; |
434 | char name[39]; | ||
433 | 435 | ||
434 | class = data->class; | 436 | class = data->class; |
435 | stats = &data->stats; | 437 | stats = &data->stats; |
@@ -440,15 +442,25 @@ static void seq_stats(struct seq_file *m, struct lock_stat_data *data) | |||
440 | if (class->subclass) | 442 | if (class->subclass) |
441 | namelen -= 2; | 443 | namelen -= 2; |
442 | 444 | ||
443 | if (!class->name) { | 445 | rcu_read_lock_sched(); |
446 | cname = rcu_dereference_sched(class->name); | ||
447 | ckey = rcu_dereference_sched(class->key); | ||
448 | |||
449 | if (!cname && !ckey) { | ||
450 | rcu_read_unlock_sched(); | ||
451 | return; | ||
452 | |||
453 | } else if (!cname) { | ||
444 | char str[KSYM_NAME_LEN]; | 454 | char str[KSYM_NAME_LEN]; |
445 | const char *key_name; | 455 | const char *key_name; |
446 | 456 | ||
447 | key_name = __get_key_name(class->key, str); | 457 | key_name = __get_key_name(ckey, str); |
448 | snprintf(name, namelen, "%s", key_name); | 458 | snprintf(name, namelen, "%s", key_name); |
449 | } else { | 459 | } else { |
450 | snprintf(name, namelen, "%s", class->name); | 460 | snprintf(name, namelen, "%s", cname); |
451 | } | 461 | } |
462 | rcu_read_unlock_sched(); | ||
463 | |||
452 | namelen = strlen(name); | 464 | namelen = strlen(name); |
453 | if (class->name_version > 1) { | 465 | if (class->name_version > 1) { |
454 | snprintf(name+namelen, 3, "#%d", class->name_version); | 466 | snprintf(name+namelen, 3, "#%d", class->name_version); |