diff options
Diffstat (limited to 'kernel/time/timekeeping.c')
| -rw-r--r-- | kernel/time/timekeeping.c | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 34e5eac8142..d3b91e75cec 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -303,10 +303,11 @@ void getnstimeofday(struct timespec *ts)  		seq = read_seqbegin(&tk->lock);  		ts->tv_sec = tk->xtime_sec; -		ts->tv_nsec = timekeeping_get_ns(tk); +		nsecs = timekeeping_get_ns(tk);  	} while (read_seqretry(&tk->lock, seq)); +	ts->tv_nsec = 0;  	timespec_add_ns(ts, nsecs);  }  EXPORT_SYMBOL(getnstimeofday); @@ -345,6 +346,7 @@ void ktime_get_ts(struct timespec *ts)  {  	struct timekeeper *tk = &timekeeper;  	struct timespec tomono; +	s64 nsec;  	unsigned int seq;  	WARN_ON(timekeeping_suspended); @@ -352,13 +354,14 @@ void ktime_get_ts(struct timespec *ts)  	do {  		seq = read_seqbegin(&tk->lock);  		ts->tv_sec = tk->xtime_sec; -		ts->tv_nsec = timekeeping_get_ns(tk); +		nsec = timekeeping_get_ns(tk);  		tomono = tk->wall_to_monotonic;  	} while (read_seqretry(&tk->lock, seq)); -	set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec, -				ts->tv_nsec + tomono.tv_nsec); +	ts->tv_sec += tomono.tv_sec; +	ts->tv_nsec = 0; +	timespec_add_ns(ts, nsec + tomono.tv_nsec);  }  EXPORT_SYMBOL_GPL(ktime_get_ts); @@ -1244,6 +1247,7 @@ void get_monotonic_boottime(struct timespec *ts)  {  	struct timekeeper *tk = &timekeeper;  	struct timespec tomono, sleep; +	s64 nsec;  	unsigned int seq;  	WARN_ON(timekeeping_suspended); @@ -1251,14 +1255,15 @@ void get_monotonic_boottime(struct timespec *ts)  	do {  		seq = read_seqbegin(&tk->lock);  		ts->tv_sec = tk->xtime_sec; -		ts->tv_nsec = timekeeping_get_ns(tk); +		nsec = timekeeping_get_ns(tk);  		tomono = tk->wall_to_monotonic;  		sleep = tk->total_sleep_time;  	} while (read_seqretry(&tk->lock, seq)); -	set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec, -			ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec); +	ts->tv_sec += tomono.tv_sec + sleep.tv_sec; +	ts->tv_nsec = 0; +	timespec_add_ns(ts, nsec + tomono.tv_nsec + sleep.tv_nsec);  }  EXPORT_SYMBOL_GPL(get_monotonic_boottime);  |