diff options
| author | Akinobu Mita <akinobu.mita@gmail.com> | 2011-10-31 17:12:29 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-31 17:30:56 -0700 | 
| commit | 4e101b0e6aa885f5786a058eefc1ce4b7cc7c44e (patch) | |
| tree | 427a6aa51ec4a278bcfc749d4a8129cf9fe20f83 /lib | |
| parent | 1dff46d6987484eaa31f2fb1425216ba06418be3 (diff) | |
| download | olio-linux-3.10-4e101b0e6aa885f5786a058eefc1ce4b7cc7c44e.tar.xz olio-linux-3.10-4e101b0e6aa885f5786a058eefc1ce4b7cc7c44e.zip  | |
lib/spinlock_debug.c: print owner on spinlock lockup
When SPIN_BUG_ON is triggered, the lock owner information is reported.
But it is omitted when spinlock lockup is detected.
This information is useful especially on the architectures which don't
implement trigger_all_cpu_backtrace() that is called just after detecting
lockup.  So report it and also avoid message format duplication.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/spinlock_debug.c | 19 | 
1 files changed, 10 insertions, 9 deletions
diff --git a/lib/spinlock_debug.c b/lib/spinlock_debug.c index 4755b98b6df..5f3eacdd617 100644 --- a/lib/spinlock_debug.c +++ b/lib/spinlock_debug.c @@ -49,13 +49,10 @@ void __rwlock_init(rwlock_t *lock, const char *name,  EXPORT_SYMBOL(__rwlock_init); -static void spin_bug(raw_spinlock_t *lock, const char *msg) +static void spin_dump(raw_spinlock_t *lock, const char *msg)  {  	struct task_struct *owner = NULL; -	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", @@ -70,6 +67,14 @@ static void spin_bug(raw_spinlock_t *lock, const char *msg)  	dump_stack();  } +static void spin_bug(raw_spinlock_t *lock, const char *msg) +{ +	if (!debug_locks_off()) +		return; + +	spin_dump(lock, msg); +} +  #define SPIN_BUG_ON(cond, lock, msg) if (unlikely(cond)) spin_bug(lock, msg)  static inline void @@ -113,11 +118,7 @@ static void __spin_lock_debug(raw_spinlock_t *lock)  		/* lockup suspected: */  		if (print_once) {  			print_once = 0; -			printk(KERN_EMERG "BUG: spinlock lockup on CPU#%d, " -					"%s/%d, %p\n", -				raw_smp_processor_id(), current->comm, -				task_pid_nr(current), lock); -			dump_stack(); +			spin_dump(lock, "lockup");  #ifdef CONFIG_SMP  			trigger_all_cpu_backtrace();  #endif  |