diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2012-02-28 14:46:04 -0500 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2012-03-15 21:17:58 -0400 |
commit | 2ab516575f2f273b19d95140d02c54612201e80a (patch) | |
tree | 26db92249e65754d99759af21fd207507a81cec8 /arch/x86/kernel | |
parent | 6c260d586343f7f78239d90aa9e2cfed02f74ff3 (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.c | 11 |
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 | ||
54 | DEFINE_VVAR(int, vgetcpu_mode); | 54 | DEFINE_VVAR(int, vgetcpu_mode); |
55 | DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data) = | 55 | DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data); |
56 | { | ||
57 | .lock = __SEQLOCK_UNLOCKED(__vsyscall_gtod_data.lock), | ||
58 | }; | ||
59 | 56 | ||
60 | static enum { EMULATE, NATIVE, NONE } vsyscall_mode = EMULATE; | 57 | static enum { EMULATE, NATIVE, NONE } vsyscall_mode = EMULATE; |
61 | 58 | ||
@@ -86,9 +83,7 @@ void update_vsyscall_tz(void) | |||
86 | void update_vsyscall(struct timespec *wall_time, struct timespec *wtm, | 83 | void 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 | ||
107 | static void warn_bad_vsyscall(const char *level, struct pt_regs *regs, | 102 | static void warn_bad_vsyscall(const char *level, struct pt_regs *regs, |