From: David S. Miller Date: Tue, 25 May 2004 15:01:48 +0000 (-0700) Subject: [SPARC64]: Implement _raw_spin_lock_flags(). X-Git-Tag: v2.6.7-rc2~56 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=2989ea106150da683f5a5ae8bf48fa03b0414af2;p=history.git [SPARC64]: Implement _raw_spin_lock_flags(). --- diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c index 6501896d9472..18f1fabcbb1e 100644 --- a/arch/sparc64/kernel/sparc64_ksyms.c +++ b/arch/sparc64/kernel/sparc64_ksyms.c @@ -133,6 +133,8 @@ EXPORT_SYMBOL(__read_unlock); EXPORT_SYMBOL(__write_lock); EXPORT_SYMBOL(__write_unlock); EXPORT_SYMBOL(__write_trylock); +/* Out of line spin-locking implementation. */ +EXPORT_SYMBOL(_raw_spin_lock_flags); #endif /* Hard IRQ locking */ diff --git a/arch/sparc64/lib/Makefile b/arch/sparc64/lib/Makefile index f94b2b08bb99..14a4c728b13c 100644 --- a/arch/sparc64/lib/Makefile +++ b/arch/sparc64/lib/Makefile @@ -10,7 +10,7 @@ lib-y := PeeCeeI.o blockops.o strlen.o strncmp.o \ VIScopy.o VISbzero.o VISmemset.o VIScsum.o VIScsumcopy.o \ VIScsumcopyusr.o VISsave.o atomic.o rwlock.o bitops.o \ U3memcpy.o U3copy_from_user.o U3copy_to_user.o \ - U3copy_in_user.o mcount.o ipcsum.o rwsem.o xor.o + U3copy_in_user.o mcount.o ipcsum.o rwsem.o xor.o splock.o lib-$(CONFIG_DEBUG_SPINLOCK) += debuglocks.o lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o diff --git a/arch/sparc64/lib/splock.S b/arch/sparc64/lib/splock.S new file mode 100644 index 000000000000..d17a3badda72 --- /dev/null +++ b/arch/sparc64/lib/splock.S @@ -0,0 +1,23 @@ +/* splock.S: Spinlock primitives too large to inline. + * + * Copyright (C) 2004 David S. Miller (davem@redhat.com) + */ + + .text + .align 64 + + .globl _raw_spin_lock_flags +_raw_spin_lock_flags: /* %o0 = lock_ptr, %o1 = irq_flags */ +1: ldstub [%o0], %g7 + brnz,pn %g7, 2f + membar #StoreLoad | #StoreStore + retl + nop + +2: rdpr %pil, %g2 ! Save PIL + wrpr %o1, %pil ! Set previous PIL +3: ldub [%o0], %g7 ! Spin on lock set + brnz,pt %g7, 3b + membar #LoadLoad + ba,pt %xcc, 1b ! Retry lock acquire + wrpr %g2, %pil ! Restore PIL diff --git a/include/asm-sparc64/spinlock.h b/include/asm-sparc64/spinlock.h index 10e5cf326dc2..08a6e551c2d4 100644 --- a/include/asm-sparc64/spinlock.h +++ b/include/asm-sparc64/spinlock.h @@ -78,6 +78,8 @@ static __inline__ void _raw_spin_unlock(spinlock_t *lock) : "memory"); } +extern void _raw_spin_lock_flags(spinlock_t *lock, unsigned long flags); + #else /* !(CONFIG_DEBUG_SPINLOCK) */ typedef struct { @@ -103,11 +105,10 @@ extern int _spin_trylock (spinlock_t *lock); #define _raw_spin_trylock(lp) _spin_trylock(lp) #define _raw_spin_lock(lock) _do_spin_lock(lock, "spin_lock") #define _raw_spin_unlock(lock) _do_spin_unlock(lock) +#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock) #endif /* CONFIG_DEBUG_SPINLOCK */ -#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock) - /* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */ #ifndef CONFIG_DEBUG_SPINLOCK