Take an effort to recode the arm64 vdso code from assembler to C previously submitted by Andrew Pinski <[email protected]>, rework it for use in both arm and arm64, overlapping any optimizations for each architecture. But instead of landing it in arm64, land the result into lib/vdso and unify both implementations to simplify future maintenance.
Add ARCH_CLOCK_FIXED_MASK as an efficiency since arm64 has no purpose for cs_mask vdso_data variable. Signed-off-by: Mark Salyzyn <[email protected]> Cc: James Morse <[email protected]> Cc: Russell King <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Will Deacon <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Dmitry Safonov <[email protected]> Cc: John Stultz <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Laura Abbott <[email protected]> Cc: Kees Cook <[email protected]> Cc: Ard Biesheuvel <[email protected]> Cc: Andy Gross <[email protected]> Cc: Kevin Brodsky <[email protected]> Cc: Andrew Pinski <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: [email protected] Cc: [email protected] v4: - New in series, split off from earlier. --- arch/arm/vdso/vgettimeofday.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/arch/arm/vdso/vgettimeofday.c b/arch/arm/vdso/vgettimeofday.c index 1152308067e1..bbacf4d0d6a2 100644 --- a/arch/arm/vdso/vgettimeofday.c +++ b/arch/arm/vdso/vgettimeofday.c @@ -123,7 +123,11 @@ static notrace int do_realtime(const struct vdso_data *vd, struct timespec *ts) { u32 seq, mult, shift; u64 nsec, cycle_last; +#ifdef ARCH_CLOCK_FIXED_MASK + static const u64 mask = ARCH_CLOCK_FIXED_MASK; +#else u64 mask; +#endif vdso_xtime_clock_sec_t sec; do { @@ -136,7 +140,9 @@ static notrace int do_realtime(const struct vdso_data *vd, struct timespec *ts) mult = vd->cs_mono_mult; shift = vd->cs_shift; +#ifndef ARCH_CLOCK_FIXED_MASK mask = vd->cs_mask; +#endif sec = vd->xtime_clock_sec; nsec = vd->xtime_clock_snsec; @@ -156,7 +162,11 @@ static notrace int do_monotonic(const struct vdso_data *vd, struct timespec *ts) { u32 seq, mult, shift; u64 nsec, cycle_last; +#ifdef ARCH_CLOCK_FIXED_MASK + static const u64 mask = ARCH_CLOCK_FIXED_MASK; +#else u64 mask; +#endif vdso_wtm_clock_nsec_t wtm_nsec; __kernel_time_t sec; @@ -170,7 +180,9 @@ static notrace int do_monotonic(const struct vdso_data *vd, struct timespec *ts) mult = vd->cs_mono_mult; shift = vd->cs_shift; +#ifndef ARCH_CLOCK_FIXED_MASK mask = vd->cs_mask; +#endif sec = vd->xtime_clock_sec; nsec = vd->xtime_clock_snsec; @@ -195,7 +207,11 @@ static notrace int do_monotonic_raw(const struct vdso_data *vd, { u32 seq, mult, shift; u64 nsec, cycle_last; +#ifdef ARCH_CLOCK_FIXED_MASK + static const u64 mask = ARCH_CLOCK_FIXED_MASK; +#else u64 mask; +#endif vdso_raw_time_sec_t sec; do { @@ -208,7 +224,9 @@ static notrace int do_monotonic_raw(const struct vdso_data *vd, mult = vd->cs_raw_mult; shift = vd->cs_shift; +#ifndef ARCH_CLOCK_FIXED_MASK mask = vd->cs_mask; +#endif sec = vd->raw_time_sec; nsec = vd->raw_time_nsec; -- 2.15.0.rc2.357.g7e34df9404-goog

