diff options
author | john stultz <johnstul@us.ibm.com> | 2009-10-02 19:24:15 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-10-05 07:52:02 -0400 |
commit | 7bc7d637452383d56ba4368d4336b0dde1bb476d (patch) | |
tree | f1c8e1e103a900850342d46de27ebdf1e7d07f78 | |
parent | a092ff0f90cae22b2ac8028ecd2c6f6c1a9e4601 (diff) |
time: Remove xtime_cache
With the prior logarithmic time accumulation patch, xtime will now
always be within one "tick" of the current time, instead of
possibly half a second off.
This removes the need for the xtime_cache value, which always
stored the time at the last interrupt, so this patch cleans that up
removing the xtime_cache related code.
This is a bit simpler, but still could use some wider testing.
Signed-off-by: John Stultz <johnstul@us.ibm.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: John Kacur <jkacur@redhat.com>
Cc: Clark Williams <williams@redhat.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
LKML-Reference: <1254525855.7741.95.camel@localhost.localdomain>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | kernel/time.c | 1 | ||||
-rw-r--r-- | kernel/time/timekeeping.c | 27 |
2 files changed, 4 insertions, 24 deletions
diff --git a/kernel/time.c b/kernel/time.c index 2e2e469a7fec..2ef4fe2079b6 100644 --- a/kernel/time.c +++ b/kernel/time.c | |||
@@ -136,7 +136,6 @@ static inline void warp_clock(void) | |||
136 | write_seqlock_irq(&xtime_lock); | 136 | write_seqlock_irq(&xtime_lock); |
137 | wall_to_monotonic.tv_sec -= sys_tz.tz_minuteswest * 60; | 137 | wall_to_monotonic.tv_sec -= sys_tz.tz_minuteswest * 60; |
138 | xtime.tv_sec += sys_tz.tz_minuteswest * 60; | 138 | xtime.tv_sec += sys_tz.tz_minuteswest * 60; |
139 | update_xtime_cache(0); | ||
140 | write_sequnlock_irq(&xtime_lock); | 139 | write_sequnlock_irq(&xtime_lock); |
141 | clock_was_set(); | 140 | clock_was_set(); |
142 | } | 141 | } |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 5fdd78e0858a..96b3f0dfa5dc 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -164,13 +164,6 @@ struct timespec raw_time; | |||
164 | /* flag for if timekeeping is suspended */ | 164 | /* flag for if timekeeping is suspended */ |
165 | int __read_mostly timekeeping_suspended; | 165 | int __read_mostly timekeeping_suspended; |
166 | 166 | ||
167 | static struct timespec xtime_cache __attribute__ ((aligned (16))); | ||
168 | void update_xtime_cache(u64 nsec) | ||
169 | { | ||
170 | xtime_cache = xtime; | ||
171 | timespec_add_ns(&xtime_cache, nsec); | ||
172 | } | ||
173 | |||
174 | /* must hold xtime_lock */ | 167 | /* must hold xtime_lock */ |
175 | void timekeeping_leap_insert(int leapsecond) | 168 | void timekeeping_leap_insert(int leapsecond) |
176 | { | 169 | { |
@@ -331,8 +324,6 @@ int do_settimeofday(struct timespec *tv) | |||
331 | 324 | ||
332 | xtime = *tv; | 325 | xtime = *tv; |
333 | 326 | ||
334 | update_xtime_cache(0); | ||
335 | |||
336 | timekeeper.ntp_error = 0; | 327 | timekeeper.ntp_error = 0; |
337 | ntp_clear(); | 328 | ntp_clear(); |
338 | 329 | ||
@@ -547,7 +538,6 @@ void __init timekeeping_init(void) | |||
547 | } | 538 | } |
548 | set_normalized_timespec(&wall_to_monotonic, | 539 | set_normalized_timespec(&wall_to_monotonic, |
549 | -boot.tv_sec, -boot.tv_nsec); | 540 | -boot.tv_sec, -boot.tv_nsec); |
550 | update_xtime_cache(0); | ||
551 | total_sleep_time.tv_sec = 0; | 541 | total_sleep_time.tv_sec = 0; |
552 | total_sleep_time.tv_nsec = 0; | 542 | total_sleep_time.tv_nsec = 0; |
553 | write_sequnlock_irqrestore(&xtime_lock, flags); | 543 | write_sequnlock_irqrestore(&xtime_lock, flags); |
@@ -581,7 +571,6 @@ static int timekeeping_resume(struct sys_device *dev) | |||
581 | wall_to_monotonic = timespec_sub(wall_to_monotonic, ts); | 571 | wall_to_monotonic = timespec_sub(wall_to_monotonic, ts); |
582 | total_sleep_time = timespec_add_safe(total_sleep_time, ts); | 572 | total_sleep_time = timespec_add_safe(total_sleep_time, ts); |
583 | } | 573 | } |
584 | update_xtime_cache(0); | ||
585 | /* re-base the last cycle value */ | 574 | /* re-base the last cycle value */ |
586 | timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock); | 575 | timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock); |
587 | timekeeper.ntp_error = 0; | 576 | timekeeper.ntp_error = 0; |
@@ -721,7 +710,6 @@ static void timekeeping_adjust(s64 offset) | |||
721 | timekeeper.ntp_error_shift; | 710 | timekeeper.ntp_error_shift; |
722 | } | 711 | } |
723 | 712 | ||
724 | |||
725 | /** | 713 | /** |
726 | * logarithmic_accumulation - shifted accumulation of cycles | 714 | * logarithmic_accumulation - shifted accumulation of cycles |
727 | * | 715 | * |
@@ -765,7 +753,6 @@ static cycle_t logarithmic_accumulation(cycle_t offset, int shift) | |||
765 | return offset; | 753 | return offset; |
766 | } | 754 | } |
767 | 755 | ||
768 | |||
769 | /** | 756 | /** |
770 | * update_wall_time - Uses the current clocksource to increment the wall time | 757 | * update_wall_time - Uses the current clocksource to increment the wall time |
771 | * | 758 | * |
@@ -775,7 +762,6 @@ void update_wall_time(void) | |||
775 | { | 762 | { |
776 | struct clocksource *clock; | 763 | struct clocksource *clock; |
777 | cycle_t offset; | 764 | cycle_t offset; |
778 | u64 nsecs; | ||
779 | int shift = 0, maxshift; | 765 | int shift = 0, maxshift; |
780 | 766 | ||
781 | /* Make sure we're fully resumed: */ | 767 | /* Make sure we're fully resumed: */ |
@@ -841,9 +827,6 @@ void update_wall_time(void) | |||
841 | timekeeper.ntp_error += timekeeper.xtime_nsec << | 827 | timekeeper.ntp_error += timekeeper.xtime_nsec << |
842 | timekeeper.ntp_error_shift; | 828 | timekeeper.ntp_error_shift; |
843 | 829 | ||
844 | nsecs = clocksource_cyc2ns(offset, timekeeper.mult, timekeeper.shift); | ||
845 | update_xtime_cache(nsecs); | ||
846 | |||
847 | /* check to see if there is a new clocksource to use */ | 830 | /* check to see if there is a new clocksource to use */ |
848 | update_vsyscall(&xtime, timekeeper.clock); | 831 | update_vsyscall(&xtime, timekeeper.clock); |
849 | } | 832 | } |
@@ -880,13 +863,13 @@ void monotonic_to_bootbased(struct timespec *ts) | |||
880 | 863 | ||
881 | unsigned long get_seconds(void) | 864 | unsigned long get_seconds(void) |
882 | { | 865 | { |
883 | return xtime_cache.tv_sec; | 866 | return xtime.tv_sec; |
884 | } | 867 | } |
885 | EXPORT_SYMBOL(get_seconds); | 868 | EXPORT_SYMBOL(get_seconds); |
886 | 869 | ||
887 | struct timespec __current_kernel_time(void) | 870 | struct timespec __current_kernel_time(void) |
888 | { | 871 | { |
889 | return xtime_cache; | 872 | return xtime; |
890 | } | 873 | } |
891 | 874 | ||
892 | struct timespec current_kernel_time(void) | 875 | struct timespec current_kernel_time(void) |
@@ -896,8 +879,7 @@ struct timespec current_kernel_time(void) | |||
896 | 879 | ||
897 | do { | 880 | do { |
898 | seq = read_seqbegin(&xtime_lock); | 881 | seq = read_seqbegin(&xtime_lock); |
899 | 882 | now = xtime; | |
900 | now = xtime_cache; | ||
901 | } while (read_seqretry(&xtime_lock, seq)); | 883 | } while (read_seqretry(&xtime_lock, seq)); |
902 | 884 | ||
903 | return now; | 885 | return now; |
@@ -911,8 +893,7 @@ struct timespec get_monotonic_coarse(void) | |||
911 | 893 | ||
912 | do { | 894 | do { |
913 | seq = read_seqbegin(&xtime_lock); | 895 | seq = read_seqbegin(&xtime_lock); |
914 | 896 | now = xtime; | |
915 | now = xtime_cache; | ||
916 | mono = wall_to_monotonic; | 897 | mono = wall_to_monotonic; |
917 | } while (read_seqretry(&xtime_lock, seq)); | 898 | } while (read_seqretry(&xtime_lock, seq)); |
918 | 899 | ||