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

Commit 6e281474 authored by Jason Low's avatar Jason Low Committed by Ingo Molnar
Browse files

locking/mutex: Set and clear owner using WRITE_ONCE()



The mutex owner can get read and written to locklessly.
Use WRITE_ONCE when setting and clearing the owner field
in order to avoid optimizations such as store tearing. This
avoids situations where the owner field gets written to with
multiple stores and another thread could concurrently read
and use a partially written owner value.

Signed-off-by: default avatarJason Low <jason.low2@hpe.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: default avatarDavidlohr Bueso <dave@stgolabs.net>
Acked-by: default avatarWaiman Long <Waiman.Long@hpe.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Scott J Norton <scott.norton@hpe.com>
Cc: Terry Rudd <terry.rudd@hpe.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1463782776.2479.9.camel@j-VirtualBox


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent c0fcb6c2
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -29,12 +29,12 @@ extern void debug_mutex_init(struct mutex *lock, const char *name,

static inline void mutex_set_owner(struct mutex *lock)
{
	lock->owner = current;
	WRITE_ONCE(lock->owner, current);
}

static inline void mutex_clear_owner(struct mutex *lock)
{
	lock->owner = NULL;
	WRITE_ONCE(lock->owner, NULL);
}

#define spin_lock_mutex(lock, flags)			\
+8 −2
Original line number Diff line number Diff line
@@ -17,14 +17,20 @@
		__list_del((waiter)->list.prev, (waiter)->list.next)

#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
/*
 * The mutex owner can get read and written to locklessly.
 * We should use WRITE_ONCE when writing the owner value to
 * avoid store tearing, otherwise, a thread could potentially
 * read a partially written and incomplete owner value.
 */
static inline void mutex_set_owner(struct mutex *lock)
{
	lock->owner = current;
	WRITE_ONCE(lock->owner, current);
}

static inline void mutex_clear_owner(struct mutex *lock)
{
	lock->owner = NULL;
	WRITE_ONCE(lock->owner, NULL);
}
#else
static inline void mutex_set_owner(struct mutex *lock)