diff options
author | John Stultz <john.stultz@linaro.org> | 2011-02-15 13:45:16 -0500 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2011-02-21 15:53:08 -0500 |
commit | 70a08cca1227dc31c784ec930099a4417a06e7d0 (patch) | |
tree | d813ae86435a3104b66d18ee746d0f3ecc73a14a /kernel/hrtimer.c | |
parent | 314ac37150011ebb398f522db528d2dbcc611189 (diff) |
timers: Add CLOCK_BOOTTIME hrtimer base
CLOCK_MONOTONIC stops while the system is in suspend. This is because
to applications system suspend is invisible. However, there is a
growing set of applications that are wanting to be suspend-aware,
but do not want to deal with the complications of CLOCK_REALTIME
(which might jump around if settimeofday is called).
For these applications, I propose a new clockid: CLOCK_BOOTTIME.
CLOCK_BOOTTIME is idential to CLOCK_MONOTONIC, except it also
includes any time spent in suspend.
This patch add hrtimer base for CLOCK_BOOTTIME, using
get_monotonic_boottime/ktime_get_boottime, to allow
in kernel users to set timers against.
CC: Jamie Lokier <jamie@shareable.org>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Alexander Shishkin <virtuoso@slind.org>
CC: Arve Hjønnevåg <arve@android.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'kernel/hrtimer.c')
-rw-r--r-- | kernel/hrtimer.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index e8bf3ad99063..4c53af18734b 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -73,6 +73,11 @@ DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) = | |||
73 | .get_time = &ktime_get, | 73 | .get_time = &ktime_get, |
74 | .resolution = KTIME_LOW_RES, | 74 | .resolution = KTIME_LOW_RES, |
75 | }, | 75 | }, |
76 | { | ||
77 | .index = CLOCK_BOOTTIME, | ||
78 | .get_time = &ktime_get_boottime, | ||
79 | .resolution = KTIME_LOW_RES, | ||
80 | }, | ||
76 | } | 81 | } |
77 | }; | 82 | }; |
78 | 83 | ||
@@ -90,16 +95,17 @@ static inline int hrtimer_clockid_to_base(clockid_t clock_id) | |||
90 | */ | 95 | */ |
91 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) | 96 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) |
92 | { | 97 | { |
93 | ktime_t xtim, tomono; | 98 | ktime_t xtim, mono, boot; |
94 | struct timespec xts, tom, slp; | 99 | struct timespec xts, tom, slp; |
95 | 100 | ||
96 | get_xtime_and_monotonic_and_sleep_offset(&xts, &tom, &slp); | 101 | get_xtime_and_monotonic_and_sleep_offset(&xts, &tom, &slp); |
97 | 102 | ||
98 | xtim = timespec_to_ktime(xts); | 103 | xtim = timespec_to_ktime(xts); |
99 | tomono = timespec_to_ktime(tom); | 104 | mono = ktime_add(xtim, timespec_to_ktime(tom)); |
105 | boot = ktime_add(mono, timespec_to_ktime(slp)); | ||
100 | base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim; | 106 | base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim; |
101 | base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = | 107 | base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = mono; |
102 | ktime_add(xtim, tomono); | 108 | base->clock_base[HRTIMER_BASE_BOOTTIME].softirq_time = boot; |
103 | } | 109 | } |
104 | 110 | ||
105 | /* | 111 | /* |
@@ -727,6 +733,7 @@ static int hrtimer_switch_to_hres(void) | |||
727 | base->hres_active = 1; | 733 | base->hres_active = 1; |
728 | base->clock_base[HRTIMER_BASE_REALTIME].resolution = KTIME_HIGH_RES; | 734 | base->clock_base[HRTIMER_BASE_REALTIME].resolution = KTIME_HIGH_RES; |
729 | base->clock_base[HRTIMER_BASE_MONOTONIC].resolution = KTIME_HIGH_RES; | 735 | base->clock_base[HRTIMER_BASE_MONOTONIC].resolution = KTIME_HIGH_RES; |
736 | base->clock_base[HRTIMER_BASE_BOOTTIME].resolution = KTIME_HIGH_RES; | ||
730 | 737 | ||
731 | tick_setup_sched_timer(); | 738 | tick_setup_sched_timer(); |
732 | 739 | ||
@@ -1719,6 +1726,7 @@ void __init hrtimers_init(void) | |||
1719 | { | 1726 | { |
1720 | hrtimer_clock_to_base_table[CLOCK_REALTIME] = HRTIMER_BASE_REALTIME; | 1727 | hrtimer_clock_to_base_table[CLOCK_REALTIME] = HRTIMER_BASE_REALTIME; |
1721 | hrtimer_clock_to_base_table[CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC; | 1728 | hrtimer_clock_to_base_table[CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC; |
1729 | hrtimer_clock_to_base_table[CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME; | ||
1722 | 1730 | ||
1723 | hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE, | 1731 | hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE, |
1724 | (void *)(long)smp_processor_id()); | 1732 | (void *)(long)smp_processor_id()); |