From 41418981f43f24600cead1a6b4cbc7cfb90bde9a Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 2 Nov 2014 00:01:36 +0100 Subject: [PATCH] kernel: Sync panic messages across acquire_spinlock versions. * Always include last caller and lock value on both UP and MP path. * Change lock value printing to hex format, as 0xdeadbeef is more obvious than its decimal counterpart. --- src/system/kernel/smp.cpp | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/system/kernel/smp.cpp b/src/system/kernel/smp.cpp index 1875154e74..3a3d68f1ec 100644 --- a/src/system/kernel/smp.cpp +++ b/src/system/kernel/smp.cpp @@ -221,7 +221,7 @@ test_latency(spinlock* lock) if (sLatency[cpu][i].lock == lock) { bigtime_t diff = system_time() - sLatency[cpu][i].timestamp; if (diff > DEBUG_LATENCY && diff < 500000) { - panic("spinlock %p were held for %lld usecs (%d allowed)\n", + panic("spinlock %p was held for %lld usecs (%d allowed)\n", lock, diff, DEBUG_LATENCY); } @@ -363,7 +363,8 @@ acquire_spinlock(spinlock* lock) while (lock->lock != 0) { if (++count == SPINLOCK_DEADLOCK_COUNT) { panic("acquire_spinlock(): Failed to acquire spinlock %p " - "for a long time!", lock); + "for a long time (last caller: %p, value: %" B_PRIx32 + ")", lock, find_lock_caller(lock), lock->lock); count = 0; } @@ -380,11 +381,10 @@ acquire_spinlock(spinlock* lock) #endif } else { #if DEBUG_SPINLOCKS - int32 oldValue; - oldValue = atomic_get_and_set(&lock->lock, 1); + int32 oldValue = atomic_get_and_set(&lock->lock, 1); if (oldValue != 0) { panic("acquire_spinlock: attempt to acquire lock %p twice on " - "non-SMP system (last caller: %p, value %" B_PRId32 ")", lock, + "non-SMP system (last caller: %p, value %" B_PRIx32 ")", lock, find_lock_caller(lock), oldValue); } @@ -416,8 +416,9 @@ acquire_spinlock_nocheck(spinlock *lock) uint32 count = 0; while (lock->lock != 0) { if (++count == SPINLOCK_DEADLOCK_COUNT_NO_CHECK) { - panic("acquire_spinlock(): Failed to acquire spinlock %p " - "for a long time!", lock); + panic("acquire_spinlock_nocheck(): Failed to acquire " + "spinlock %p for a long time (last caller: %p, value: %" + B_PRIx32 ")", lock, find_lock_caller(lock), lock->lock); count = 0; } @@ -430,9 +431,11 @@ acquire_spinlock_nocheck(spinlock *lock) #endif } else { #if DEBUG_SPINLOCKS - if (atomic_get_and_set(&lock->lock, 1) != 0) { + int32 oldValue = atomic_get_and_set(&lock->lock, 1); + if (oldValue != 0) { panic("acquire_spinlock_nocheck: attempt to acquire lock %p twice " - "on non-SMP system\n", lock); + "on non-SMP system (last caller: %p, value %" B_PRIx32 ")", + lock, find_lock_caller(lock), oldValue); } #endif } @@ -460,7 +463,8 @@ acquire_spinlock_cpu(int32 currentCPU, spinlock *lock) while (lock->lock != 0) { if (++count == SPINLOCK_DEADLOCK_COUNT) { panic("acquire_spinlock_cpu(): Failed to acquire spinlock " - "%p for a long time!", lock); + "%p for a long time (last caller: %p, value: %" B_PRIx32 + ")", lock, find_lock_caller(lock), lock->lock); count = 0; } @@ -477,11 +481,10 @@ acquire_spinlock_cpu(int32 currentCPU, spinlock *lock) #endif } else { #if DEBUG_SPINLOCKS - int32 oldValue; - oldValue = atomic_get_and_set(&lock->lock, 1); + int32 oldValue = atomic_get_and_set(&lock->lock, 1); if (oldValue != 0) { panic("acquire_spinlock_cpu(): attempt to acquire lock %p twice on " - "non-SMP system (last caller: %p, value %" B_PRId32 ")", lock, + "non-SMP system (last caller: %p, value %" B_PRIx32 ")", lock, find_lock_caller(lock), oldValue); }