aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@mit.edu>2012-03-23 00:15:51 -0400
committerJohn Stultz <john.stultz@linaro.org>2012-03-23 19:49:33 -0400
commit91ec87d57fc38c529034e853687dfb7756de5406 (patch)
tree4f88d6a7e0221bdd791a1de6d4c36b17da8337a2 /arch/x86/kernel
parent88b28adf6fcdd6d10a1cfc7765bb200d7366a265 (diff)
x86-64: Simplify and optimize vdso clock_gettime monotonic variants
We used to store the wall-to-monotonic offset and the realtime base. It's faster to precompute the monotonic base. This is about a 3% speedup on Sandy Bridge for CLOCK_MONOTONIC. It's much more impressive for CLOCK_MONOTONIC_COARSE. Signed-off-by: Andy Lutomirski <luto@amacapital.net> Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/vsyscall_64.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
index cdc95a707cd..4285f1f404c 100644
--- a/arch/x86/kernel/vsyscall_64.c
+++ b/arch/x86/kernel/vsyscall_64.c
@@ -84,6 +84,7 @@ void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
84 struct clocksource *clock, u32 mult) 84 struct clocksource *clock, u32 mult)
85{ 85{
86 write_seqcount_begin(&vsyscall_gtod_data.seq); 86 write_seqcount_begin(&vsyscall_gtod_data.seq);
87 struct timespec monotonic;
87 88
88 /* copy vsyscall data */ 89 /* copy vsyscall data */
89 vsyscall_gtod_data.clock.vclock_mode = clock->archdata.vclock_mode; 90 vsyscall_gtod_data.clock.vclock_mode = clock->archdata.vclock_mode;
@@ -91,10 +92,17 @@ void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
91 vsyscall_gtod_data.clock.mask = clock->mask; 92 vsyscall_gtod_data.clock.mask = clock->mask;
92 vsyscall_gtod_data.clock.mult = mult; 93 vsyscall_gtod_data.clock.mult = mult;
93 vsyscall_gtod_data.clock.shift = clock->shift; 94 vsyscall_gtod_data.clock.shift = clock->shift;
95
94 vsyscall_gtod_data.wall_time_sec = wall_time->tv_sec; 96 vsyscall_gtod_data.wall_time_sec = wall_time->tv_sec;
95 vsyscall_gtod_data.wall_time_nsec = wall_time->tv_nsec; 97 vsyscall_gtod_data.wall_time_nsec = wall_time->tv_nsec;
96 vsyscall_gtod_data.wall_to_monotonic = *wtm; 98
99 monotonic = timespec_add(*wall_time, *wtm);
100 vsyscall_gtod_data.monotonic_time_sec = monotonic.tv_sec;
101 vsyscall_gtod_data.monotonic_time_nsec = monotonic.tv_nsec;
102
97 vsyscall_gtod_data.wall_time_coarse = __current_kernel_time(); 103 vsyscall_gtod_data.wall_time_coarse = __current_kernel_time();
104 vsyscall_gtod_data.monotonic_time_coarse =
105 timespec_add(vsyscall_gtod_data.wall_time_coarse, *wtm);
98 106
99 write_seqcount_end(&vsyscall_gtod_data.seq); 107 write_seqcount_end(&vsyscall_gtod_data.seq);
100} 108}