mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 06:32:08 +00:00
[PATCH] clocksource: Add verification (watchdog) helper
The TSC needs to be verified against another clocksource. Instead of using hardwired assumptions of available hardware, provide a generic verification mechanism. The verification uses the best available clocksource and handles the usability for high resolution timers / dynticks of the clocksource which needs to be verified. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Cc: john stultz <johnstul@us.ibm.com> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7e69f2b1ea
commit
5d8b34fdcb
5 changed files with 161 additions and 78 deletions
|
@ -832,30 +832,33 @@ EXPORT_SYMBOL(do_settimeofday);
|
|||
*
|
||||
* Accumulates current time interval and initializes new clocksource
|
||||
*/
|
||||
static int change_clocksource(void)
|
||||
static void change_clocksource(void)
|
||||
{
|
||||
struct clocksource *new;
|
||||
cycle_t now;
|
||||
u64 nsec;
|
||||
new = clocksource_get_next();
|
||||
if (clock != new) {
|
||||
now = clocksource_read(new);
|
||||
nsec = __get_nsec_offset();
|
||||
timespec_add_ns(&xtime, nsec);
|
||||
|
||||
clock = new;
|
||||
clock->cycle_last = now;
|
||||
printk(KERN_INFO "Time: %s clocksource has been installed.\n",
|
||||
clock->name);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
new = clocksource_get_next();
|
||||
|
||||
if (clock == new)
|
||||
return;
|
||||
|
||||
now = clocksource_read(new);
|
||||
nsec = __get_nsec_offset();
|
||||
timespec_add_ns(&xtime, nsec);
|
||||
|
||||
clock = new;
|
||||
clock->cycle_last = now;
|
||||
|
||||
clock->error = 0;
|
||||
clock->xtime_nsec = 0;
|
||||
clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH);
|
||||
|
||||
printk(KERN_INFO "Time: %s clocksource has been installed.\n",
|
||||
clock->name);
|
||||
}
|
||||
#else
|
||||
static inline int change_clocksource(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void change_clocksource(void) { }
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -869,7 +872,7 @@ int timekeeping_is_continuous(void)
|
|||
do {
|
||||
seq = read_seqbegin(&xtime_lock);
|
||||
|
||||
ret = clock->flags & CLOCK_SOURCE_IS_CONTINUOUS;
|
||||
ret = clock->flags & CLOCK_SOURCE_VALID_FOR_HRES;
|
||||
|
||||
} while (read_seqretry(&xtime_lock, seq));
|
||||
|
||||
|
@ -1124,11 +1127,7 @@ static void update_wall_time(void)
|
|||
clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift;
|
||||
|
||||
/* check to see if there is a new clocksource to use */
|
||||
if (change_clocksource()) {
|
||||
clock->error = 0;
|
||||
clock->xtime_nsec = 0;
|
||||
clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH);
|
||||
}
|
||||
change_clocksource();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue