diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2010-02-21 14:17:22 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2010-02-21 14:17:22 -0500 |
commit | 5f854cfc024622e4aae14d7cf422f6ff86278688 (patch) | |
tree | 426e77c6f6e4939c80440bf1fabcb020e3ee145b /arch/x86/vdso | |
parent | cc24da0742870f152ddf1002aa39dfcd83f7cf9c (diff) | |
parent | 4ec62b2b2e6bd7ddef7b6cea6e5db7b5578a6532 (diff) |
Forward to 2.6.33-rc8
Merge branch 'linus' into rt/head with a pile of conflicts.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/vdso')
-rw-r--r-- | arch/x86/vdso/Makefile | 2 | ||||
-rw-r--r-- | arch/x86/vdso/vclock_gettime.c | 47 | ||||
-rw-r--r-- | arch/x86/vdso/vdso32-setup.c | 1 |
3 files changed, 41 insertions, 9 deletions
diff --git a/arch/x86/vdso/Makefile b/arch/x86/vdso/Makefile index 88112b49f02c..6b4ffedb93c9 100644 --- a/arch/x86/vdso/Makefile +++ b/arch/x86/vdso/Makefile | |||
@@ -122,7 +122,7 @@ quiet_cmd_vdso = VDSO $@ | |||
122 | $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \ | 122 | $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \ |
123 | -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) | 123 | -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) |
124 | 124 | ||
125 | VDSO_LDFLAGS = -fPIC -shared $(call ld-option, -Wl$(comma)--hash-style=sysv) | 125 | VDSO_LDFLAGS = -fPIC -shared $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) |
126 | GCOV_PROFILE := n | 126 | GCOV_PROFILE := n |
127 | 127 | ||
128 | # | 128 | # |
diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c index cd36532096b0..e1b68a559338 100644 --- a/arch/x86/vdso/vclock_gettime.c +++ b/arch/x86/vdso/vclock_gettime.c | |||
@@ -47,11 +47,11 @@ notrace static noinline int do_realtime(struct timespec *ts) | |||
47 | { | 47 | { |
48 | unsigned long seq, ns; | 48 | unsigned long seq, ns; |
49 | do { | 49 | do { |
50 | seq = read_atomic_seqbegin(>od->lock); | 50 | seq = read_raw_seqbegin(>od->lock); |
51 | ts->tv_sec = gtod->wall_time_sec; | 51 | ts->tv_sec = gtod->wall_time_sec; |
52 | ts->tv_nsec = gtod->wall_time_nsec; | 52 | ts->tv_nsec = gtod->wall_time_nsec; |
53 | ns = vgetns(); | 53 | ns = vgetns(); |
54 | } while (unlikely(read_atomic_seqretry(>od->lock, seq))); | 54 | } while (unlikely(read_raw_seqretry(>od->lock, seq))); |
55 | timespec_add_ns(ts, ns); | 55 | timespec_add_ns(ts, ns); |
56 | return 0; | 56 | return 0; |
57 | } | 57 | } |
@@ -76,24 +76,57 @@ notrace static noinline int do_monotonic(struct timespec *ts) | |||
76 | { | 76 | { |
77 | unsigned long seq, ns, secs; | 77 | unsigned long seq, ns, secs; |
78 | do { | 78 | do { |
79 | seq = read_atomic_seqbegin(>od->lock); | 79 | seq = read_raw_seqbegin(>od->lock); |
80 | secs = gtod->wall_time_sec; | 80 | secs = gtod->wall_time_sec; |
81 | ns = gtod->wall_time_nsec + vgetns(); | 81 | ns = gtod->wall_time_nsec + vgetns(); |
82 | secs += gtod->wall_to_monotonic.tv_sec; | 82 | secs += gtod->wall_to_monotonic.tv_sec; |
83 | ns += gtod->wall_to_monotonic.tv_nsec; | 83 | ns += gtod->wall_to_monotonic.tv_nsec; |
84 | } while (unlikely(read_atomic_seqretry(>od->lock, seq))); | 84 | } while (unlikely(read_raw_seqretry(>od->lock, seq))); |
85 | vset_normalized_timespec(ts, secs, ns); | ||
86 | return 0; | ||
87 | } | ||
88 | |||
89 | notrace static noinline int do_realtime_coarse(struct timespec *ts) | ||
90 | { | ||
91 | unsigned long seq; | ||
92 | do { | ||
93 | seq = read_raw_seqbegin(>od->lock); | ||
94 | ts->tv_sec = gtod->wall_time_coarse.tv_sec; | ||
95 | ts->tv_nsec = gtod->wall_time_coarse.tv_nsec; | ||
96 | } while (unlikely(read_raw_seqretry(>od->lock, seq))); | ||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | notrace static noinline int do_monotonic_coarse(struct timespec *ts) | ||
101 | { | ||
102 | unsigned long seq, ns, secs; | ||
103 | do { | ||
104 | seq = read_raw_seqbegin(>od->lock); | ||
105 | secs = gtod->wall_time_coarse.tv_sec; | ||
106 | ns = gtod->wall_time_coarse.tv_nsec; | ||
107 | secs += gtod->wall_to_monotonic.tv_sec; | ||
108 | ns += gtod->wall_to_monotonic.tv_nsec; | ||
109 | } while (unlikely(read_raw_seqretry(>od->lock, seq))); | ||
85 | vset_normalized_timespec(ts, secs, ns); | 110 | vset_normalized_timespec(ts, secs, ns); |
86 | return 0; | 111 | return 0; |
87 | } | 112 | } |
88 | 113 | ||
89 | notrace int __vdso_clock_gettime(clockid_t clock, struct timespec *ts) | 114 | notrace int __vdso_clock_gettime(clockid_t clock, struct timespec *ts) |
90 | { | 115 | { |
91 | if (likely(gtod->sysctl_enabled && gtod->clock.vread)) | 116 | if (likely(gtod->sysctl_enabled)) |
92 | switch (clock) { | 117 | switch (clock) { |
93 | case CLOCK_REALTIME: | 118 | case CLOCK_REALTIME: |
94 | return do_realtime(ts); | 119 | if (likely(gtod->clock.vread)) |
120 | return do_realtime(ts); | ||
121 | break; | ||
95 | case CLOCK_MONOTONIC: | 122 | case CLOCK_MONOTONIC: |
96 | return do_monotonic(ts); | 123 | if (likely(gtod->clock.vread)) |
124 | return do_monotonic(ts); | ||
125 | break; | ||
126 | case CLOCK_REALTIME_COARSE: | ||
127 | return do_realtime_coarse(ts); | ||
128 | case CLOCK_MONOTONIC_COARSE: | ||
129 | return do_monotonic_coarse(ts); | ||
97 | } | 130 | } |
98 | return vdso_fallback_gettime(clock, ts); | 131 | return vdso_fallback_gettime(clock, ts); |
99 | } | 132 | } |
diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c index 58bc00f68b12..02b442e92007 100644 --- a/arch/x86/vdso/vdso32-setup.c +++ b/arch/x86/vdso/vdso32-setup.c | |||
@@ -393,7 +393,6 @@ static ctl_table abi_table2[] = { | |||
393 | 393 | ||
394 | static ctl_table abi_root_table2[] = { | 394 | static ctl_table abi_root_table2[] = { |
395 | { | 395 | { |
396 | .ctl_name = CTL_ABI, | ||
397 | .procname = "abi", | 396 | .procname = "abi", |
398 | .mode = 0555, | 397 | .mode = 0555, |
399 | .child = abi_table2 | 398 | .child = abi_table2 |