diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2018-09-17 14:45:39 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2018-10-04 23:00:25 +0200 | 
| commit | e9a62f76f93c6f28b6c7e908eb12e5f1313870a2 (patch) | |
| tree | 78cb8d871df25b95487b855b9fffb272e29c4421 | |
| parent | 49116f2081eeaf75316956705d46602b7eb735cc (diff) | |
x86/vdso: Collapse high resolution functions
do_realtime() and do_monotonic() are now the same except for the storage
array index. Hand the index in as an argument and collapse the functions.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Andy Lutomirski <luto@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Matt Rickard <matt@softrans.com.au>
Cc: Stephen Boyd <sboyd@kernel.org>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Florian Weimer <fweimer@redhat.com>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: devel@linuxdriverproject.org
Cc: virtualization@lists.linux-foundation.org
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Juergen Gross <jgross@suse.com>
Link: https://lkml.kernel.org/r/20180917130707.407955860@linutronix.de
| -rw-r--r-- | arch/x86/entry/vdso/vclock_gettime.c | 35 | 
1 files changed, 7 insertions, 28 deletions
| diff --git a/arch/x86/entry/vdso/vclock_gettime.c b/arch/x86/entry/vdso/vclock_gettime.c index 2c73e7f57316..1351b76638fb 100644 --- a/arch/x86/entry/vdso/vclock_gettime.c +++ b/arch/x86/entry/vdso/vclock_gettime.c @@ -205,35 +205,12 @@ notrace static inline u64 vgetsns(int *mode)  	return v * gtod->mult;  } -/* Code size doesn't matter (vdso is 4k anyway) and this is faster. */ -notrace static int __always_inline do_realtime(struct timespec *ts) +notrace static int do_hres(clockid_t clk, struct timespec *ts)  { -	struct vgtod_ts *base = >od->basetime[CLOCK_REALTIME]; +	struct vgtod_ts *base = >od->basetime[clk];  	unsigned int seq; -	u64 ns;  	int mode; - -	do { -		seq = gtod_read_begin(gtod); -		mode = gtod->vclock_mode; -		ts->tv_sec = base->sec; -		ns = base->nsec; -		ns += vgetsns(&mode); -		ns >>= gtod->shift; -	} while (unlikely(gtod_read_retry(gtod, seq))); - -	ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns); -	ts->tv_nsec = ns; - -	return mode; -} - -notrace static int __always_inline do_monotonic(struct timespec *ts) -{ -	struct vgtod_ts *base = >od->basetime[CLOCK_MONOTONIC]; -	unsigned int seq;  	u64 ns; -	int mode;  	do {  		seq = gtod_read_begin(gtod); @@ -278,11 +255,11 @@ notrace int __vdso_clock_gettime(clockid_t clock, struct timespec *ts)  {  	switch (clock) {  	case CLOCK_REALTIME: -		if (do_realtime(ts) == VCLOCK_NONE) +		if (do_hres(CLOCK_REALTIME, ts) == VCLOCK_NONE)  			goto fallback;  		break;  	case CLOCK_MONOTONIC: -		if (do_monotonic(ts) == VCLOCK_NONE) +		if (do_hres(CLOCK_MONOTONIC, ts) == VCLOCK_NONE)  			goto fallback;  		break;  	case CLOCK_REALTIME_COARSE: @@ -305,7 +282,9 @@ int clock_gettime(clockid_t, struct timespec *)  notrace int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)  {  	if (likely(tv != NULL)) { -		if (unlikely(do_realtime((struct timespec *)tv) == VCLOCK_NONE)) +		struct timespec *ts = (struct timespec *) tv; + +		if (unlikely(do_hres(CLOCK_REALTIME, ts) == VCLOCK_NONE))  			return vdso_fallback_gtod(tv, tz);  		tv->tv_usec /= 1000;  	} | 
