71 lines
2.3 KiB
Diff
71 lines
2.3 KiB
Diff
From df432bbdd8fef88c9827f09d694fdcffa90f46a2 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 268/279] 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,
|