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.frasc...@arm.com>
> ---
>  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
> 
> 

Reply via email to