Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79c74ecb authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

s390/time,vdso: convert to the new update_vsyscall interface



Switch to the improved update_vsyscall interface that provides
sub-nanosecond precision for gettimeofday and clock_gettime.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 71a86ef0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ config S390
	select GENERIC_CPU_DEVICES if !SMP
	select GENERIC_FIND_FIRST_BIT
	select GENERIC_SMP_IDLE_THREAD
	select GENERIC_TIME_VSYSCALL_OLD
	select GENERIC_TIME_VSYSCALL
	select HAVE_ALIGNED_STRUCT_PAGE if SLUB
	select HAVE_ARCH_JUMP_LABEL if !MARCH_G5
	select HAVE_ARCH_SECCOMP_FILTER
+3 −2
Original line number Diff line number Diff line
@@ -26,8 +26,9 @@ struct vdso_data {
	__u64 wtom_clock_nsec;		/*				0x28 */
	__u32 tz_minuteswest;		/* Minutes west of Greenwich	0x30 */
	__u32 tz_dsttime;		/* Type of dst correction	0x34 */
	__u32 ectg_available;
	__u32 ntp_mult;			/* NTP adjusted multiplier	0x3C */
	__u32 ectg_available;		/* ECTG instruction present	0x38 */
	__u32 tk_mult;			/* Mult. used for xtime_nsec	0x3c */
	__u32 tk_shift;			/* Shift used for xtime_nsec	0x40 */
};

struct vdso_per_cpu_data {
+2 −1
Original line number Diff line number Diff line
@@ -65,7 +65,8 @@ int main(void)
	DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
	DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest));
	DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available));
	DEFINE(__VDSO_NTP_MULT, offsetof(struct vdso_data, ntp_mult));
	DEFINE(__VDSO_TK_MULT, offsetof(struct vdso_data, tk_mult));
	DEFINE(__VDSO_TK_SHIFT, offsetof(struct vdso_data, tk_shift));
	DEFINE(__VDSO_ECTG_BASE, offsetof(struct vdso_per_cpu_data, ectg_timer_base));
	DEFINE(__VDSO_ECTG_USER, offsetof(struct vdso_per_cpu_data, ectg_user_time));
	/* constants used by the vdso */
+18 −9
Original line number Diff line number Diff line
@@ -221,21 +221,30 @@ struct clocksource * __init clocksource_default_clock(void)
	return &clocksource_tod;
}

void update_vsyscall_old(struct timespec *wall_time, struct timespec *wtm,
			struct clocksource *clock, u32 mult)
void update_vsyscall(struct timekeeper *tk)
{
	if (clock != &clocksource_tod)
	u64 nsecps;

	if (tk->clock != &clocksource_tod)
		return;

	/* Make userspace gettimeofday spin until we're done. */
	++vdso_data->tb_update_count;
	smp_wmb();
	vdso_data->xtime_tod_stamp = clock->cycle_last;
	vdso_data->xtime_clock_sec = wall_time->tv_sec;
	vdso_data->xtime_clock_nsec = wall_time->tv_nsec;
	vdso_data->wtom_clock_sec = wtm->tv_sec;
	vdso_data->wtom_clock_nsec = wtm->tv_nsec;
	vdso_data->ntp_mult = mult;
	vdso_data->xtime_tod_stamp = tk->clock->cycle_last;
	vdso_data->xtime_clock_sec = tk->xtime_sec;
	vdso_data->xtime_clock_nsec = tk->xtime_nsec;
	vdso_data->wtom_clock_sec =
		tk->xtime_sec + tk->wall_to_monotonic.tv_sec;
	vdso_data->wtom_clock_nsec = tk->xtime_nsec +
		+ (tk->wall_to_monotonic.tv_nsec << tk->shift);
	nsecps = (u64) NSEC_PER_SEC << tk->shift;
	while (vdso_data->wtom_clock_nsec >= nsecps) {
		vdso_data->wtom_clock_nsec -= nsecps;
		vdso_data->wtom_clock_sec++;
	}
	vdso_data->tk_mult = tk->mult;
	vdso_data->tk_shift = tk->shift;
	smp_wmb();
	++vdso_data->tb_update_count;
}
+16 −14
Original line number Diff line number Diff line
@@ -38,25 +38,26 @@ __kernel_clock_gettime:
	sl	%r1,__VDSO_XTIME_STAMP+4(%r5)
	brc	3,2f
	ahi	%r0,-1
2:	ms	%r0,__VDSO_NTP_MULT(%r5)	/* cyc2ns(clock,cycle_delta) */
2:	ms	%r0,__VDSO_TK_MULT(%r5)		/*  * tk->mult */
	lr	%r2,%r0
	l	%r0,__VDSO_NTP_MULT(%r5)
	l	%r0,__VDSO_TK_MULT(%r5)
	ltr	%r1,%r1
	mr	%r0,%r0
	jnm	3f
	a	%r0,__VDSO_NTP_MULT(%r5)
	a	%r0,__VDSO_TK_MULT(%r5)
3:	alr	%r0,%r2
	srdl	%r0,12
	al	%r0,__VDSO_XTIME_NSEC(%r5)	/*  + xtime */
	al	%r0,__VDSO_XTIME_NSEC(%r5)	/*  + tk->xtime_nsec */
	al	%r1,__VDSO_XTIME_NSEC+4(%r5)
	brc	12,4f
	ahi	%r0,1
4:	l	%r2,__VDSO_XTIME_SEC+4(%r5)
	al	%r0,__VDSO_WTOM_NSEC(%r5)	/*  + wall_to_monotonic */
4:	al	%r0,__VDSO_WTOM_NSEC(%r5)	/*  + wall_to_monotonic.nsec */
	al	%r1,__VDSO_WTOM_NSEC+4(%r5)
	brc	12,5f
	ahi	%r0,1
5:	al	%r2,__VDSO_WTOM_SEC+4(%r5)
5:	l	%r2,__VDSO_TK_SHIFT(%r5)	/* Timekeeper shift */
	srdl	%r0,0(%r2)			/*  >> tk->shift */
	l	%r2,__VDSO_XTIME_SEC+4(%r5)
	al	%r2,__VDSO_WTOM_SEC+4(%r5)
	cl	%r4,__VDSO_UPD_COUNT+4(%r5)	/* check update counter */
	jne	1b
	basr	%r5,0
@@ -86,20 +87,21 @@ __kernel_clock_gettime:
	sl	%r1,__VDSO_XTIME_STAMP+4(%r5)
	brc	3,12f
	ahi	%r0,-1
12:	ms	%r0,__VDSO_NTP_MULT(%r5)	/* cyc2ns(clock,cycle_delta) */
12:	ms	%r0,__VDSO_TK_MULT(%r5)		/*  * tk->mult */
	lr	%r2,%r0
	l	%r0,__VDSO_NTP_MULT(%r5)
	l	%r0,__VDSO_TK_MULT(%r5)
	ltr	%r1,%r1
	mr	%r0,%r0
	jnm	13f
	a	%r0,__VDSO_NTP_MULT(%r5)
	a	%r0,__VDSO_TK_MULT(%r5)
13:	alr	%r0,%r2
	srdl	%r0,12
	al	%r0,__VDSO_XTIME_NSEC(%r5)	/*  + xtime */
	al	%r0,__VDSO_XTIME_NSEC(%r5)	/*  + tk->xtime_nsec */
	al	%r1,__VDSO_XTIME_NSEC+4(%r5)
	brc	12,14f
	ahi	%r0,1
14:	l	%r2,__VDSO_XTIME_SEC+4(%r5)
14:	l	%r2,__VDSO_TK_SHIFT(%r5)	/* Timekeeper shift */
	srdl	%r0,0(%r2)			/*  >> tk->shift */
	l	%r2,__VDSO_XTIME_SEC+4(%r5)
	cl	%r4,__VDSO_UPD_COUNT+4(%r5)	/* check update counter */
	jne	11b
	basr	%r5,0
Loading