From 633ea576914c91751bbf3b119bcf34b0094b9f14 Mon Sep 17 00:00:00 2001 From: Tony Breeds Date: Thu, 18 Oct 2007 03:04:57 -0700 Subject: [PATCH] --- yaml --- r: 71124 b: refs/heads/master c: 2c6221483169ddd4c04797cd7296ed4fe52fcdd7 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/ia64/kernel/time.c | 5 +++++ trunk/arch/x86/kernel/vsyscall_64.c | 11 ++++++++++- trunk/include/linux/clocksource.h | 5 +++++ trunk/kernel/time.c | 2 ++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 0d87bce9c20f..8f80479e23d8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6212e3a388fdda3f19fa660ef5a30edf54d1dcfd +refs/heads/master: 2c6221483169ddd4c04797cd7296ed4fe52fcdd7 diff --git a/trunk/arch/ia64/kernel/time.c b/trunk/arch/ia64/kernel/time.c index 98cfc90cab1d..2bb84214e5f1 100644 --- a/trunk/arch/ia64/kernel/time.c +++ b/trunk/arch/ia64/kernel/time.c @@ -371,6 +371,11 @@ ia64_setup_printk_clock(void) ia64_printk_clock = ia64_itc_printk_clock; } +/* IA64 doesn't cache the timezone */ +void update_vsyscall_tz(void) +{ +} + void update_vsyscall(struct timespec *wall, struct clocksource *c) { unsigned long flags; diff --git a/trunk/arch/x86/kernel/vsyscall_64.c b/trunk/arch/x86/kernel/vsyscall_64.c index 8a67e282cb5e..f24e8acdec91 100644 --- a/trunk/arch/x86/kernel/vsyscall_64.c +++ b/trunk/arch/x86/kernel/vsyscall_64.c @@ -64,6 +64,16 @@ struct vsyscall_gtod_data __vsyscall_gtod_data __section_vsyscall_gtod_data = .sysctl_enabled = 1, }; +void update_vsyscall_tz(void) +{ + unsigned long flags; + + write_seqlock_irqsave(&vsyscall_gtod_data.lock, flags); + /* sys_tz has changed */ + vsyscall_gtod_data.sys_tz = sys_tz; + write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags); +} + void update_vsyscall(struct timespec *wall_time, struct clocksource *clock) { unsigned long flags; @@ -77,7 +87,6 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock) vsyscall_gtod_data.clock.shift = clock->shift; vsyscall_gtod_data.wall_time_sec = wall_time->tv_sec; vsyscall_gtod_data.wall_time_nsec = wall_time->tv_nsec; - vsyscall_gtod_data.sys_tz = sys_tz; vsyscall_gtod_data.wall_to_monotonic = wall_to_monotonic; write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags); } diff --git a/trunk/include/linux/clocksource.h b/trunk/include/linux/clocksource.h index 16ea3374dddf..107787aacb64 100644 --- a/trunk/include/linux/clocksource.h +++ b/trunk/include/linux/clocksource.h @@ -221,10 +221,15 @@ extern void clocksource_resume(void); #ifdef CONFIG_GENERIC_TIME_VSYSCALL extern void update_vsyscall(struct timespec *ts, struct clocksource *c); +extern void update_vsyscall_tz(void); #else static inline void update_vsyscall(struct timespec *ts, struct clocksource *c) { } + +static inline void update_vsyscall_tz(void) +{ +} #endif #endif /* _LINUX_CLOCKSOURCE_H */ diff --git a/trunk/kernel/time.c b/trunk/kernel/time.c index 2d5b6a682138..d9725bdcd045 100644 --- a/trunk/kernel/time.c +++ b/trunk/kernel/time.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -158,6 +159,7 @@ int do_sys_settimeofday(struct timespec *tv, struct timezone *tz) if (tz) { /* SMP safe, global irq locking makes it work. */ sys_tz = *tz; + update_vsyscall_tz(); if (firsttime) { firsttime = 0; if (!tv)