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

Commit 6993fc5b authored by Andi Kleen's avatar Andi Kleen Committed by Thomas Gleixner
Browse files

clocksource: make clocksource watchdog cycle through online CPUs



This way it checks if the clocks are synchronized between CPUs too.
This might be able to detect slowly drifting TSCs which only
go wrong over longer time.

Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 3833eecc
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -141,8 +141,16 @@ static void clocksource_watchdog(unsigned long data)
	}

	if (!list_empty(&watchdog_list)) {
		__mod_timer(&watchdog_timer,
			    watchdog_timer.expires + WATCHDOG_INTERVAL);
		/*
		 * Cycle through CPUs to check if the CPUs stay
		 * synchronized to each other.
		 */
		int next_cpu = next_cpu(raw_smp_processor_id(), cpu_online_map);

		if (next_cpu >= NR_CPUS)
			next_cpu = first_cpu(cpu_online_map);
		watchdog_timer.expires += WATCHDOG_INTERVAL;
		add_timer_on(&watchdog_timer, next_cpu);
	}
	spin_unlock(&watchdog_lock);
}
@@ -164,7 +172,8 @@ static void clocksource_check_watchdog(struct clocksource *cs)
		if (!started && watchdog) {
			watchdog_last = watchdog->read();
			watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL;
			add_timer(&watchdog_timer);
			add_timer_on(&watchdog_timer,
				     first_cpu(cpu_online_map));
		}
	} else {
		if (cs->flags & CLOCK_SOURCE_IS_CONTINUOUS)
@@ -185,7 +194,8 @@ static void clocksource_check_watchdog(struct clocksource *cs)
				watchdog_last = watchdog->read();
				watchdog_timer.expires =
					jiffies + WATCHDOG_INTERVAL;
				add_timer(&watchdog_timer);
				add_timer_on(&watchdog_timer,
					     first_cpu(cpu_online_map));
			}
		}
	}