diff options
author | Carsten Emde <C.Emde@osadl.org> | 2012-07-11 22:05:18 +0000 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2013-10-24 11:06:20 -0400 |
commit | 89b9473b2f6140c0a82c6b49601c5385792b30cf (patch) | |
tree | f021c41dba5f82f2834a435de917d5e075ee6439 | |
parent | 18de79551225053bab4989d1fdd3df73093e7c23 (diff) | |
download | linux-rt-89b9473b2f6140c0a82c6b49601c5385792b30cf.tar.gz |
Latency histograms: Adjust timer, if already elapsed when programmed
Nothing prevents a programmer from calling clock_nanosleep() with an
already elapsed wakeup time in absolute time mode or with a too small
delay in relative time mode. Such timers cannot wake up in time and,
thus, should be corrected when entered into the missed timers latency
histogram (CONFIG_MISSED_TIMERS_HIST).
This patch marks such timers and uses a corrected expiration time.
Signed-off-by: Carsten Emde <C.Emde@osadl.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | include/linux/hrtimer.h | 3 | ||||
-rw-r--r-- | kernel/hrtimer.c | 16 |
2 files changed, 17 insertions, 2 deletions
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 26b008b6450e..7259cd308281 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h @@ -113,6 +113,9 @@ struct hrtimer { unsigned long state; struct list_head cb_entry; int irqsafe; +#ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST + ktime_t praecox; +#endif #ifdef CONFIG_TIMER_STATS int start_pid; void *start_site; diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 9a95382bab80..28dbd3e01154 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -1019,6 +1019,17 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, #endif } +#ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST + { + ktime_t now = new_base->get_time(); + + if (ktime_to_ns(tim) < ktime_to_ns(now)) + timer->praecox = now; + else + timer->praecox = ktime_set(0, 0); + } +#endif + hrtimer_set_expires_range_ns(timer, tim, delta_ns); timer_stats_hrtimer_set_start_info(timer); @@ -1475,8 +1486,9 @@ retry: timer = container_of(node, struct hrtimer, node); trace_hrtimer_interrupt(raw_smp_processor_id(), - ktime_to_ns(ktime_sub( - hrtimer_get_expires(timer), basenow)), + ktime_to_ns(ktime_sub(ktime_to_ns(timer->praecox) ? + timer->praecox : hrtimer_get_expires(timer), + basenow)), current, timer->function == hrtimer_wakeup ? container_of(timer, struct hrtimer_sleeper, |