diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/hrtimer.c | 9 | ||||
-rw-r--r-- | kernel/time/timekeeping.c | 8 |
2 files changed, 11 insertions, 6 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index ca99e2454600..e8bf3ad99063 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -91,9 +91,9 @@ static inline int hrtimer_clockid_to_base(clockid_t clock_id) | |||
91 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) | 91 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) |
92 | { | 92 | { |
93 | ktime_t xtim, tomono; | 93 | ktime_t xtim, tomono; |
94 | struct timespec xts, tom; | 94 | struct timespec xts, tom, slp; |
95 | 95 | ||
96 | get_xtime_and_monotonic_offset(&xts, &tom); | 96 | get_xtime_and_monotonic_and_sleep_offset(&xts, &tom, &slp); |
97 | 97 | ||
98 | xtim = timespec_to_ktime(xts); | 98 | xtim = timespec_to_ktime(xts); |
99 | tomono = timespec_to_ktime(tom); | 99 | tomono = timespec_to_ktime(tom); |
@@ -614,12 +614,13 @@ static int hrtimer_reprogram(struct hrtimer *timer, | |||
614 | static void retrigger_next_event(void *arg) | 614 | static void retrigger_next_event(void *arg) |
615 | { | 615 | { |
616 | struct hrtimer_cpu_base *base; | 616 | struct hrtimer_cpu_base *base; |
617 | struct timespec realtime_offset, wtm; | 617 | struct timespec realtime_offset, wtm, sleep; |
618 | 618 | ||
619 | if (!hrtimer_hres_active()) | 619 | if (!hrtimer_hres_active()) |
620 | return; | 620 | return; |
621 | 621 | ||
622 | get_xtime_and_monotonic_offset(&realtime_offset, &wtm); | 622 | get_xtime_and_monotonic_and_sleep_offset(&realtime_offset, &wtm, |
623 | &sleep); | ||
623 | set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec); | 624 | set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec); |
624 | 625 | ||
625 | base = &__get_cpu_var(hrtimer_bases); | 626 | base = &__get_cpu_var(hrtimer_bases); |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 5fbd9aa7df95..3bd7e3d5c632 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -1040,11 +1040,14 @@ void do_timer(unsigned long ticks) | |||
1040 | } | 1040 | } |
1041 | 1041 | ||
1042 | /** | 1042 | /** |
1043 | * get_xtime_and_monotonic_offset() - get xtime and wall_to_monotonic | 1043 | * get_xtime_and_monotonic_and_sleep_offset() - get xtime, wall_to_monotonic, |
1044 | * and sleep offsets. | ||
1044 | * @xtim: pointer to timespec to be set with xtime | 1045 | * @xtim: pointer to timespec to be set with xtime |
1045 | * @wtom: pointer to timespec to be set with wall_to_monotonic | 1046 | * @wtom: pointer to timespec to be set with wall_to_monotonic |
1047 | * @sleep: pointer to timespec to be set with time in suspend | ||
1046 | */ | 1048 | */ |
1047 | void get_xtime_and_monotonic_offset(struct timespec *xtim, struct timespec *wtom) | 1049 | void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim, |
1050 | struct timespec *wtom, struct timespec *sleep) | ||
1048 | { | 1051 | { |
1049 | unsigned long seq; | 1052 | unsigned long seq; |
1050 | 1053 | ||
@@ -1052,6 +1055,7 @@ void get_xtime_and_monotonic_offset(struct timespec *xtim, struct timespec *wtom | |||
1052 | seq = read_seqbegin(&xtime_lock); | 1055 | seq = read_seqbegin(&xtime_lock); |
1053 | *xtim = xtime; | 1056 | *xtim = xtime; |
1054 | *wtom = wall_to_monotonic; | 1057 | *wtom = wall_to_monotonic; |
1058 | *sleep = total_sleep_time; | ||
1055 | } while (read_seqretry(&xtime_lock, seq)); | 1059 | } while (read_seqretry(&xtime_lock, seq)); |
1056 | } | 1060 | } |
1057 | 1061 | ||