Merge branch 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (34 commits) time: Prevent 32 bit overflow with set_normalized_timespec() clocksource: Delay clocksource down rating to late boot clocksource: clocksource_select must be called with mutex locked clocksource: Resolve cpu hotplug dead lock with TSC unstable, fix crash timers: Drop a function prototype clocksource: Resolve cpu hotplug dead lock with TSC unstable timer.c: Fix S/390 comments timekeeping: Fix invalid getboottime() value timekeeping: Fix up read_persistent_clock() breakage on sh timekeeping: Increase granularity of read_persistent_clock(), build fix time: Introduce CLOCK_REALTIME_COARSE x86: Do not unregister PIT clocksource on PIT oneshot setup/shutdown clocksource: Avoid clocksource watchdog circular locking dependency clocksource: Protect the watchdog rating changes with clocksource_mutex clocksource: Call clocksource_change_rating() outside of watchdog_lock timekeeping: Introduce read_boot_clock timekeeping: Increase granularity of read_persistent_clock() timekeeping: Update clocksource with stop_machine timekeeping: Add timekeeper read_clock helper functions timekeeping: Move NTP adjusted clock multiplier to struct timekeeper ... Fix trivial conflict due to MIPS lemote -> loongson renaming.
This commit is contained in:
@@ -19,12 +19,6 @@
|
||||
DEFINE_SPINLOCK(i8253_lock);
|
||||
EXPORT_SYMBOL(i8253_lock);
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
static void pit_disable_clocksource(void);
|
||||
#else
|
||||
static inline void pit_disable_clocksource(void) { }
|
||||
#endif
|
||||
|
||||
/*
|
||||
* HPET replaces the PIT, when enabled. So we need to know, which of
|
||||
* the two timers is used
|
||||
@@ -57,12 +51,10 @@ static void init_pit_timer(enum clock_event_mode mode,
|
||||
outb_pit(0, PIT_CH0);
|
||||
outb_pit(0, PIT_CH0);
|
||||
}
|
||||
pit_disable_clocksource();
|
||||
break;
|
||||
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
/* One shot setup */
|
||||
pit_disable_clocksource();
|
||||
outb_pit(0x38, PIT_MODE);
|
||||
break;
|
||||
|
||||
@@ -200,17 +192,6 @@ static struct clocksource pit_cs = {
|
||||
.shift = 20,
|
||||
};
|
||||
|
||||
static void pit_disable_clocksource(void)
|
||||
{
|
||||
/*
|
||||
* Use mult to check whether it is registered or not
|
||||
*/
|
||||
if (pit_cs.mult) {
|
||||
clocksource_unregister(&pit_cs);
|
||||
pit_cs.mult = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int __init init_pit_clocksource(void)
|
||||
{
|
||||
/*
|
||||
|
@@ -178,7 +178,7 @@ static int set_rtc_mmss(unsigned long nowtime)
|
||||
}
|
||||
|
||||
/* not static: needed by APM */
|
||||
unsigned long read_persistent_clock(void)
|
||||
void read_persistent_clock(struct timespec *ts)
|
||||
{
|
||||
unsigned long retval, flags;
|
||||
|
||||
@@ -186,7 +186,8 @@ unsigned long read_persistent_clock(void)
|
||||
retval = get_wallclock();
|
||||
spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
|
||||
return retval;
|
||||
ts->tv_sec = retval;
|
||||
ts->tv_nsec = 0;
|
||||
}
|
||||
|
||||
int update_persistent_clock(struct timespec now)
|
||||
|
@@ -744,10 +744,16 @@ static cycle_t __vsyscall_fn vread_tsc(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void resume_tsc(void)
|
||||
{
|
||||
clocksource_tsc.cycle_last = 0;
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_tsc = {
|
||||
.name = "tsc",
|
||||
.rating = 300,
|
||||
.read = read_tsc,
|
||||
.resume = resume_tsc,
|
||||
.mask = CLOCKSOURCE_MASK(64),
|
||||
.shift = 22,
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS |
|
||||
@@ -761,12 +767,14 @@ void mark_tsc_unstable(char *reason)
|
||||
{
|
||||
if (!tsc_unstable) {
|
||||
tsc_unstable = 1;
|
||||
printk("Marking TSC unstable due to %s\n", reason);
|
||||
printk(KERN_INFO "Marking TSC unstable due to %s\n", reason);
|
||||
/* Change only the rating, when not registered */
|
||||
if (clocksource_tsc.mult)
|
||||
clocksource_change_rating(&clocksource_tsc, 0);
|
||||
else
|
||||
clocksource_mark_unstable(&clocksource_tsc);
|
||||
else {
|
||||
clocksource_tsc.flags |= CLOCK_SOURCE_UNSTABLE;
|
||||
clocksource_tsc.rating = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -87,6 +87,7 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock)
|
||||
vsyscall_gtod_data.wall_time_sec = wall_time->tv_sec;
|
||||
vsyscall_gtod_data.wall_time_nsec = wall_time->tv_nsec;
|
||||
vsyscall_gtod_data.wall_to_monotonic = wall_to_monotonic;
|
||||
vsyscall_gtod_data.wall_time_coarse = __current_kernel_time();
|
||||
write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user