On Fri, 2007-09-28 at 14:03 +0200, Heiko Carstens wrote: > > +void lockdep_sys_exit(void) > > +{ > > + struct task_struct *curr = current; > > + > > + if (unlikely(curr->lockdep_depth)) { > > + if (!debug_locks_off()) > > + return; > > + printk("\n========================================\n"); > > + printk( "[ BUG: lock held at syscall exit time! ]\n"); > > + printk( "----------------------------------------\n"); > > + printk("%s/%d is leaving the kernel with locks still held!\n", > > + curr->comm, curr->pid); > > + lockdep_print_held_locks(curr); > > + } > > +} > > By the way, the s390 patch I just posted also checks if we hold any locks > when returning from interrupt context to user space. Maybe the above text > could be changed to "lock held when returning to user space" ? Good idea, I'll look at doing the same for i386/x86_64. Traps (page faults) would also make sense I guess. --- Subject: 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 <[email protected]> --- include/linux/lockdep.h | 2 ++ kernel/lockdep.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) Index: linux-2.6/include/linux/lockdep.h =================================================================== --- linux-2.6.orig/include/linux/lockdep.h +++ linux-2.6/include/linux/lockdep.h @@ -238,6 +238,7 @@ extern void lockdep_info(void); extern void lockdep_reset(void); extern void lockdep_reset_lock(struct lockdep_map *lock); extern void lockdep_free_key_range(void *start, unsigned long size); +extern void lockdep_sys_exit(void); extern void lockdep_off(void); extern void lockdep_on(void); @@ -317,6 +318,7 @@ static inline void lockdep_on(void) # define INIT_LOCKDEP # define lockdep_reset() do { debug_locks = 1; } while (0) # define lockdep_free_key_range(start, size) do { } while (0) +# define lockdep_sys_exit() do { } while (0) /* * The class key takes no space if lockdep is disabled: */ Index: linux-2.6/kernel/lockdep.c =================================================================== --- linux-2.6.orig/kernel/lockdep.c +++ linux-2.6/kernel/lockdep.c @@ -3199,3 +3199,19 @@ void debug_show_held_locks(struct task_s } EXPORT_SYMBOL_GPL(debug_show_held_locks); + +void lockdep_sys_exit(void) +{ + struct task_struct *curr = current; + + if (unlikely(curr->lockdep_depth)) { + if (!debug_locks_off()) + return; + printk("\n================================================\n"); + printk( "[ BUG: lock held when returning to user space! ]\n"); + printk( "------------------------------------------------\n"); + printk("%s/%d is leaving the kernel with locks still held!\n", + curr->comm, curr->pid); + lockdep_print_held_locks(curr); + } +}
Attachment:
signature.asc
Description: This is a digitally signed message part
- Follow-Ups:
- Re: [PATCH 01/12] lockdep: syscall exit check
- From: Heiko Carstens <[email protected]>
- Re: [PATCH 01/12] lockdep: syscall exit check
- References:
- [PATCH 00/12] various lockdep patches
- From: Peter Zijlstra <[email protected]>
- [PATCH 01/12] lockdep: syscall exit check
- From: Peter Zijlstra <[email protected]>
- Re: [PATCH 01/12] lockdep: syscall exit check
- From: Heiko Carstens <[email protected]>
- [PATCH 00/12] various lockdep patches
- Prev by Date: Re: [RFC] New kernel-message logging API (take 2)
- Next by Date: Re: software unplug and plug USB
- Previous by thread: Re: [PATCH 01/12] lockdep: syscall exit check
- Next by thread: Re: [PATCH 01/12] lockdep: syscall exit check
- Index(es):