diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2014-02-06 12:16:07 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2014-04-18 05:40:30 -0400 |
| commit | febdbfe8a91ce0d11939d4940b592eb0dba8d663 (patch) | |
| tree | 5651dc5030d3cc43a0e852f60ca2627835ef194f /include/asm-generic | |
| parent | 2ab08ee9f0a4eba27c7c4ce0b6d5118e8a18554b (diff) | |
arch: Prepare for smp_mb__{before,after}_atomic()
Since the smp_mb__{before,after}*() ops are fundamentally dependent on
how an arch can implement atomics it doesn't make sense to have 3
variants of them. They must all be the same.
Furthermore, the 3 variants suggest they're only valid for those 3
atomic ops, while we have many more where they could be applied.
So move away from
smp_mb__{before,after}_{atomic,clear}_{dec,inc,bit}() and reduce the
interface to just the two: smp_mb__{before,after}_atomic().
This patch prepares the way by introducing default implementations in
asm-generic/barrier.h that default to a full barrier and providing
__deprecated inlines for the previous 6 barriers if they're not
provided by the arch.
This should allow for a mostly painless transition (lots of deprecated
warns in the interim).
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Link: http://lkml.kernel.org/n/tip-wr59327qdyi9mbzn6x937s4e@git.kernel.org
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: "Chen, Gong" <gong.chen@linux.intel.com>
Cc: John Sullivan <jsrhbz@kanargh.force9.co.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mauro Carvalho Chehab <m.chehab@samsung.com>
Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: linux-arch@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/asm-generic')
| -rw-r--r-- | include/asm-generic/atomic.h | 7 | ||||
| -rw-r--r-- | include/asm-generic/barrier.h | 8 | ||||
| -rw-r--r-- | include/asm-generic/bitops.h | 9 |
3 files changed, 10 insertions, 14 deletions
diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic.h index 33bd2de3bc1e..9c79e7603459 100644 --- a/include/asm-generic/atomic.h +++ b/include/asm-generic/atomic.h | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #define __ASM_GENERIC_ATOMIC_H | 16 | #define __ASM_GENERIC_ATOMIC_H |
| 17 | 17 | ||
| 18 | #include <asm/cmpxchg.h> | 18 | #include <asm/cmpxchg.h> |
| 19 | #include <asm/barrier.h> | ||
| 19 | 20 | ||
| 20 | #ifdef CONFIG_SMP | 21 | #ifdef CONFIG_SMP |
| 21 | /* Force people to define core atomics */ | 22 | /* Force people to define core atomics */ |
| @@ -182,11 +183,5 @@ static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | |||
| 182 | } | 183 | } |
| 183 | #endif | 184 | #endif |
| 184 | 185 | ||
| 185 | /* Assume that atomic operations are already serializing */ | ||
| 186 | #define smp_mb__before_atomic_dec() barrier() | ||
| 187 | #define smp_mb__after_atomic_dec() barrier() | ||
| 188 | #define smp_mb__before_atomic_inc() barrier() | ||
| 189 | #define smp_mb__after_atomic_inc() barrier() | ||
| 190 | |||
| 191 | #endif /* __KERNEL__ */ | 186 | #endif /* __KERNEL__ */ |
| 192 | #endif /* __ASM_GENERIC_ATOMIC_H */ | 187 | #endif /* __ASM_GENERIC_ATOMIC_H */ |
diff --git a/include/asm-generic/barrier.h b/include/asm-generic/barrier.h index 6f692f8ac664..1402fa855388 100644 --- a/include/asm-generic/barrier.h +++ b/include/asm-generic/barrier.h | |||
| @@ -62,6 +62,14 @@ | |||
| 62 | #define set_mb(var, value) do { (var) = (value); mb(); } while (0) | 62 | #define set_mb(var, value) do { (var) = (value); mb(); } while (0) |
| 63 | #endif | 63 | #endif |
| 64 | 64 | ||
| 65 | #ifndef smp_mb__before_atomic | ||
| 66 | #define smp_mb__before_atomic() smp_mb() | ||
| 67 | #endif | ||
| 68 | |||
| 69 | #ifndef smp_mb__after_atomic | ||
| 70 | #define smp_mb__after_atomic() smp_mb() | ||
| 71 | #endif | ||
| 72 | |||
| 65 | #define smp_store_release(p, v) \ | 73 | #define smp_store_release(p, v) \ |
| 66 | do { \ | 74 | do { \ |
| 67 | compiletime_assert_atomic_type(*p); \ | 75 | compiletime_assert_atomic_type(*p); \ |
diff --git a/include/asm-generic/bitops.h b/include/asm-generic/bitops.h index 280ca7a96f75..dcdcacf2fd2b 100644 --- a/include/asm-generic/bitops.h +++ b/include/asm-generic/bitops.h | |||
| @@ -11,14 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | #include <linux/irqflags.h> | 12 | #include <linux/irqflags.h> |
| 13 | #include <linux/compiler.h> | 13 | #include <linux/compiler.h> |
| 14 | 14 | #include <asm/barrier.h> | |
| 15 | /* | ||
| 16 | * clear_bit may not imply a memory barrier | ||
| 17 | */ | ||
| 18 | #ifndef smp_mb__before_clear_bit | ||
| 19 | #define smp_mb__before_clear_bit() smp_mb() | ||
| 20 | #define smp_mb__after_clear_bit() smp_mb() | ||
| 21 | #endif | ||
| 22 | 15 | ||
| 23 | #include <asm-generic/bitops/__ffs.h> | 16 | #include <asm-generic/bitops/__ffs.h> |
| 24 | #include <asm-generic/bitops/ffz.h> | 17 | #include <asm-generic/bitops/ffz.h> |
