Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1532554
| From | tip-bot for Joel Fernandes <tipbot@zytor.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [tip:timers/core] timekeeping: Add a fast and NMI safe boot clock |
| Date | 2016-11-29 18:20 +0100 |
| Message-ID | <sIUeu-2Xs-37@gated-at.bofh.it> (permalink) |
| References | <sICKC-89o-59@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
Commit-ID: 948a5312f41658f7b76a598a139ef1f4dea09ca9
Gitweb: http://git.kernel.org/tip/948a5312f41658f7b76a598a139ef1f4dea09ca9
Author: Joel Fernandes <joelaf@google.com>
AuthorDate: Mon, 28 Nov 2016 14:35:22 -0800
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitDate: Tue, 29 Nov 2016 18:02:59 +0100
timekeeping: Add a fast and NMI safe boot clock
This boot clock can be used as a tracing clock and will account for
suspend time.
To keep it NMI safe since we're accessing from tracing, we're not using a
separate timekeeper with updates to monotonic clock and boot offset
protected with seqlocks. This has the following minor side effects:
(1) Its possible that a timestamp be taken after the boot offset is updated
but before the timekeeper is updated. If this happens, the new boot offset
is added to the old timekeeping making the clock appear to update slightly
earlier:
CPU 0 CPU 1
timekeeping_inject_sleeptime64()
__timekeeping_inject_sleeptime(tk, delta);
timestamp();
timekeeping_update(tk, TK_CLEAR_NTP...);
(2) On 32-bit systems, the 64-bit boot offset (tk->offs_boot) may be
partially updated. Since the tk->offs_boot update is a rare event, this
should be a rare occurrence which postprocessing should be able to handle.
Signed-off-by: Joel Fernandes <joelaf@google.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1480372524-15181-6-git-send-email-john.stultz@linaro.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/timekeeping.h | 1 +
kernel/time/timekeeping.c | 29 +++++++++++++++++++++++++++++
2 files changed, 30 insertions(+)
diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h
index 09168c5..361f8bf 100644
--- a/include/linux/timekeeping.h
+++ b/include/linux/timekeeping.h
@@ -249,6 +249,7 @@ static inline u64 ktime_get_raw_ns(void)
extern u64 ktime_get_mono_fast_ns(void);
extern u64 ktime_get_raw_fast_ns(void);
+extern u64 ktime_get_boot_fast_ns(void);
/*
* Timespec interfaces utilizing the ktime based ones
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 37dec7e..b2286e9 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -425,6 +425,35 @@ u64 ktime_get_raw_fast_ns(void)
}
EXPORT_SYMBOL_GPL(ktime_get_raw_fast_ns);
+/**
+ * ktime_get_boot_fast_ns - NMI safe and fast access to boot clock.
+ *
+ * To keep it NMI safe since we're accessing from tracing, we're not using a
+ * separate timekeeper with updates to monotonic clock and boot offset
+ * protected with seqlocks. This has the following minor side effects:
+ *
+ * (1) Its possible that a timestamp be taken after the boot offset is updated
+ * but before the timekeeper is updated. If this happens, the new boot offset
+ * is added to the old timekeeping making the clock appear to update slightly
+ * earlier:
+ * CPU 0 CPU 1
+ * timekeeping_inject_sleeptime64()
+ * __timekeeping_inject_sleeptime(tk, delta);
+ * timestamp();
+ * timekeeping_update(tk, TK_CLEAR_NTP...);
+ *
+ * (2) On 32-bit systems, the 64-bit boot offset (tk->offs_boot) may be
+ * partially updated. Since the tk->offs_boot update is a rare event, this
+ * should be a rare occurrence which postprocessing should be able to handle.
+ */
+u64 notrace ktime_get_boot_fast_ns(void)
+{
+ struct timekeeper *tk = &tk_core.timekeeper;
+
+ return (ktime_get_mono_fast_ns() + ktime_to_ns(tk->offs_boot));
+}
+EXPORT_SYMBOL_GPL(ktime_get_boot_fast_ns);
+
/* Suspend-time cycles value for halted fast timekeeper. */
static cycle_t cycles_at_suspend;
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[GIT PULL][PATCH 0/7] Timekeeping changes for 4.10 (take 2) John Stultz <john.stultz@linaro.org> - 2016-11-28 23:40 +0100
[PATCH 3/7] timekeeping: clocksource_cyc2ns: Document intended range limitation John Stultz <john.stultz@linaro.org> - 2016-11-28 23:40 +0100
[tip:timers/core] timekeeping/clocksource_cyc2ns: Document intended range limitation tip-bot for Chris Metcalf <tipbot@zytor.com> - 2016-11-29 18:20 +0100
[PATCH 5/7] timekeeping: Add a fast and NMI safe boot clock John Stultz <john.stultz@linaro.org> - 2016-11-28 23:40 +0100
[tip:timers/core] timekeeping: Add a fast and NMI safe boot clock tip-bot for Joel Fernandes <tipbot@zytor.com> - 2016-11-29 18:20 +0100
[PATCH 7/7] trace: Update documentation for mono, mono_raw and boot clock John Stultz <john.stultz@linaro.org> - 2016-11-28 23:40 +0100
Re: [PATCH 7/7] trace: Update documentation for mono, mono_raw and boot clock Steven Rostedt <rostedt@goodmis.org> - 2016-11-29 00:10 +0100
Re: [PATCH 7/7] trace: Update documentation for mono, mono_raw and boot clock Ingo Molnar <mingo@kernel.org> - 2016-11-29 08:30 +0100
Re: [PATCH 7/7] trace: Update documentation for mono, mono_raw and boot clock Thomas Gleixner <tglx@linutronix.de> - 2016-11-29 17:20 +0100
Re: [PATCH 7/7] trace: Update documentation for mono, mono_raw and boot clock Joel Fernandes <joelaf@google.com> - 2016-11-29 17:20 +0100
[tip:timers/core] trace: Update documentation for mono, mono_raw and boot clock tip-bot for Joel Fernandes <tipbot@zytor.com> - 2016-11-29 18:20 +0100
csiph-web