aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2016-01-15 12:41:09 -0500
committerThomas Gleixner <tglx@linutronix.de>2017-02-18 04:58:39 -0500
commit336a9cde10d641e70bac67d90ae91b3190c3edca (patch)
tree6b987abecbe65d4ed1dcd3a9d5ad4e2215b4bac8
parentdba9a0babdd938a51d11ae81f9c40d07ca613f43 (diff)
hrtimer: Catch invalid clockids again
commit 82e88ff1ea94 ("hrtimer: Revert CLOCK_MONOTONIC_RAW support") removed unfortunately a sanity check in the hrtimer code which was part of that MONOTONIC_RAW patch series. It would have caught the bogus usage of CLOCK_MONOTONIC_RAW in the wireless code. So bring it back. It is way too easy to take any random clockid and feed it to the hrtimer subsystem. At best, it gets mapped to a monotonic base, but it would be better to just catch illegal values as early as possible. Detect invalid clockids, map them to CLOCK_MONOTONIC and emit a warning. [ tglx: Replaced the BUG by a WARN and gracefully map to CLOCK_MONOTONIC ] Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Cc: Tomasz Nowicki <tn@semihalf.com> Cc: Christoffer Dall <christoffer.dall@linaro.org> Link: http://lkml.kernel.org/r/1452879670-16133-3-git-send-email-marc.zyngier@arm.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--kernel/time/hrtimer.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index edabde646e58..8e11d8d9f419 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -94,17 +94,15 @@ DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) =
94}; 94};
95 95
96static const int hrtimer_clock_to_base_table[MAX_CLOCKS] = { 96static const int hrtimer_clock_to_base_table[MAX_CLOCKS] = {
97 /* Make sure we catch unsupported clockids */
98 [0 ... MAX_CLOCKS - 1] = HRTIMER_MAX_CLOCK_BASES,
99
97 [CLOCK_REALTIME] = HRTIMER_BASE_REALTIME, 100 [CLOCK_REALTIME] = HRTIMER_BASE_REALTIME,
98 [CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC, 101 [CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC,
99 [CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME, 102 [CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME,
100 [CLOCK_TAI] = HRTIMER_BASE_TAI, 103 [CLOCK_TAI] = HRTIMER_BASE_TAI,
101}; 104};
102 105
103static inline int hrtimer_clockid_to_base(clockid_t clock_id)
104{
105 return hrtimer_clock_to_base_table[clock_id];
106}
107
108/* 106/*
109 * Functions and macros which are different for UP/SMP systems are kept in a 107 * Functions and macros which are different for UP/SMP systems are kept in a
110 * single place 108 * single place
@@ -1081,6 +1079,18 @@ u64 hrtimer_get_next_event(void)
1081} 1079}
1082#endif 1080#endif
1083 1081
1082static inline int hrtimer_clockid_to_base(clockid_t clock_id)
1083{
1084 if (likely(clock_id < MAX_CLOCKS)) {
1085 int base = hrtimer_clock_to_base_table[clock_id];
1086
1087 if (likely(base != HRTIMER_MAX_CLOCK_BASES))
1088 return base;
1089 }
1090 WARN(1, "Invalid clockid %d. Using MONOTONIC\n", clock_id);
1091 return HRTIMER_BASE_MONOTONIC;
1092}
1093
1084static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, 1094static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
1085 enum hrtimer_mode mode) 1095 enum hrtimer_mode mode)
1086{ 1096{