diff options
Diffstat (limited to 'kernel/time/timer.c')
-rw-r--r-- | kernel/time/timer.c | 9 |
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); |