diff options
| -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;  	} | 
