aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2012-02-28 14:46:04 -0500
committerJohn Stultz <john.stultz@linaro.org>2012-03-15 21:17:58 -0400
commit2ab516575f2f273b19d95140d02c54612201e80a (patch)
tree26db92249e65754d99759af21fd207507a81cec8 /arch/x86/kernel
parent6c260d586343f7f78239d90aa9e2cfed02f74ff3 (diff)
x86: vdso: Use seqcount instead of seqlock
The update of the vdso data happens under xtime_lock, so adding a nested lock is pointless. Just use a seqcount to sync the readers. Reviewed-by: Andy Lutomirski <luto@amacapital.net> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/vsyscall_64.c11
1 files changed, 3 insertions, 8 deletions
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
index 33385c18e5d..cdc95a707cd 100644
--- a/arch/x86/kernel/vsyscall_64.c
+++ b/arch/x86/kernel/vsyscall_64.c
@@ -52,10 +52,7 @@
52#include "vsyscall_trace.h" 52#include "vsyscall_trace.h"
53 53
54DEFINE_VVAR(int, vgetcpu_mode); 54DEFINE_VVAR(int, vgetcpu_mode);
55DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data) = 55DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data);
56{
57 .lock = __SEQLOCK_UNLOCKED(__vsyscall_gtod_data.lock),
58};
59 56
60static enum { EMULATE, NATIVE, NONE } vsyscall_mode = EMULATE; 57static enum { EMULATE, NATIVE, NONE } vsyscall_mode = EMULATE;
61 58
@@ -86,9 +83,7 @@ void update_vsyscall_tz(void)
86void update_vsyscall(struct timespec *wall_time, struct timespec *wtm, 83void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
87 struct clocksource *clock, u32 mult) 84 struct clocksource *clock, u32 mult)
88{ 85{
89 unsigned long flags; 86 write_seqcount_begin(&vsyscall_gtod_data.seq);
90
91 write_seqlock_irqsave(&vsyscall_gtod_data.lock, flags);
92 87
93 /* copy vsyscall data */ 88 /* copy vsyscall data */
94 vsyscall_gtod_data.clock.vclock_mode = clock->archdata.vclock_mode; 89 vsyscall_gtod_data.clock.vclock_mode = clock->archdata.vclock_mode;
@@ -101,7 +96,7 @@ void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
101 vsyscall_gtod_data.wall_to_monotonic = *wtm; 96 vsyscall_gtod_data.wall_to_monotonic = *wtm;
102 vsyscall_gtod_data.wall_time_coarse = __current_kernel_time(); 97 vsyscall_gtod_data.wall_time_coarse = __current_kernel_time();
103 98
104 write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags); 99 write_seqcount_end(&vsyscall_gtod_data.seq);
105} 100}
106 101
107static void warn_bad_vsyscall(const char *level, struct pt_regs *regs, 102static void warn_bad_vsyscall(const char *level, struct pt_regs *regs,