Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 488beef1 authored by Christian Borntraeger's avatar Christian Borntraeger
Browse files

arm/spinlock: Replace ACCESS_ONCE with READ_ONCE

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: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Acked-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent af2e7aae
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -120,12 +120,12 @@ static inline int arch_spin_value_unlocked(arch_spinlock_t lock)


static inline int arch_spin_is_locked(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)
static inline int arch_spin_is_contended(arch_spinlock_t *lock)
{
{
	struct __raw_tickets tickets = ACCESS_ONCE(lock->tickets);
	struct __raw_tickets tickets = READ_ONCE(lock->tickets);
	return (tickets.next - tickets.owner) > 1;
	return (tickets.next - tickets.owner) > 1;
}
}
#define arch_spin_is_contended	arch_spin_is_contended
#define arch_spin_is_contended	arch_spin_is_contended