diff options
author | Peter Zijlstra <peterz@infradead.org> | 2014-03-13 14:00:35 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2014-04-18 08:20:42 -0400 |
commit | 0e530747c69f1e191f101a925bb4051894e5c7b0 (patch) | |
tree | dba0d885403109b8a5857bf59890dfe6b6cd077c | |
parent | c645073f7e4f073e1ebcd0f0d91652c4468b8364 (diff) |
arch,s390: Convert smp_mb__*()
As per the existing implementation; implement the new one using
smp_mb().
AFAICT the s390 compare-and-swap does imply a barrier, however there
are some immediate ops that seem to be singly-copy atomic and do not
imply a barrier. One such is the "ni" op (which would be
and-immediate) which is used for the constant clear_bit
implementation. Therefore s390 needs full barriers for the
{before,after} atomic ops.
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-kme5dz5hcobpnufnnkh1ech2@git.kernel.org
Cc: Chen Gang <gang.chen@asianux.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: linux390@de.ibm.com
Cc: linux-kernel@vger.kernel.org
Cc: linux-s390@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/s390/include/asm/atomic.h | 5 | ||||
-rw-r--r-- | arch/s390/include/asm/barrier.h | 5 |
2 files changed, 3 insertions, 7 deletions
diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h index 1d4706114a45..fa934fe080c1 100644 --- a/arch/s390/include/asm/atomic.h +++ b/arch/s390/include/asm/atomic.h | |||
@@ -412,9 +412,4 @@ static inline long long atomic64_dec_if_positive(atomic64_t *v) | |||
412 | #define atomic64_dec_and_test(_v) (atomic64_sub_return(1, _v) == 0) | 412 | #define atomic64_dec_and_test(_v) (atomic64_sub_return(1, _v) == 0) |
413 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) | 413 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) |
414 | 414 | ||
415 | #define smp_mb__before_atomic_dec() smp_mb() | ||
416 | #define smp_mb__after_atomic_dec() smp_mb() | ||
417 | #define smp_mb__before_atomic_inc() smp_mb() | ||
418 | #define smp_mb__after_atomic_inc() smp_mb() | ||
419 | |||
420 | #endif /* __ARCH_S390_ATOMIC__ */ | 415 | #endif /* __ARCH_S390_ATOMIC__ */ |
diff --git a/arch/s390/include/asm/barrier.h b/arch/s390/include/asm/barrier.h index 578680f6207a..19ff956b752b 100644 --- a/arch/s390/include/asm/barrier.h +++ b/arch/s390/include/asm/barrier.h | |||
@@ -27,8 +27,9 @@ | |||
27 | #define smp_rmb() rmb() | 27 | #define smp_rmb() rmb() |
28 | #define smp_wmb() wmb() | 28 | #define smp_wmb() wmb() |
29 | #define smp_read_barrier_depends() read_barrier_depends() | 29 | #define smp_read_barrier_depends() read_barrier_depends() |
30 | #define smp_mb__before_clear_bit() smp_mb() | 30 | |
31 | #define smp_mb__after_clear_bit() smp_mb() | 31 | #define smp_mb__before_atomic() smp_mb() |
32 | #define smp_mb__after_atomic() smp_mb() | ||
32 | 33 | ||
33 | #define set_mb(var, value) do { var = value; mb(); } while (0) | 34 | #define set_mb(var, value) do { var = value; mb(); } while (0) |
34 | 35 | ||