Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[S390] vdso: use ntp adjusted clock multiplier

Commit "timekeeping: Fix clock_gettime vsyscall time warp" (0696b711e)
introduced the new parameter "mult" to update_vsyscall(). This parameter
contains the internal NTP adjusted clock multiplier.

The s390x vdso did not use this adjusted multiplier. Instead, it used
the constant clock multiplier for gettimeofday() and clock_gettime()
variants. This may result in observable time warps as explained in
commit 0696b711e.

Make the NTP adjusted clock multiplier available to the s390x vdso
implementation and use it for time calculations.

Cc: <stable@kernel.org>
Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Hendrik Brueckner and committed by
Martin Schwidefsky
157a1a27 8821d24c

+15 -12
+1
arch/s390/include/asm/vdso.h
··· 29 29 __u32 tz_minuteswest; /* Minutes west of Greenwich 0x30 */ 30 30 __u32 tz_dsttime; /* Type of dst correction 0x34 */ 31 31 __u32 ectg_available; 32 + __u32 ntp_mult; /* NTP adjusted multiplier 0x3C */ 32 33 }; 33 34 34 35 struct vdso_per_cpu_data {
+1
arch/s390/kernel/asm-offsets.c
··· 61 61 DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); 62 62 DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest)); 63 63 DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available)); 64 + DEFINE(__VDSO_NTP_MULT, offsetof(struct vdso_data, ntp_mult)); 64 65 DEFINE(__VDSO_ECTG_BASE, offsetof(struct vdso_per_cpu_data, ectg_timer_base)); 65 66 DEFINE(__VDSO_ECTG_USER, offsetof(struct vdso_per_cpu_data, ectg_user_time)); 66 67 /* constants used by the vdso */
+1
arch/s390/kernel/time.c
··· 221 221 vdso_data->xtime_clock_nsec = wall_time->tv_nsec; 222 222 vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec; 223 223 vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec; 224 + vdso_data->ntp_mult = mult; 224 225 smp_wmb(); 225 226 ++vdso_data->tb_update_count; 226 227 }
+6 -6
arch/s390/kernel/vdso32/clock_gettime.S
··· 38 38 sl %r1,__VDSO_XTIME_STAMP+4(%r5) 39 39 brc 3,2f 40 40 ahi %r0,-1 41 - 2: mhi %r0,1000 /* cyc2ns(clock,cycle_delta) */ 41 + 2: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ 42 42 lr %r2,%r0 43 - lhi %r0,1000 43 + l %r0,__VDSO_NTP_MULT(%r5) 44 44 ltr %r1,%r1 45 45 mr %r0,%r0 46 46 jnm 3f 47 - ahi %r0,1000 47 + a %r0,__VDSO_NTP_MULT(%r5) 48 48 3: alr %r0,%r2 49 49 srdl %r0,12 50 50 al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ ··· 86 86 sl %r1,__VDSO_XTIME_STAMP+4(%r5) 87 87 brc 3,12f 88 88 ahi %r0,-1 89 - 12: mhi %r0,1000 /* cyc2ns(clock,cycle_delta) */ 89 + 12: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ 90 90 lr %r2,%r0 91 - lhi %r0,1000 91 + l %r0,__VDSO_NTP_MULT(%r5) 92 92 ltr %r1,%r1 93 93 mr %r0,%r0 94 94 jnm 13f 95 - ahi %r0,1000 95 + a %r0,__VDSO_NTP_MULT(%r5) 96 96 13: alr %r0,%r2 97 97 srdl %r0,12 98 98 al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */
+3 -3
arch/s390/kernel/vdso32/gettimeofday.S
··· 35 35 sl %r1,__VDSO_XTIME_STAMP+4(%r5) 36 36 brc 3,3f 37 37 ahi %r0,-1 38 - 3: mhi %r0,1000 /* cyc2ns(clock,cycle_delta) */ 38 + 3: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ 39 39 st %r0,24(%r15) 40 - lhi %r0,1000 40 + l %r0,__VDSO_NTP_MULT(%r5) 41 41 ltr %r1,%r1 42 42 mr %r0,%r0 43 43 jnm 4f 44 - ahi %r0,1000 44 + a %r0,__VDSO_NTP_MULT(%r5) 45 45 4: al %r0,24(%r15) 46 46 srdl %r0,12 47 47 al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */
+2 -2
arch/s390/kernel/vdso64/clock_gettime.S
··· 36 36 stck 48(%r15) /* Store TOD clock */ 37 37 lg %r1,48(%r15) 38 38 sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ 39 - mghi %r1,1000 39 + msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ 40 40 srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ 41 41 alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ 42 42 lg %r0,__VDSO_XTIME_SEC(%r5) ··· 64 64 stck 48(%r15) /* Store TOD clock */ 65 65 lg %r1,48(%r15) 66 66 sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ 67 - mghi %r1,1000 67 + msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ 68 68 srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ 69 69 alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ 70 70 lg %r0,__VDSO_XTIME_SEC(%r5)
+1 -1
arch/s390/kernel/vdso64/gettimeofday.S
··· 31 31 stck 48(%r15) /* Store TOD clock */ 32 32 lg %r1,48(%r15) 33 33 sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ 34 - mghi %r1,1000 34 + msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ 35 35 srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ 36 36 alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime.tv_nsec */ 37 37 lg %r0,__VDSO_XTIME_SEC(%r5) /* xtime.tv_sec */