]> git.neil.brown.name Git - history.git/commitdiff
[SPARC64]: Implement _raw_spin_lock_flags().
authorDavid S. Miller <davem@nuts.davemloft.net>
Tue, 25 May 2004 15:01:48 +0000 (08:01 -0700)
committerDavid S. Miller <davem@nuts.davemloft.net>
Tue, 25 May 2004 15:01:48 +0000 (08:01 -0700)
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/lib/Makefile
arch/sparc64/lib/splock.S [new file with mode: 0644]
include/asm-sparc64/spinlock.h

index 6501896d947270f70b365ecbcbf8c69109888b6d..18f1fabcbb1eeccecb151ef36d9e9399e0584f1b 100644 (file)
@@ -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 */
index f94b2b08bb995053db40b97bad7f9ef90eb9cfe1..14a4c728b13c160fb7d4c99976fc10bdd6245ceb 100644 (file)
@@ -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 (file)
index 0000000..d17a3ba
--- /dev/null
@@ -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
index 10e5cf326dc23d53204e504fa3990ec23b78bab4..08a6e551c2d498b7ab98a660867ffe3e1fbb8973 100644 (file)
@@ -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