locking: Simplify spinlock inlining
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Mon, 31 Aug 2009 12:43:38 +0000 (14:43 +0200)
committerIngo Molnar <mingo@elte.hu>
Mon, 31 Aug 2009 16:08:51 +0000 (18:08 +0200)
For !DEBUG_SPINLOCK && !PREEMPT && SMP the spin_unlock()
functions were always inlined by using special defines which
would call the __raw* functions.

The out-of-line variants for these functions would be generated
anyway.

Use the new per unlock/locking variant mechanism to force
inlining of the unlock functions like before. This is not a
functional change, we just get rid of one additional way to
force inlining.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Horst Hartmann <horsth@linux.vnet.ibm.com>
Cc: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Miller <davem@davemloft.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: <linux-arch@vger.kernel.org>
LKML-Reference: <20090831124418.848735034@de.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
include/linux/spinlock.h
include/linux/spinlock_api_smp.h

index da76a06556bd12a809607cf9f885bb38dffd64c3..f0ca7a7a17572f5843d27a782e4d882f4152aea7 100644 (file)
@@ -259,50 +259,16 @@ static inline void smp_mb__after_lock(void) { smp_mb(); }
 
 #define spin_lock_irq(lock)            _spin_lock_irq(lock)
 #define spin_lock_bh(lock)             _spin_lock_bh(lock)
-
 #define read_lock_irq(lock)            _read_lock_irq(lock)
 #define read_lock_bh(lock)             _read_lock_bh(lock)
-
 #define write_lock_irq(lock)           _write_lock_irq(lock)
 #define write_lock_bh(lock)            _write_lock_bh(lock)
-
-/*
- * We inline the unlock functions in the nondebug case:
- */
-#if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || \
-       !defined(CONFIG_SMP)
-# define spin_unlock(lock)             _spin_unlock(lock)
-# define read_unlock(lock)             _read_unlock(lock)
-# define write_unlock(lock)            _write_unlock(lock)
-# define spin_unlock_irq(lock)         _spin_unlock_irq(lock)
-# define read_unlock_irq(lock)         _read_unlock_irq(lock)
-# define write_unlock_irq(lock)                _write_unlock_irq(lock)
-#else
-# define spin_unlock(lock) \
-    do {__raw_spin_unlock(&(lock)->raw_lock); __release(lock); } while (0)
-# define read_unlock(lock) \
-    do {__raw_read_unlock(&(lock)->raw_lock); __release(lock); } while (0)
-# define write_unlock(lock) \
-    do {__raw_write_unlock(&(lock)->raw_lock); __release(lock); } while (0)
-# define spin_unlock_irq(lock)                 \
-do {                                           \
-       __raw_spin_unlock(&(lock)->raw_lock);   \
-       __release(lock);                        \
-       local_irq_enable();                     \
-} while (0)
-# define read_unlock_irq(lock)                 \
-do {                                           \
-       __raw_read_unlock(&(lock)->raw_lock);   \
-       __release(lock);                        \
-       local_irq_enable();                     \
-} while (0)
-# define write_unlock_irq(lock)                        \
-do {                                           \
-       __raw_write_unlock(&(lock)->raw_lock);  \
-       __release(lock);                        \
-       local_irq_enable();                     \
-} while (0)
-#endif
+#define spin_unlock(lock)              _spin_unlock(lock)
+#define read_unlock(lock)              _read_unlock(lock)
+#define write_unlock(lock)             _write_unlock(lock)
+#define spin_unlock_irq(lock)          _spin_unlock_irq(lock)
+#define read_unlock_irq(lock)          _read_unlock_irq(lock)
+#define write_unlock_irq(lock)         _write_unlock_irq(lock)
 
 #define spin_unlock_irqrestore(lock, flags)            \
        do {                                            \
index 1a411e3fab952413bff9c7b0224fba34f85a3b51..7a7e18fc2415e86c4a9fea767a0e43a001b51bcd 100644 (file)
@@ -60,6 +60,18 @@ void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
 void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
                                                        __releases(lock);
 
+/*
+ * We inline the unlock functions in the nondebug case:
+ */
+#if !defined(CONFIG_DEBUG_SPINLOCK) && !defined(CONFIG_PREEMPT)
+#define __always_inline__spin_unlock
+#define __always_inline__read_unlock
+#define __always_inline__write_unlock
+#define __always_inline__spin_unlock_irq
+#define __always_inline__read_unlock_irq
+#define __always_inline__write_unlock_irq
+#endif
+
 #ifndef CONFIG_DEBUG_SPINLOCK
 #ifndef CONFIG_GENERIC_LOCKBREAK