diff --git a/lib/vdso/gettimeofday.c b/lib/vdso/gettimeofday.c index 2d1c1f241fd9..b7284330018d 100644 --- a/lib/vdso/gettimeofday.c +++ b/lib/vdso/gettimeofday.c @@ -51,7 +51,7 @@ static int do_hres(const struct vdso_data *vd, clockid_t clk, ns = vdso_ts->nsec; last = vd->cycle_last; if (unlikely((s64)cycles < 0)) - return clock_gettime_fallback(clk, ts); + return -1; ns += vdso_calc_delta(cycles, last, vd->mask, vd->mult); ns >>= vd->shift; @@ -86,6 +86,7 @@ __cvdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts) { const struct vdso_data *vd = __arch_get_vdso_data(); u32 msk; + int ret; /* Check for negative values or invalid clocks */ if (unlikely((u32) clock >= MAX_CLOCKS)) @@ -97,14 +98,17 @@ __cvdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts) */ msk = 1U << clock; if (likely(msk & VDSO_HRES)) { - return do_hres(&vd[CS_HRES_COARSE], clock, ts); + ret = do_hres(&vd[CS_HRES_COARSE], clock, ts); } else if (msk & VDSO_COARSE) { do_coarse(&vd[CS_HRES_COARSE], clock, ts); return 0; } else if (msk & VDSO_RAW) { - return do_hres(&vd[CS_RAW], clock, ts); + ret = do_hres(&vd[CS_RAW], clock, ts); } + if (likely(ret == 0)) + return clock_gettime_fallback(clock, ts); + fallback: return clock_gettime_fallback(clock, ts); } @@ -120,15 +124,14 @@ __cvdso_clock_gettime32(clockid_t clock, struct old_timespec32 *res) ret = __cvdso_clock_gettime(clock, &ts); - if (ret == 0) { + if (likely(ret == 0)) { res->tv_sec = ts.tv_sec; res->tv_nsec = ts.tv_nsec; + return ret; } - return ret; - fallback: - return clock_gettime_fallback(clock, (struct __kernel_timespec *)res); + return clock_gettime32_fallback(clock, (struct __kernel_timespec *)res); } static __maybe_unused int