login
Header Space

 
 

[PATCH x86] [1/16] Make clocksource watchdog cycle through online CPUs

Score:
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: <tglx@...>, <linux-kernel@...>
Date: Thursday, January 3, 2008 - 11:42 am

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.

Cc: tglx@linutronix.de

Signed-off-by: Andi Kleen <ak@suse.de>

---
 kernel/time/clocksource.c |   14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

Index: linux/kernel/time/clocksource.c
===================================================================
--- linux.orig/kernel/time/clocksource.c
+++ linux/kernel/time/clocksource.c
@@ -142,8 +142,13 @@ static void clocksource_watchdog(unsigne
 	}
 
 	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);
 }
@@ -165,7 +170,7 @@ static void clocksource_check_watchdog(s
 		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)
@@ -186,7 +191,8 @@ static void clocksource_check_watchdog(s
 				watchdog_last = watchdog->read();
 				watchdog_timer.expires =
 					jiffies + WATCHDOG_INTERVAL;
-				add_timer(&watchdog_timer);
+				add_timer_on(&watchdog_timer,
+						first_cpu(cpu_online_map));
 			}
 		}
 	}
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH x86] [0/16] Various i386/x86-64 changes, Andi Kleen, (Thu Jan 3, 11:42 am)
[PATCH x86] [16/16] Mark memory_setup __init, Andi Kleen, (Thu Jan 3, 11:42 am)
Re: [PATCH x86] [16/16] Mark memory_setup __init, Ingo Molnar, (Fri Jan 4, 5:25 am)
Re: [PATCH x86] [16/16] Mark memory_setup __init, Ingo Molnar, (Fri Jan 4, 5:53 am)
Re: [PATCH x86] [15/16] Force __cpuinit on for CONFIG_PM wit..., Rafael J. Wysocki, (Thu Jan 10, 1:14 pm)
Re: [PATCH x86] [15/16] Force __cpuinit on for CONFIG_PM wit..., Rafael J. Wysocki, (Thu Jan 10, 1:17 pm)
[PATCH] x86: Change unnecessary dependencies on CONFIG_PM, Rafael J. Wysocki, (Fri Jan 11, 7:06 pm)
[PATCH x86] [8/16] Make lockdep_init __init, Andi Kleen, (Thu Jan 3, 11:42 am)
Re: [PATCH x86] [8/16] Make lockdep_init __init, Ingo Molnar, (Fri Jan 4, 5:06 am)
[PATCH x86] [1/16] Make clocksource watchdog cycle through o..., Andi Kleen, (Thu Jan 3, 11:42 am)
speck-geostationary