| From d004e024058a0eaca097513ce62cbcf978913e0a Mon Sep 17 00:00:00 2001 |
| From: Hector Palacios <hector.palacios@digi.com> |
| Date: Mon, 14 Nov 2011 11:15:25 +0100 |
| Subject: timekeeping: add arch_offset hook to ktime_get functions |
| |
| From: Hector Palacios <hector.palacios@digi.com> |
| |
| commit d004e024058a0eaca097513ce62cbcf978913e0a upstream. |
| |
| ktime_get and ktime_get_ts were calling timekeeping_get_ns() |
| but later they were not calling arch_gettimeoffset() so architectures |
| using this mechanism returned 0 ns when calling these functions. |
| |
| This happened for example when running Busybox's ping which calls |
| syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts) which eventually |
| calls ktime_get. As a result the returned ping travel time was zero. |
| |
| Signed-off-by: Hector Palacios <hector.palacios@digi.com> |
| Signed-off-by: John Stultz <john.stultz@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| kernel/time/timekeeping.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/kernel/time/timekeeping.c |
| +++ b/kernel/time/timekeeping.c |
| @@ -264,6 +264,8 @@ ktime_t ktime_get(void) |
| secs = xtime.tv_sec + wall_to_monotonic.tv_sec; |
| nsecs = xtime.tv_nsec + wall_to_monotonic.tv_nsec; |
| nsecs += timekeeping_get_ns(); |
| + /* If arch requires, add in gettimeoffset() */ |
| + nsecs += arch_gettimeoffset(); |
| |
| } while (read_seqretry(&xtime_lock, seq)); |
| /* |
| @@ -295,6 +297,8 @@ void ktime_get_ts(struct timespec *ts) |
| *ts = xtime; |
| tomono = wall_to_monotonic; |
| nsecs = timekeeping_get_ns(); |
| + /* If arch requires, add in gettimeoffset() */ |
| + nsecs += arch_gettimeoffset(); |
| |
| } while (read_seqretry(&xtime_lock, seq)); |
| |