This stack check implementation leverages the compiler's profiling (gcc -p)
[linux-2.6.git] / arch / sparc64 / lib / debuglocks.c
index 7b68a4d..9e083e2 100644 (file)
@@ -55,7 +55,7 @@ void _do_spin_lock(spinlock_t *lock, char *str)
 {
        unsigned long caller, val;
        int stuck = INIT_STUCK;
-       int cpu = smp_processor_id();
+       int cpu = get_cpu();
        int shown = 0;
 
        GET_CALLER(caller);
@@ -80,12 +80,14 @@ again:
        lock->owner_cpu = cpu;
        current->thread.smp_lock_count++;
        current->thread.smp_lock_pc = ((unsigned int)caller);
+
+       put_cpu();
 }
 
 int _spin_trylock(spinlock_t *lock)
 {
        unsigned long val, caller;
-       int cpu = smp_processor_id();
+       int cpu = get_cpu();
 
        GET_CALLER(caller);
        __asm__ __volatile__("ldstub [%1], %0"
@@ -99,6 +101,9 @@ int _spin_trylock(spinlock_t *lock)
                current->thread.smp_lock_count++;
                current->thread.smp_lock_pc = ((unsigned int)caller);
        }
+
+       put_cpu();
+
        return val == 0;
 }
 
@@ -117,7 +122,7 @@ void _do_read_lock (rwlock_t *rw, char *str)
 {
        unsigned long caller, val;
        int stuck = INIT_STUCK;
-       int cpu = smp_processor_id();
+       int cpu = get_cpu();
        int shown = 0;
 
        GET_CALLER(caller);
@@ -148,13 +153,15 @@ wlock_again:
        rw->reader_pc[cpu] = ((unsigned int)caller);
        current->thread.smp_lock_count++;
        current->thread.smp_lock_pc = ((unsigned int)caller);
+
+       put_cpu();
 }
 
 void _do_read_unlock (rwlock_t *rw, char *str)
 {
        unsigned long caller, val;
        int stuck = INIT_STUCK;
-       int cpu = smp_processor_id();
+       int cpu = get_cpu();
        int shown = 0;
 
        GET_CALLER(caller);
@@ -181,13 +188,15 @@ runlock_again:
                }
                goto runlock_again;
        }
+
+       put_cpu();
 }
 
 void _do_write_lock (rwlock_t *rw, char *str)
 {
        unsigned long caller, val;
        int stuck = INIT_STUCK;
-       int cpu = smp_processor_id();
+       int cpu = get_cpu();
        int shown = 0;
 
        GET_CALLER(caller);
@@ -263,6 +272,8 @@ wlock_again:
        rw->writer_cpu = cpu;
        current->thread.smp_lock_count++;
        current->thread.smp_lock_pc = ((unsigned int)caller);
+
+       put_cpu();
 }
 
 void _do_write_unlock(rwlock_t *rw)
@@ -302,7 +313,7 @@ wlock_again:
 int _do_write_trylock (rwlock_t *rw, char *str)
 {
        unsigned long caller, val;
-       int cpu = smp_processor_id();
+       int cpu = get_cpu();
 
        GET_CALLER(caller);
 
@@ -322,8 +333,10 @@ int _do_write_trylock (rwlock_t *rw, char *str)
        : "0" (&(rw->lock))
        : "g3", "g5", "g7", "memory");
 
-       if (val)
+       if (val) {
+               put_cpu();
                return 0;
+       }
 
        if ((rw->lock & ((1UL<<63)-1UL)) != 0UL) {
                /* Readers still around, drop the write
@@ -342,6 +355,8 @@ int _do_write_trylock (rwlock_t *rw, char *str)
                : "r" (&(rw->lock))
                : "g3", "g5", "g7", "cc", "memory");
 
+               put_cpu();
+
                return 0;
        }
 
@@ -351,6 +366,8 @@ int _do_write_trylock (rwlock_t *rw, char *str)
        current->thread.smp_lock_count++;
        current->thread.smp_lock_pc = ((unsigned int)caller);
 
+       put_cpu();
+
        return 1;
 }