Commit 70a08cca1227dc31c784ec930099a4417a06e7d0

Authored by John Stultz
1 parent 314ac37150

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
... ... @@ -151,6 +151,7 @@
151 151 enum hrtimer_base_type {
152 152 HRTIMER_BASE_REALTIME,
153 153 HRTIMER_BASE_MONOTONIC,
  154 + HRTIMER_BASE_BOOTTIME,
154 155 HRTIMER_MAX_CLOCK_BASES,
155 156 };
156 157  
include/linux/time.h
... ... @@ -293,6 +293,7 @@
293 293 #define CLOCK_MONOTONIC_RAW 4
294 294 #define CLOCK_REALTIME_COARSE 5
295 295 #define CLOCK_MONOTONIC_COARSE 6
  296 +#define CLOCK_BOOTTIME 7
296 297  
297 298 /*
298 299 * The IDs of various hardware clocks:
... ... @@ -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());