diff options
| -rw-r--r-- | arch/x86/entry/vdso/vclock_gettime.c | 38 |
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 | ||
| 242 | notrace int __vdso_clock_gettime(clockid_t clock, struct timespec *ts) | 242 | notrace 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 */ |
| 264 | fallback: | 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 | |||
| 267 | int clock_gettime(clockid_t, struct timespec *) | 265 | int clock_gettime(clockid_t, struct timespec *) |
| 268 | __attribute__((weak, alias("__vdso_clock_gettime"))); | 266 | __attribute__((weak, alias("__vdso_clock_gettime"))); |
| 269 | 267 | ||
