diff options
Diffstat (limited to 'kernel/lockdep.c')
-rw-r--r-- | kernel/lockdep.c | 83 |
1 files changed, 56 insertions, 27 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index b2e08c932d91..8889f7dd7c46 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -431,6 +431,7 @@ unsigned int max_lockdep_depth; | |||
431 | * about it later on, in lockdep_info(). | 431 | * about it later on, in lockdep_info(). |
432 | */ | 432 | */ |
433 | static int lockdep_init_error; | 433 | static int lockdep_init_error; |
434 | static const char *lock_init_error; | ||
434 | static unsigned long lockdep_init_trace_data[20]; | 435 | static unsigned long lockdep_init_trace_data[20]; |
435 | static struct stack_trace lockdep_init_trace = { | 436 | static struct stack_trace lockdep_init_trace = { |
436 | .max_entries = ARRAY_SIZE(lockdep_init_trace_data), | 437 | .max_entries = ARRAY_SIZE(lockdep_init_trace_data), |
@@ -499,36 +500,32 @@ void get_usage_chars(struct lock_class *class, char usage[LOCK_USAGE_CHARS]) | |||
499 | usage[i] = '\0'; | 500 | usage[i] = '\0'; |
500 | } | 501 | } |
501 | 502 | ||
502 | static int __print_lock_name(struct lock_class *class) | 503 | static void __print_lock_name(struct lock_class *class) |
503 | { | 504 | { |
504 | char str[KSYM_NAME_LEN]; | 505 | char str[KSYM_NAME_LEN]; |
505 | const char *name; | 506 | const char *name; |
506 | 507 | ||
507 | name = class->name; | 508 | name = class->name; |
508 | if (!name) | ||
509 | name = __get_key_name(class->key, str); | ||
510 | |||
511 | return printk("%s", name); | ||
512 | } | ||
513 | |||
514 | static void print_lock_name(struct lock_class *class) | ||
515 | { | ||
516 | char str[KSYM_NAME_LEN], usage[LOCK_USAGE_CHARS]; | ||
517 | const char *name; | ||
518 | |||
519 | get_usage_chars(class, usage); | ||
520 | |||
521 | name = class->name; | ||
522 | if (!name) { | 509 | if (!name) { |
523 | name = __get_key_name(class->key, str); | 510 | name = __get_key_name(class->key, str); |
524 | printk(" (%s", name); | 511 | printk("%s", name); |
525 | } else { | 512 | } else { |
526 | printk(" (%s", name); | 513 | printk("%s", name); |
527 | if (class->name_version > 1) | 514 | if (class->name_version > 1) |
528 | printk("#%d", class->name_version); | 515 | printk("#%d", class->name_version); |
529 | if (class->subclass) | 516 | if (class->subclass) |
530 | printk("/%d", class->subclass); | 517 | printk("/%d", class->subclass); |
531 | } | 518 | } |
519 | } | ||
520 | |||
521 | static void print_lock_name(struct lock_class *class) | ||
522 | { | ||
523 | char usage[LOCK_USAGE_CHARS]; | ||
524 | |||
525 | get_usage_chars(class, usage); | ||
526 | |||
527 | printk(" ("); | ||
528 | __print_lock_name(class); | ||
532 | printk("){%s}", usage); | 529 | printk("){%s}", usage); |
533 | } | 530 | } |
534 | 531 | ||
@@ -568,11 +565,12 @@ static void lockdep_print_held_locks(struct task_struct *curr) | |||
568 | } | 565 | } |
569 | } | 566 | } |
570 | 567 | ||
571 | static void print_kernel_version(void) | 568 | static void print_kernel_ident(void) |
572 | { | 569 | { |
573 | printk("%s %.*s\n", init_utsname()->release, | 570 | printk("%s %.*s %s\n", init_utsname()->release, |
574 | (int)strcspn(init_utsname()->version, " "), | 571 | (int)strcspn(init_utsname()->version, " "), |
575 | init_utsname()->version); | 572 | init_utsname()->version, |
573 | print_tainted()); | ||
576 | } | 574 | } |
577 | 575 | ||
578 | static int very_verbose(struct lock_class *class) | 576 | static int very_verbose(struct lock_class *class) |
@@ -656,6 +654,7 @@ look_up_lock_class(struct lockdep_map *lock, unsigned int subclass) | |||
656 | if (unlikely(!lockdep_initialized)) { | 654 | if (unlikely(!lockdep_initialized)) { |
657 | lockdep_init(); | 655 | lockdep_init(); |
658 | lockdep_init_error = 1; | 656 | lockdep_init_error = 1; |
657 | lock_init_error = lock->name; | ||
659 | save_stack_trace(&lockdep_init_trace); | 658 | save_stack_trace(&lockdep_init_trace); |
660 | } | 659 | } |
661 | #endif | 660 | #endif |
@@ -723,7 +722,7 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force) | |||
723 | 722 | ||
724 | class = look_up_lock_class(lock, subclass); | 723 | class = look_up_lock_class(lock, subclass); |
725 | if (likely(class)) | 724 | if (likely(class)) |
726 | return class; | 725 | goto out_set_class_cache; |
727 | 726 | ||
728 | /* | 727 | /* |
729 | * Debug-check: all keys must be persistent! | 728 | * Debug-check: all keys must be persistent! |
@@ -808,6 +807,7 @@ out_unlock_set: | |||
808 | graph_unlock(); | 807 | graph_unlock(); |
809 | raw_local_irq_restore(flags); | 808 | raw_local_irq_restore(flags); |
810 | 809 | ||
810 | out_set_class_cache: | ||
811 | if (!subclass || force) | 811 | if (!subclass || force) |
812 | lock->class_cache[0] = class; | 812 | lock->class_cache[0] = class; |
813 | else if (subclass < NR_LOCKDEP_CACHING_CLASSES) | 813 | else if (subclass < NR_LOCKDEP_CACHING_CLASSES) |
@@ -1149,7 +1149,7 @@ print_circular_bug_header(struct lock_list *entry, unsigned int depth, | |||
1149 | printk("\n"); | 1149 | printk("\n"); |
1150 | printk("======================================================\n"); | 1150 | printk("======================================================\n"); |
1151 | printk("[ INFO: possible circular locking dependency detected ]\n"); | 1151 | printk("[ INFO: possible circular locking dependency detected ]\n"); |
1152 | print_kernel_version(); | 1152 | print_kernel_ident(); |
1153 | printk("-------------------------------------------------------\n"); | 1153 | printk("-------------------------------------------------------\n"); |
1154 | printk("%s/%d is trying to acquire lock:\n", | 1154 | printk("%s/%d is trying to acquire lock:\n", |
1155 | curr->comm, task_pid_nr(curr)); | 1155 | curr->comm, task_pid_nr(curr)); |
@@ -1488,7 +1488,7 @@ print_bad_irq_dependency(struct task_struct *curr, | |||
1488 | printk("======================================================\n"); | 1488 | printk("======================================================\n"); |
1489 | printk("[ INFO: %s-safe -> %s-unsafe lock order detected ]\n", | 1489 | printk("[ INFO: %s-safe -> %s-unsafe lock order detected ]\n", |
1490 | irqclass, irqclass); | 1490 | irqclass, irqclass); |
1491 | print_kernel_version(); | 1491 | print_kernel_ident(); |
1492 | printk("------------------------------------------------------\n"); | 1492 | printk("------------------------------------------------------\n"); |
1493 | printk("%s/%d [HC%u[%lu]:SC%u[%lu]:HE%u:SE%u] is trying to acquire:\n", | 1493 | printk("%s/%d [HC%u[%lu]:SC%u[%lu]:HE%u:SE%u] is trying to acquire:\n", |
1494 | curr->comm, task_pid_nr(curr), | 1494 | curr->comm, task_pid_nr(curr), |
@@ -1717,7 +1717,7 @@ print_deadlock_bug(struct task_struct *curr, struct held_lock *prev, | |||
1717 | printk("\n"); | 1717 | printk("\n"); |
1718 | printk("=============================================\n"); | 1718 | printk("=============================================\n"); |
1719 | printk("[ INFO: possible recursive locking detected ]\n"); | 1719 | printk("[ INFO: possible recursive locking detected ]\n"); |
1720 | print_kernel_version(); | 1720 | print_kernel_ident(); |
1721 | printk("---------------------------------------------\n"); | 1721 | printk("---------------------------------------------\n"); |
1722 | printk("%s/%d is trying to acquire lock:\n", | 1722 | printk("%s/%d is trying to acquire lock:\n", |
1723 | curr->comm, task_pid_nr(curr)); | 1723 | curr->comm, task_pid_nr(curr)); |
@@ -2224,7 +2224,7 @@ print_usage_bug(struct task_struct *curr, struct held_lock *this, | |||
2224 | printk("\n"); | 2224 | printk("\n"); |
2225 | printk("=================================\n"); | 2225 | printk("=================================\n"); |
2226 | printk("[ INFO: inconsistent lock state ]\n"); | 2226 | printk("[ INFO: inconsistent lock state ]\n"); |
2227 | print_kernel_version(); | 2227 | print_kernel_ident(); |
2228 | printk("---------------------------------\n"); | 2228 | printk("---------------------------------\n"); |
2229 | 2229 | ||
2230 | printk("inconsistent {%s} -> {%s} usage.\n", | 2230 | printk("inconsistent {%s} -> {%s} usage.\n", |
@@ -2289,7 +2289,7 @@ print_irq_inversion_bug(struct task_struct *curr, | |||
2289 | printk("\n"); | 2289 | printk("\n"); |
2290 | printk("=========================================================\n"); | 2290 | printk("=========================================================\n"); |
2291 | printk("[ INFO: possible irq lock inversion dependency detected ]\n"); | 2291 | printk("[ INFO: possible irq lock inversion dependency detected ]\n"); |
2292 | print_kernel_version(); | 2292 | print_kernel_ident(); |
2293 | printk("---------------------------------------------------------\n"); | 2293 | printk("---------------------------------------------------------\n"); |
2294 | printk("%s/%d just changed the state of lock:\n", | 2294 | printk("%s/%d just changed the state of lock:\n", |
2295 | curr->comm, task_pid_nr(curr)); | 2295 | curr->comm, task_pid_nr(curr)); |
@@ -3175,6 +3175,7 @@ print_unlock_inbalance_bug(struct task_struct *curr, struct lockdep_map *lock, | |||
3175 | printk("\n"); | 3175 | printk("\n"); |
3176 | printk("=====================================\n"); | 3176 | printk("=====================================\n"); |
3177 | printk("[ BUG: bad unlock balance detected! ]\n"); | 3177 | printk("[ BUG: bad unlock balance detected! ]\n"); |
3178 | print_kernel_ident(); | ||
3178 | printk("-------------------------------------\n"); | 3179 | printk("-------------------------------------\n"); |
3179 | printk("%s/%d is trying to release lock (", | 3180 | printk("%s/%d is trying to release lock (", |
3180 | curr->comm, task_pid_nr(curr)); | 3181 | curr->comm, task_pid_nr(curr)); |
@@ -3619,6 +3620,7 @@ print_lock_contention_bug(struct task_struct *curr, struct lockdep_map *lock, | |||
3619 | printk("\n"); | 3620 | printk("\n"); |
3620 | printk("=================================\n"); | 3621 | printk("=================================\n"); |
3621 | printk("[ BUG: bad contention detected! ]\n"); | 3622 | printk("[ BUG: bad contention detected! ]\n"); |
3623 | print_kernel_ident(); | ||
3622 | printk("---------------------------------\n"); | 3624 | printk("---------------------------------\n"); |
3623 | printk("%s/%d is trying to contend lock (", | 3625 | printk("%s/%d is trying to contend lock (", |
3624 | curr->comm, task_pid_nr(curr)); | 3626 | curr->comm, task_pid_nr(curr)); |
@@ -3974,7 +3976,8 @@ void __init lockdep_info(void) | |||
3974 | 3976 | ||
3975 | #ifdef CONFIG_DEBUG_LOCKDEP | 3977 | #ifdef CONFIG_DEBUG_LOCKDEP |
3976 | if (lockdep_init_error) { | 3978 | if (lockdep_init_error) { |
3977 | printk("WARNING: lockdep init error! Arch code didn't call lockdep_init() early enough?\n"); | 3979 | printk("WARNING: lockdep init error! lock-%s was acquired" |
3980 | "before lockdep_init\n", lock_init_error); | ||
3978 | printk("Call stack leading to lockdep invocation was:\n"); | 3981 | printk("Call stack leading to lockdep invocation was:\n"); |
3979 | print_stack_trace(&lockdep_init_trace, 0); | 3982 | print_stack_trace(&lockdep_init_trace, 0); |
3980 | } | 3983 | } |
@@ -3993,6 +3996,7 @@ print_freed_lock_bug(struct task_struct *curr, const void *mem_from, | |||
3993 | printk("\n"); | 3996 | printk("\n"); |
3994 | printk("=========================\n"); | 3997 | printk("=========================\n"); |
3995 | printk("[ BUG: held lock freed! ]\n"); | 3998 | printk("[ BUG: held lock freed! ]\n"); |
3999 | print_kernel_ident(); | ||
3996 | printk("-------------------------\n"); | 4000 | printk("-------------------------\n"); |
3997 | printk("%s/%d is freeing memory %p-%p, with a lock still held there!\n", | 4001 | printk("%s/%d is freeing memory %p-%p, with a lock still held there!\n", |
3998 | curr->comm, task_pid_nr(curr), mem_from, mem_to-1); | 4002 | curr->comm, task_pid_nr(curr), mem_from, mem_to-1); |
@@ -4050,6 +4054,7 @@ static void print_held_locks_bug(struct task_struct *curr) | |||
4050 | printk("\n"); | 4054 | printk("\n"); |
4051 | printk("=====================================\n"); | 4055 | printk("=====================================\n"); |
4052 | printk("[ BUG: lock held at task exit time! ]\n"); | 4056 | printk("[ BUG: lock held at task exit time! ]\n"); |
4057 | print_kernel_ident(); | ||
4053 | printk("-------------------------------------\n"); | 4058 | printk("-------------------------------------\n"); |
4054 | printk("%s/%d is exiting with locks still held!\n", | 4059 | printk("%s/%d is exiting with locks still held!\n", |
4055 | curr->comm, task_pid_nr(curr)); | 4060 | curr->comm, task_pid_nr(curr)); |
@@ -4147,6 +4152,7 @@ void lockdep_sys_exit(void) | |||
4147 | printk("\n"); | 4152 | printk("\n"); |
4148 | printk("================================================\n"); | 4153 | printk("================================================\n"); |
4149 | printk("[ BUG: lock held when returning to user space! ]\n"); | 4154 | printk("[ BUG: lock held when returning to user space! ]\n"); |
4155 | print_kernel_ident(); | ||
4150 | printk("------------------------------------------------\n"); | 4156 | printk("------------------------------------------------\n"); |
4151 | printk("%s/%d is leaving the kernel with locks still held!\n", | 4157 | printk("%s/%d is leaving the kernel with locks still held!\n", |
4152 | curr->comm, curr->pid); | 4158 | curr->comm, curr->pid); |
@@ -4166,10 +4172,33 @@ void lockdep_rcu_suspicious(const char *file, const int line, const char *s) | |||
4166 | printk("\n"); | 4172 | printk("\n"); |
4167 | printk("===============================\n"); | 4173 | printk("===============================\n"); |
4168 | printk("[ INFO: suspicious RCU usage. ]\n"); | 4174 | printk("[ INFO: suspicious RCU usage. ]\n"); |
4175 | print_kernel_ident(); | ||
4169 | printk("-------------------------------\n"); | 4176 | printk("-------------------------------\n"); |
4170 | printk("%s:%d %s!\n", file, line, s); | 4177 | printk("%s:%d %s!\n", file, line, s); |
4171 | printk("\nother info that might help us debug this:\n\n"); | 4178 | printk("\nother info that might help us debug this:\n\n"); |
4172 | printk("\nrcu_scheduler_active = %d, debug_locks = %d\n", rcu_scheduler_active, debug_locks); | 4179 | printk("\nrcu_scheduler_active = %d, debug_locks = %d\n", rcu_scheduler_active, debug_locks); |
4180 | |||
4181 | /* | ||
4182 | * If a CPU is in the RCU-free window in idle (ie: in the section | ||
4183 | * between rcu_idle_enter() and rcu_idle_exit(), then RCU | ||
4184 | * considers that CPU to be in an "extended quiescent state", | ||
4185 | * which means that RCU will be completely ignoring that CPU. | ||
4186 | * Therefore, rcu_read_lock() and friends have absolutely no | ||
4187 | * effect on a CPU running in that state. In other words, even if | ||
4188 | * such an RCU-idle CPU has called rcu_read_lock(), RCU might well | ||
4189 | * delete data structures out from under it. RCU really has no | ||
4190 | * choice here: we need to keep an RCU-free window in idle where | ||
4191 | * the CPU may possibly enter into low power mode. This way we can | ||
4192 | * notice an extended quiescent state to other CPUs that started a grace | ||
4193 | * period. Otherwise we would delay any grace period as long as we run | ||
4194 | * in the idle task. | ||
4195 | * | ||
4196 | * So complain bitterly if someone does call rcu_read_lock(), | ||
4197 | * rcu_read_lock_bh() and so on from extended quiescent states. | ||
4198 | */ | ||
4199 | if (rcu_is_cpu_idle()) | ||
4200 | printk("RCU used illegally from extended quiescent state!\n"); | ||
4201 | |||
4173 | lockdep_print_held_locks(curr); | 4202 | lockdep_print_held_locks(curr); |
4174 | printk("\nstack backtrace:\n"); | 4203 | printk("\nstack backtrace:\n"); |
4175 | dump_stack(); | 4204 | dump_stack(); |