[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.DEB.2.21.1906251851350.32342@nanos.tec.linutronix.de>
Date: Tue, 25 Jun 2019 19:02:13 +0200 (CEST)
From: Thomas Gleixner <tglx@...utronix.de>
To: Vincenzo Frascino <vincenzo.frascino@....com>
cc: linux-arch@...r.kernel.org,
LAK <linux-arm-kernel@...ts.infradead.org>,
LKML <linux-kernel@...r.kernel.org>, linux-mips@...r.kernel.org,
linux-kselftest@...r.kernel.org, catalin.marinas@....com,
Will Deacon <will.deacon@....com>,
Arnd Bergmann <arnd@...db.de>, linux@...linux.org.uk,
Ralf Baechle <ralf@...ux-mips.org>, paul.burton@...s.com,
Daniel Lezcano <daniel.lezcano@...aro.org>,
salyzyn@...roid.com, pcc@...gle.com, shuah@...nel.org,
0x7f454c46@...il.com, linux@...musvillemoes.dk,
huw@...eweavers.com, sthotton@...vell.com, andre.przywara@....com,
Andy Lutomirski <luto@...nel.org>
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@....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
>
>
Powered by blists - more mailing lists