Messages in this thread | | | Date | Tue, 25 Jun 2019 19:02:13 +0200 (CEST) | From | Thomas Gleixner <> | Subject | Re: [PATCH 1/3] lib/vdso: Delay mask application in do_hres() |
| |
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@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 > >
| |