Commit 70a08cca1227dc31c784ec930099a4417a06e7d0
1 parent
314ac37150
Exists in
master
and in
39 other branches
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>
Showing 3 changed files with 14 additions and 4 deletions Side-by-side Diff
include/linux/hrtimer.h
include/linux/time.h
kernel/hrtimer.c
... | ... | @@ -73,6 +73,11 @@ |
73 | 73 | .get_time = &ktime_get, |
74 | 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 | |
79 | 84 | |
80 | 85 | |
... | ... | @@ -90,16 +95,17 @@ |
90 | 95 | */ |
91 | 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 | 99 | struct timespec xts, tom, slp; |
95 | 100 | |
96 | 101 | get_xtime_and_monotonic_and_sleep_offset(&xts, &tom, &slp); |
97 | 102 | |
98 | 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 | 106 | base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim; |
101 | - base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = | |
102 | - ktime_add(xtim, tomono); | |
107 | + base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = mono; | |
108 | + base->clock_base[HRTIMER_BASE_BOOTTIME].softirq_time = boot; | |
103 | 109 | } |
104 | 110 | |
105 | 111 | /* |
... | ... | @@ -727,6 +733,7 @@ |
727 | 733 | base->hres_active = 1; |
728 | 734 | base->clock_base[HRTIMER_BASE_REALTIME].resolution = KTIME_HIGH_RES; |
729 | 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 | 738 | tick_setup_sched_timer(); |
732 | 739 | |
... | ... | @@ -1719,6 +1726,7 @@ |
1719 | 1726 | { |
1720 | 1727 | hrtimer_clock_to_base_table[CLOCK_REALTIME] = HRTIMER_BASE_REALTIME; |
1721 | 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 | 1731 | hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE, |
1724 | 1732 | (void *)(long)smp_processor_id()); |