diff options
Diffstat (limited to 'kernel/time/tick-common.c')
| -rw-r--r-- | kernel/time/tick-common.c | 17 | 
1 files changed, 9 insertions, 8 deletions
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index fb0fdec8719a..d88b13076b79 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c @@ -7,6 +7,7 @@   * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar   * Copyright(C) 2006-2007, Timesys Corp., Thomas Gleixner   */ +#include <linux/compiler.h>  #include <linux/cpu.h>  #include <linux/err.h>  #include <linux/hrtimer.h> @@ -84,7 +85,7 @@ int tick_is_oneshot_available(void)   */  static void tick_periodic(int cpu)  { -	if (tick_do_timer_cpu == cpu) { +	if (READ_ONCE(tick_do_timer_cpu) == cpu) {  		raw_spin_lock(&jiffies_lock);  		write_seqcount_begin(&jiffies_seq); @@ -215,8 +216,8 @@ static void tick_setup_device(struct tick_device *td,  		 * If no cpu took the do_timer update, assign it to  		 * this cpu:  		 */ -		if (tick_do_timer_cpu == TICK_DO_TIMER_BOOT) { -			tick_do_timer_cpu = cpu; +		if (READ_ONCE(tick_do_timer_cpu) == TICK_DO_TIMER_BOOT) { +			WRITE_ONCE(tick_do_timer_cpu, cpu);  			tick_next_period = ktime_get();  #ifdef CONFIG_NO_HZ_FULL  			/* @@ -232,7 +233,7 @@ static void tick_setup_device(struct tick_device *td,  						!tick_nohz_full_cpu(cpu)) {  			tick_take_do_timer_from_boot();  			tick_do_timer_boot_cpu = -1; -			WARN_ON(tick_do_timer_cpu != cpu); +			WARN_ON(READ_ONCE(tick_do_timer_cpu) != cpu);  #endif  		} @@ -406,10 +407,10 @@ void tick_assert_timekeeping_handover(void)  int tick_cpu_dying(unsigned int dying_cpu)  {  	/* -	 * If the current CPU is the timekeeper, it's the only one that -	 * can safely hand over its duty. Also all online CPUs are in -	 * stop machine, guaranteed not to be idle, therefore it's safe -	 * to pick any online successor. +	 * If the current CPU is the timekeeper, it's the only one that can +	 * safely hand over its duty. Also all online CPUs are in stop +	 * machine, guaranteed not to be idle, therefore there is no +	 * concurrency and it's safe to pick any online successor.  	 */  	if (tick_do_timer_cpu == dying_cpu)  		tick_do_timer_cpu = cpumask_first(cpu_online_mask);  |