X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-ppc%2Fspinlock.h;h=909199aae1047f2baf6934e384bd0918eb3f855e;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=d91ba524d8fde3d49007a7f014d0184a0e827e54;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/include/asm-ppc/spinlock.h b/include/asm-ppc/spinlock.h index d91ba524d..909199aae 100644 --- a/include/asm-ppc/spinlock.h +++ b/include/asm-ppc/spinlock.h @@ -13,6 +13,9 @@ typedef struct { volatile unsigned long owner_pc; volatile unsigned long owner_cpu; #endif +#ifdef CONFIG_PREEMPT + unsigned int break_lock; +#endif } spinlock_t; #ifdef __KERNEL__ @@ -79,28 +82,43 @@ extern int _raw_spin_trylock(spinlock_t *lock); * read-locks. */ typedef struct { - volatile unsigned long lock; -#ifdef CONFIG_DEBUG_SPINLOCK - volatile unsigned long owner_pc; + volatile signed int lock; +#ifdef CONFIG_PREEMPT + unsigned int break_lock; #endif } rwlock_t; -#ifdef CONFIG_DEBUG_SPINLOCK -#define RWLOCK_DEBUG_INIT , 0 -#else -#define RWLOCK_DEBUG_INIT /* */ -#endif - -#define RW_LOCK_UNLOCKED (rwlock_t) { 0 RWLOCK_DEBUG_INIT } +#define RW_LOCK_UNLOCKED (rwlock_t) { 0 } #define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0) -#define rwlock_is_locked(x) ((x)->lock != 0) +#define read_can_lock(rw) ((rw)->lock >= 0) +#define write_can_lock(rw) (!(rw)->lock) #ifndef CONFIG_DEBUG_SPINLOCK +static __inline__ int _raw_read_trylock(rwlock_t *rw) +{ + signed int tmp; + + __asm__ __volatile__( +"2: lwarx %0,0,%1 # read_trylock\n\ + addic. %0,%0,1\n\ + ble- 1f\n" + PPC405_ERR77(0,%1) +" stwcx. %0,0,%1\n\ + bne- 2b\n\ + isync\n\ +1:" + : "=&r"(tmp) + : "r"(&rw->lock) + : "cr0", "memory"); + + return tmp > 0; +} + static __inline__ void _raw_read_lock(rwlock_t *rw) { - unsigned int tmp; + signed int tmp; __asm__ __volatile__( "b 2f # read_lock\n\ @@ -121,7 +139,7 @@ static __inline__ void _raw_read_lock(rwlock_t *rw) static __inline__ void _raw_read_unlock(rwlock_t *rw) { - unsigned int tmp; + signed int tmp; __asm__ __volatile__( "eieio # read_unlock\n\ @@ -137,7 +155,7 @@ static __inline__ void _raw_read_unlock(rwlock_t *rw) static __inline__ int _raw_write_trylock(rwlock_t *rw) { - unsigned int tmp; + signed int tmp; __asm__ __volatile__( "2: lwarx %0,0,%1 # write_trylock\n\ @@ -157,7 +175,7 @@ static __inline__ int _raw_write_trylock(rwlock_t *rw) static __inline__ void _raw_write_lock(rwlock_t *rw) { - unsigned int tmp; + signed int tmp; __asm__ __volatile__( "b 2f # write_lock\n\ @@ -188,6 +206,7 @@ extern void _raw_read_lock(rwlock_t *rw); extern void _raw_read_unlock(rwlock_t *rw); extern void _raw_write_lock(rwlock_t *rw); extern void _raw_write_unlock(rwlock_t *rw); +extern int _raw_read_trylock(rwlock_t *rw); extern int _raw_write_trylock(rwlock_t *rw); #endif