On Tue, 25 Jun 2019, Vincenzo Frascino wrote: CC+ Andy > do_hres() in the vDSO generic library masks the hw counter value > immediately after reading it. > > Postpone the mask application after checking if the syscall fallback is > enabled, in order to be able to detect a possible fallback for the > architectures that have masks smaller than ULLONG_MAX. Right. This only worked on x86 because the mask is there ULLONG_MAX for all VDSO capable clocksources, i.e. that ever worked just by chance. As we talked about that already yesterday, I tested this on a couple of machines and as expected the outcome is uarch dependent. Minimal deviations to both sides and some machines do not show any change at all. I doubt it's possible to come up with a solution which makes all uarchs go faster magically. Though, thinking about it, we could remove the mask operation completely on X86. /me runs tests Thanks, tglx > Signed-off-by: Vincenzo Frascino <vincenzo.frascino@xxxxxxx> > --- > lib/vdso/gettimeofday.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/lib/vdso/gettimeofday.c b/lib/vdso/gettimeofday.c > index ef28cc5d7bff..ee1221ba1d32 100644 > --- a/lib/vdso/gettimeofday.c > +++ b/lib/vdso/gettimeofday.c > @@ -35,12 +35,12 @@ static int do_hres(const struct vdso_data *vd, clockid_t clk, > > do { > seq = vdso_read_begin(vd); > - cycles = __arch_get_hw_counter(vd->clock_mode) & > - vd->mask; > + cycles = __arch_get_hw_counter(vd->clock_mode); > ns = vdso_ts->nsec; > last = vd->cycle_last; > if (unlikely((s64)cycles < 0)) > return clock_gettime_fallback(clk, ts); > + cycles &= vd->mask; > if (cycles > last) > ns += (cycles - last) * vd->mult; > ns >>= vd->shift; > -- > 2.22.0 > >