| From 90d3613d79109656759489f8092f61277c7dc3e1 Mon Sep 17 00:00:00 2001 |
| From: Carsten Emde <C.Emde@osadl.org> |
| Date: Wed, 11 Jul 2012 22:05:18 +0000 |
| Subject: [PATCH 257/268] 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> |
| --- |
| include/linux/hrtimer.h | 3 +++ |
| kernel/hrtimer.c | 16 ++++++++++++++-- |
| 2 files changed, 17 insertions(+), 2 deletions(-) |
| |
| diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h |
| index 26b008b..7259cd3 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 3848761..bca6928 100644 |
| --- a/kernel/hrtimer.c |
| +++ b/kernel/hrtimer.c |
| @@ -1031,6 +1031,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); |
| @@ -1467,8 +1478,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, |
| -- |
| 1.7.10.4 |
| |