diff options
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()); |