aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/entry/vdso/vclock_gettime.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/arch/x86/entry/vdso/vclock_gettime.c b/arch/x86/entry/vdso/vclock_gettime.c
index b27dea0e23af..672e50e35d6c 100644
--- a/arch/x86/entry/vdso/vclock_gettime.c
+++ b/arch/x86/entry/vdso/vclock_gettime.c
@@ -241,29 +241,27 @@ notrace static void do_coarse(clockid_t clk, struct timespec *ts)
241 241
242notrace int __vdso_clock_gettime(clockid_t clock, struct timespec *ts) 242notrace int __vdso_clock_gettime(clockid_t clock, struct timespec *ts)
243{ 243{
244 switch (clock) { 244 unsigned int msk;
245 case CLOCK_REALTIME:
246 if (do_hres(CLOCK_REALTIME, ts) == VCLOCK_NONE)
247 goto fallback;
248 break;
249 case CLOCK_MONOTONIC:
250 if (do_hres(CLOCK_MONOTONIC, ts) == VCLOCK_NONE)
251 goto fallback;
252 break;
253 case CLOCK_REALTIME_COARSE:
254 do_coarse(CLOCK_REALTIME_COARSE, ts);
255 break;
256 case CLOCK_MONOTONIC_COARSE:
257 do_coarse(CLOCK_MONOTONIC_COARSE, ts);
258 break;
259 default:
260 goto fallback;
261 }
262 245
263 return 0; 246 /* Sort out negative (CPU/FD) and invalid clocks */
264fallback: 247 if (unlikely((unsigned int) clock >= MAX_CLOCKS))
248 return vdso_fallback_gettime(clock, ts);
249
250 /*
251 * Convert the clockid to a bitmask and use it to check which
252 * clocks are handled in the VDSO directly.
253 */
254 msk = 1U << clock;
255 if (likely(msk & VGTOD_HRES)) {
256 if (do_hres(clock, ts) != VCLOCK_NONE)
257 return 0;
258 } else if (msk & VGTOD_COARSE) {
259 do_coarse(clock, ts);
260 return 0;
261 }
265 return vdso_fallback_gettime(clock, ts); 262 return vdso_fallback_gettime(clock, ts);
266} 263}
264
267int clock_gettime(clockid_t, struct timespec *) 265int clock_gettime(clockid_t, struct timespec *)
268 __attribute__((weak, alias("__vdso_clock_gettime"))); 266 __attribute__((weak, alias("__vdso_clock_gettime")));
269 267