summaryrefslogtreecommitdiff
path: root/kernel/locking/mutex.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/locking/mutex.h')
-rw-r--r--kernel/locking/mutex.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/kernel/locking/mutex.h b/kernel/locking/mutex.h
index a68bae5e8..6cd6b8e9e 100644
--- a/kernel/locking/mutex.h
+++ b/kernel/locking/mutex.h
@@ -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)