diff options
Diffstat (limited to 'kernel/lockdep.c')
-rw-r--r-- | kernel/lockdep.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 7981e5b2350d..259db207b5d9 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -3190,9 +3190,14 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, | |||
3190 | #endif | 3190 | #endif |
3191 | if (unlikely(curr->lockdep_depth >= MAX_LOCK_DEPTH)) { | 3191 | if (unlikely(curr->lockdep_depth >= MAX_LOCK_DEPTH)) { |
3192 | debug_locks_off(); | 3192 | debug_locks_off(); |
3193 | printk("BUG: MAX_LOCK_DEPTH too low!\n"); | 3193 | printk("BUG: MAX_LOCK_DEPTH too low, depth: %i max: %lu!\n", |
3194 | curr->lockdep_depth, MAX_LOCK_DEPTH); | ||
3194 | printk("turning off the locking correctness validator.\n"); | 3195 | printk("turning off the locking correctness validator.\n"); |
3196 | |||
3197 | lockdep_print_held_locks(current); | ||
3198 | debug_show_all_locks(); | ||
3195 | dump_stack(); | 3199 | dump_stack(); |
3200 | |||
3196 | return 0; | 3201 | return 0; |
3197 | } | 3202 | } |
3198 | 3203 | ||
@@ -3203,7 +3208,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, | |||
3203 | } | 3208 | } |
3204 | 3209 | ||
3205 | static int | 3210 | static int |
3206 | print_unlock_inbalance_bug(struct task_struct *curr, struct lockdep_map *lock, | 3211 | print_unlock_imbalance_bug(struct task_struct *curr, struct lockdep_map *lock, |
3207 | unsigned long ip) | 3212 | unsigned long ip) |
3208 | { | 3213 | { |
3209 | if (!debug_locks_off()) | 3214 | if (!debug_locks_off()) |
@@ -3246,7 +3251,7 @@ static int check_unlock(struct task_struct *curr, struct lockdep_map *lock, | |||
3246 | return 0; | 3251 | return 0; |
3247 | 3252 | ||
3248 | if (curr->lockdep_depth <= 0) | 3253 | if (curr->lockdep_depth <= 0) |
3249 | return print_unlock_inbalance_bug(curr, lock, ip); | 3254 | return print_unlock_imbalance_bug(curr, lock, ip); |
3250 | 3255 | ||
3251 | return 1; | 3256 | return 1; |
3252 | } | 3257 | } |
@@ -3317,7 +3322,7 @@ __lock_set_class(struct lockdep_map *lock, const char *name, | |||
3317 | goto found_it; | 3322 | goto found_it; |
3318 | prev_hlock = hlock; | 3323 | prev_hlock = hlock; |
3319 | } | 3324 | } |
3320 | return print_unlock_inbalance_bug(curr, lock, ip); | 3325 | return print_unlock_imbalance_bug(curr, lock, ip); |
3321 | 3326 | ||
3322 | found_it: | 3327 | found_it: |
3323 | lockdep_init_map(lock, name, key, 0); | 3328 | lockdep_init_map(lock, name, key, 0); |
@@ -3384,7 +3389,7 @@ lock_release_non_nested(struct task_struct *curr, | |||
3384 | goto found_it; | 3389 | goto found_it; |
3385 | prev_hlock = hlock; | 3390 | prev_hlock = hlock; |
3386 | } | 3391 | } |
3387 | return print_unlock_inbalance_bug(curr, lock, ip); | 3392 | return print_unlock_imbalance_bug(curr, lock, ip); |
3388 | 3393 | ||
3389 | found_it: | 3394 | found_it: |
3390 | if (hlock->instance == lock) | 3395 | if (hlock->instance == lock) |
@@ -4083,7 +4088,7 @@ void debug_check_no_locks_freed(const void *mem_from, unsigned long mem_len) | |||
4083 | } | 4088 | } |
4084 | EXPORT_SYMBOL_GPL(debug_check_no_locks_freed); | 4089 | EXPORT_SYMBOL_GPL(debug_check_no_locks_freed); |
4085 | 4090 | ||
4086 | static void print_held_locks_bug(struct task_struct *curr) | 4091 | static void print_held_locks_bug(void) |
4087 | { | 4092 | { |
4088 | if (!debug_locks_off()) | 4093 | if (!debug_locks_off()) |
4089 | return; | 4094 | return; |
@@ -4092,22 +4097,21 @@ static void print_held_locks_bug(struct task_struct *curr) | |||
4092 | 4097 | ||
4093 | printk("\n"); | 4098 | printk("\n"); |
4094 | printk("=====================================\n"); | 4099 | printk("=====================================\n"); |
4095 | printk("[ BUG: lock held at task exit time! ]\n"); | 4100 | printk("[ BUG: %s/%d still has locks held! ]\n", |
4101 | current->comm, task_pid_nr(current)); | ||
4096 | print_kernel_ident(); | 4102 | print_kernel_ident(); |
4097 | printk("-------------------------------------\n"); | 4103 | printk("-------------------------------------\n"); |
4098 | printk("%s/%d is exiting with locks still held!\n", | 4104 | lockdep_print_held_locks(current); |
4099 | curr->comm, task_pid_nr(curr)); | ||
4100 | lockdep_print_held_locks(curr); | ||
4101 | |||
4102 | printk("\nstack backtrace:\n"); | 4105 | printk("\nstack backtrace:\n"); |
4103 | dump_stack(); | 4106 | dump_stack(); |
4104 | } | 4107 | } |
4105 | 4108 | ||
4106 | void debug_check_no_locks_held(struct task_struct *task) | 4109 | void debug_check_no_locks_held(void) |
4107 | { | 4110 | { |
4108 | if (unlikely(task->lockdep_depth > 0)) | 4111 | if (unlikely(current->lockdep_depth > 0)) |
4109 | print_held_locks_bug(task); | 4112 | print_held_locks_bug(); |
4110 | } | 4113 | } |
4114 | EXPORT_SYMBOL_GPL(debug_check_no_locks_held); | ||
4111 | 4115 | ||
4112 | void debug_show_all_locks(void) | 4116 | void debug_show_all_locks(void) |
4113 | { | 4117 | { |