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;
ns = vdso_ts->nsec; last = vd->cycle_last; if (unlikely((s64)cycles < 0)) return clock_gettime_fallback(clk, ts);cycles = __arch_get_hw_counter(vd->clock_mode);
if (cycles > last) ns += (cycles - last) * vd->mult; ns >>= vd->shift;cycles &= vd->mask;
-- 2.22.0