diff options
| author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2007-10-11 16:11:12 -0400 |
|---|---|---|
| committer | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2007-10-11 16:11:12 -0400 |
| commit | b351d164e860d1ffffdc501c32f55dd1446c385b (patch) | |
| tree | 6fcef2c4ece9ff2772306a3b65e9c7e2fcc4d39a | |
| parent | e4564f79d4b6923da7360df4b24a48cc2d4160de (diff) | |
lockdep: syscall exit check
Provide a check to validate that we do not hold any locks when switching
back to user-space.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | include/linux/lockdep.h | 2 | ||||
| -rw-r--r-- | kernel/lockdep.c | 16 |
2 files changed, 18 insertions, 0 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 0e843bf65877..9dc46db2985e 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h | |||
| @@ -238,6 +238,7 @@ extern void lockdep_info(void); | |||
| 238 | extern void lockdep_reset(void); | 238 | extern void lockdep_reset(void); |
| 239 | extern void lockdep_reset_lock(struct lockdep_map *lock); | 239 | extern void lockdep_reset_lock(struct lockdep_map *lock); |
| 240 | extern void lockdep_free_key_range(void *start, unsigned long size); | 240 | extern void lockdep_free_key_range(void *start, unsigned long size); |
| 241 | extern void lockdep_sys_exit(void); | ||
| 241 | 242 | ||
| 242 | extern void lockdep_off(void); | 243 | extern void lockdep_off(void); |
| 243 | extern void lockdep_on(void); | 244 | extern void lockdep_on(void); |
| @@ -317,6 +318,7 @@ static inline void lockdep_on(void) | |||
| 317 | # define INIT_LOCKDEP | 318 | # define INIT_LOCKDEP |
| 318 | # define lockdep_reset() do { debug_locks = 1; } while (0) | 319 | # define lockdep_reset() do { debug_locks = 1; } while (0) |
| 319 | # define lockdep_free_key_range(start, size) do { } while (0) | 320 | # define lockdep_free_key_range(start, size) do { } while (0) |
| 321 | # define lockdep_sys_exit() do { } while (0) | ||
| 320 | /* | 322 | /* |
| 321 | * The class key takes no space if lockdep is disabled: | 323 | * The class key takes no space if lockdep is disabled: |
| 322 | */ | 324 | */ |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 42ae4a5ab4dc..a6f1ee9c92d9 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -3199,3 +3199,19 @@ void debug_show_held_locks(struct task_struct *task) | |||
| 3199 | } | 3199 | } |
| 3200 | 3200 | ||
| 3201 | EXPORT_SYMBOL_GPL(debug_show_held_locks); | 3201 | EXPORT_SYMBOL_GPL(debug_show_held_locks); |
| 3202 | |||
| 3203 | void lockdep_sys_exit(void) | ||
| 3204 | { | ||
| 3205 | struct task_struct *curr = current; | ||
| 3206 | |||
| 3207 | if (unlikely(curr->lockdep_depth)) { | ||
| 3208 | if (!debug_locks_off()) | ||
| 3209 | return; | ||
| 3210 | printk("\n================================================\n"); | ||
| 3211 | printk( "[ BUG: lock held when returning to user space! ]\n"); | ||
| 3212 | printk( "------------------------------------------------\n"); | ||
| 3213 | printk("%s/%d is leaving the kernel with locks still held!\n", | ||
| 3214 | curr->comm, curr->pid); | ||
| 3215 | lockdep_print_held_locks(curr); | ||
| 3216 | } | ||
| 3217 | } | ||
