diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-07-05 13:13:03 -0400 | 
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-07-05 13:13:03 -0400 | 
| commit | 5e66dd6d66ffe758b39b6dcadf2330753ee1159b (patch) | |
| tree | a72cdcff4448e4af9425cc213ddf56ab23e697fe /lib/spinlock_debug.c | |
| parent | 026477c1141b67e98e3bd8bdedb7d4b88a3ecd09 (diff) | |
| parent | ca78f6baca863afe2e6a244a0fe94b3a70211d46 (diff) | |
Merge branch 'master' of /home/trondmy/kernel/linux-2.6/
Diffstat (limited to 'lib/spinlock_debug.c')
| -rw-r--r-- | lib/spinlock_debug.c | 98 | 
1 files changed, 62 insertions, 36 deletions
| diff --git a/lib/spinlock_debug.c b/lib/spinlock_debug.c index 93c15ee3f8ea..3d9c4dc965ed 100644 --- a/lib/spinlock_debug.c +++ b/lib/spinlock_debug.c @@ -8,38 +8,71 @@  #include <linux/spinlock.h>  #include <linux/interrupt.h> +#include <linux/debug_locks.h>  #include <linux/delay.h> +#include <linux/module.h> + +void __spin_lock_init(spinlock_t *lock, const char *name, +		      struct lock_class_key *key) +{ +#ifdef CONFIG_DEBUG_LOCK_ALLOC +	/* +	 * Make sure we are not reinitializing a held lock: +	 */ +	debug_check_no_locks_freed((void *)lock, sizeof(*lock)); +	lockdep_init_map(&lock->dep_map, name, key); +#endif +	lock->raw_lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED; +	lock->magic = SPINLOCK_MAGIC; +	lock->owner = SPINLOCK_OWNER_INIT; +	lock->owner_cpu = -1; +} + +EXPORT_SYMBOL(__spin_lock_init); + +void __rwlock_init(rwlock_t *lock, const char *name, +		   struct lock_class_key *key) +{ +#ifdef CONFIG_DEBUG_LOCK_ALLOC +	/* +	 * Make sure we are not reinitializing a held lock: +	 */ +	debug_check_no_locks_freed((void *)lock, sizeof(*lock)); +	lockdep_init_map(&lock->dep_map, name, key); +#endif +	lock->raw_lock = (raw_rwlock_t) __RAW_RW_LOCK_UNLOCKED; +	lock->magic = RWLOCK_MAGIC; +	lock->owner = SPINLOCK_OWNER_INIT; +	lock->owner_cpu = -1; +} + +EXPORT_SYMBOL(__rwlock_init);  static void spin_bug(spinlock_t *lock, const char *msg)  { -	static long print_once = 1;  	struct task_struct *owner = NULL; -	if (xchg(&print_once, 0)) { -		if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT) -			owner = lock->owner; -		printk(KERN_EMERG "BUG: spinlock %s on CPU#%d, %s/%d\n", -			msg, raw_smp_processor_id(), -			current->comm, current->pid); -		printk(KERN_EMERG " lock: %p, .magic: %08x, .owner: %s/%d, " -				".owner_cpu: %d\n", -			lock, lock->magic, -			owner ? owner->comm : "<none>", -			owner ? owner->pid : -1, -			lock->owner_cpu); -		dump_stack(); -#ifdef CONFIG_SMP -		/* -		 * We cannot continue on SMP: -		 */ -//		panic("bad locking"); -#endif -	} +	if (!debug_locks_off()) +		return; + +	if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT) +		owner = lock->owner; +	printk(KERN_EMERG "BUG: spinlock %s on CPU#%d, %s/%d\n", +		msg, raw_smp_processor_id(), +		current->comm, current->pid); +	printk(KERN_EMERG " lock: %p, .magic: %08x, .owner: %s/%d, " +			".owner_cpu: %d\n", +		lock, lock->magic, +		owner ? owner->comm : "<none>", +		owner ? owner->pid : -1, +		lock->owner_cpu); +	dump_stack();  }  #define SPIN_BUG_ON(cond, lock, msg) if (unlikely(cond)) spin_bug(lock, msg) -static inline void debug_spin_lock_before(spinlock_t *lock) +static inline void +debug_spin_lock_before(spinlock_t *lock)  {  	SPIN_BUG_ON(lock->magic != SPINLOCK_MAGIC, lock, "bad magic");  	SPIN_BUG_ON(lock->owner == current, lock, "recursion"); @@ -118,20 +151,13 @@ void _raw_spin_unlock(spinlock_t *lock)  static void rwlock_bug(rwlock_t *lock, const char *msg)  { -	static long print_once = 1; - -	if (xchg(&print_once, 0)) { -		printk(KERN_EMERG "BUG: rwlock %s on CPU#%d, %s/%d, %p\n", -			msg, raw_smp_processor_id(), current->comm, -			current->pid, lock); -		dump_stack(); -#ifdef CONFIG_SMP -		/* -		 * We cannot continue on SMP: -		 */ -		panic("bad locking"); -#endif -	} +	if (!debug_locks_off()) +		return; + +	printk(KERN_EMERG "BUG: rwlock %s on CPU#%d, %s/%d, %p\n", +		msg, raw_smp_processor_id(), current->comm, +		current->pid, lock); +	dump_stack();  }  #define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg) | 
