arm64/spinlock: Replace ACCESS_ONCE READ_ONCE
authorChristian Borntraeger <borntraeger@de.ibm.com>
Mon, 24 Nov 2014 09:53:11 +0000 (10:53 +0100)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 18 Dec 2014 08:54:40 +0000 (09:54 +0100)
ACCESS_ONCE does not work reliably on non-scalar types. For
example gcc 4.6 and 4.7 might remove the volatile tag for such
accesses during the SRA (scalar replacement of aggregates) step
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58145)

Change the spinlock code to replace ACCESS_ONCE with READ_ONCE.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
arch/arm64/include/asm/spinlock.h

index c45b7b1b71978c6a71b58ef623c30c4e3f652393..cee128732435c7b99fdedd3d690659f96ab81a9b 100644 (file)
@@ -99,12 +99,12 @@ static inline int arch_spin_value_unlocked(arch_spinlock_t lock)
 
 static inline int arch_spin_is_locked(arch_spinlock_t *lock)
 {
-       return !arch_spin_value_unlocked(ACCESS_ONCE(*lock));
+       return !arch_spin_value_unlocked(READ_ONCE(*lock));
 }
 
 static inline int arch_spin_is_contended(arch_spinlock_t *lock)
 {
-       arch_spinlock_t lockval = ACCESS_ONCE(*lock);
+       arch_spinlock_t lockval = READ_ONCE(*lock);
        return (lockval.next - lockval.owner) > 1;
 }
 #define arch_spin_is_contended arch_spin_is_contended