aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/time/timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/time/timer.c')
-rw-r--r--kernel/time/timer.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 2d47980a1bc4..0d4b91c5a374 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -943,7 +943,14 @@ static struct timer_base *lock_timer_base(struct timer_list *timer,
943{ 943{
944 for (;;) { 944 for (;;) {
945 struct timer_base *base; 945 struct timer_base *base;
946 u32 tf = timer->flags; 946 u32 tf;
947
948 /*
949 * We need to use READ_ONCE() here, otherwise the compiler
950 * might re-read @tf between the check for TIMER_MIGRATING
951 * and spin_lock().
952 */
953 tf = READ_ONCE(timer->flags);
947 954
948 if (!(tf & TIMER_MIGRATING)) { 955 if (!(tf & TIMER_MIGRATING)) {
949 base = get_timer_base(tf); 956 base = get_timer_base(tf);