diff options
author | Leonid Yegoshin <Leonid.Yegoshin@imgtec.com> | 2015-06-01 20:09:52 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2015-06-21 15:54:30 -0400 |
commit | 6f6ed482653723e53da4a57b200348ac1eed5ce9 (patch) | |
tree | 151ad0e5c6a77a66e29c733a3e9d59fbe0c5efed /arch | |
parent | 5f93ef5cfb867aca400598f69f9ce8af14b0ced0 (diff) |
MIPS: Replace smp_mb with release barrier function in unlocks.
Repleace smp_mb() in arch_write_unlock() and __clear_bit_unlock() to
smp_mb__before_llsc() call which does "release" barrier functionality.
It seems like it was missed in commit f252ffd50c97dae87b45f1dbad24f71358ccfbd6
during introduction of "acquire" and "release" semantics.
[ralf@linux-mips: The original patch submission was labelled a fix but
actually it replaces a barrier with another less restrictive type of
barrier so it doesn't fix any ill behaviour but rather squeezes out a
tad better performance. Further improvments will be possible once
smp_release() has been merged.]
Signed-off-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com>
Cc: linux-mips@linux-mips.org
Cc: benh@kernel.crashing.org
Cc: will.deacon@arm.com
Cc: linux-kernel@vger.kernel.org
Cc: markos.chandras@imgtec.com
Cc: macro@linux-mips.org
Cc: Steven.Hill@imgtec.com
Cc: alexander.h.duyck@redhat.com
Cc: davem@davemloft.net
Patchwork: https://patchwork.linux-mips.org/patch/10507/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mips/include/asm/bitops.h | 2 | ||||
-rw-r--r-- | arch/mips/include/asm/spinlock.h | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h index 0cf29bd5dc5c..ce9666cf1499 100644 --- a/arch/mips/include/asm/bitops.h +++ b/arch/mips/include/asm/bitops.h | |||
@@ -469,7 +469,7 @@ static inline int test_and_change_bit(unsigned long nr, | |||
469 | */ | 469 | */ |
470 | static inline void __clear_bit_unlock(unsigned long nr, volatile unsigned long *addr) | 470 | static inline void __clear_bit_unlock(unsigned long nr, volatile unsigned long *addr) |
471 | { | 471 | { |
472 | smp_mb(); | 472 | smp_mb__before_llsc(); |
473 | __clear_bit(nr, addr); | 473 | __clear_bit(nr, addr); |
474 | } | 474 | } |
475 | 475 | ||
diff --git a/arch/mips/include/asm/spinlock.h b/arch/mips/include/asm/spinlock.h index 1fca2e0793dc..7c7f3b2bd3de 100644 --- a/arch/mips/include/asm/spinlock.h +++ b/arch/mips/include/asm/spinlock.h | |||
@@ -317,7 +317,7 @@ static inline void arch_write_lock(arch_rwlock_t *rw) | |||
317 | 317 | ||
318 | static inline void arch_write_unlock(arch_rwlock_t *rw) | 318 | static inline void arch_write_unlock(arch_rwlock_t *rw) |
319 | { | 319 | { |
320 | smp_mb(); | 320 | smp_mb__before_llsc(); |
321 | 321 | ||
322 | __asm__ __volatile__( | 322 | __asm__ __volatile__( |
323 | " # arch_write_unlock \n" | 323 | " # arch_write_unlock \n" |