From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, Steve
Cc: David Miller <davem@davemloft.net>,
Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>
Subject: [RFC patch 15/15] LTTng timestamp x86
Date: Thu, 16 Oct 2008 19:27:44 -0400 [thread overview]
Message-ID: <20081016234657.837704867@polymtl.ca> (raw)
In-Reply-To: 20081016232729.699004293@polymtl.ca
[-- Attachment #1: lttng-timestamp-x86.patch --]
[-- Type: text/plain, Size: 4543 bytes --]
X86 LTTng timestamping. Depends on ltt-test-tsc module to detect if timestamp
counters are synchronized on the machine.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Ingo Molnar <mingo@redhat.com>
CC: H. Peter Anvin <hpa@zytor.com>
CC: Linus Torvalds <torvalds@linux-foundation.org>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
CC: Steven Rostedt <rostedt@goodmis.org>
---
arch/x86/Kconfig | 2
include/asm-x86/ltt.h | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 125 insertions(+)
Index: linux-2.6-lttng/include/asm-x86/ltt.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6-lttng/include/asm-x86/ltt.h 2008-10-16 18:53:27.000000000 -0400
@@ -0,0 +1,123 @@
+#ifndef _ASM_X86_LTT_H
+#define _ASM_X86_LTT_H
+/*
+ * linux/include/asm-x86/ltt.h
+ *
+ * Copyright (C) 2005,2006 - Mathieu Desnoyers (mathieu.desnoyers@polymtl.ca)
+ *
+ * x86 time and TSC definitions for ltt
+ */
+
+#include <linux/timex.h>
+#include <asm/system.h>
+#include <asm/processor.h>
+#include <asm/atomic.h>
+
+/* Minimum duration of a probe, in cycles */
+#define LTT_MIN_PROBE_DURATION 200
+
+#ifdef CONFIG_HAVE_LTT_SYNTHETIC_TSC
+/* Only for testing. Never needed on x86. */
+u64 ltt_read_synthetic_tsc(void);
+#endif
+
+#ifdef CONFIG_HAVE_LTT_UNSTABLE_TSC
+extern cycles_t ltt_last_tsc;
+extern int ltt_tsc_is_sync;
+
+/*
+ * Support for architectures with non-sync TSCs.
+ * When the local TSC is discovered to lag behind the highest TSC counter, we
+ * increment the TSC count of an amount that should be, ideally, lower than the
+ * execution time of this routine, in cycles : this is the granularity we look
+ * for : we must be able to order the events.
+ */
+static inline cycles_t ltt_async_tsc_read(void)
+{
+ cycles_t new_tsc;
+ cycles_t last_tsc;
+
+ rdtsc_barrier();
+ new_tsc = get_cycles();
+ rdtsc_barrier();
+ do {
+ last_tsc = ltt_last_tsc;
+ if (new_tsc < last_tsc)
+ new_tsc = last_tsc + LTT_MIN_PROBE_DURATION;
+ /*
+ * If cmpxchg fails with a value higher than the new_tsc, don't
+ * retry : the value has been incremented and the events
+ * happened almost at the same time.
+ * We must retry if cmpxchg fails with a lower value :
+ * it means that we are the CPU with highest frequency and
+ * therefore MUST update the value.
+ */
+ } while (cmpxchg64(<t_last_tsc, last_tsc, new_tsc) < new_tsc);
+ return new_tsc;
+}
+
+static inline u32 ltt_get_timestamp32(void)
+{
+ u32 cycles;
+
+ if (ltt_tsc_is_sync) {
+ rdtsc_barrier();
+ cycles = (u32)get_cycles(); /* only need the 32 LSB */
+ rdtsc_barrier();
+ } else
+ cycles = (u32)ltt_async_tsc_read();
+ return cycles;
+}
+
+static inline u64 ltt_get_timestamp64(void)
+{
+ u64 cycles;
+
+ if (ltt_tsc_is_sync) {
+ rdtsc_barrier();
+ cycles = get_cycles();
+ rdtsc_barrier();
+ } else
+ cycles = ltt_async_tsc_read();
+ return cycles;
+}
+#else /* CONFIG_HAVE_LTT_UNSTABLE_TSC */
+static inline u32 ltt_get_timestamp32(void)
+{
+ u32 cycles;
+
+ rdtsc_barrier();
+ cycles = (u32)get_cycles(); /* only need the 32 LSB */
+ rdtsc_barrier();
+ return cycles;
+}
+
+static inline u64 ltt_get_timestamp64(void)
+{
+ u64 cycles;
+
+ rdtsc_barrier();
+ cycles = get_cycles();
+ rdtsc_barrier();
+ return cycles;
+}
+#endif /* CONFIG_HAVE_LTT_UNSTABLE_TSC */
+
+/*
+ * Periodic IPI to have an upper bound on TSC inaccuracy.
+ * TODO: should implement this in ltt-test-tsc.ko.
+ */
+static inline void ltt_add_timestamp(unsigned long ticks)
+{ }
+
+static inline unsigned int ltt_frequency(void)
+{
+ return cpu_khz;
+}
+
+static inline u32 ltt_freq_scale(void)
+{
+ return 1000;
+}
+
+#endif /* _ASM_X86_LTT_H */
Index: linux-2.6-lttng/arch/x86/Kconfig
===================================================================
--- linux-2.6-lttng.orig/arch/x86/Kconfig 2008-10-16 18:50:29.000000000 -0400
+++ linux-2.6-lttng/arch/x86/Kconfig 2008-10-16 18:53:09.000000000 -0400
@@ -26,6 +26,8 @@ config X86
select HAVE_KPROBES
select ARCH_WANT_OPTIONAL_GPIOLIB
select HAVE_KRETPROBES
+ select HAVE_LTT_CLOCK
+ select HAVE_LTT_UNSTABLE_TSC
select HAVE_DYNAMIC_FTRACE
select HAVE_FTRACE
select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
WARNING: multiple messages have this Message-ID (diff)
From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
Steven Rostedt <rostedt@goodmis.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Thomas Gleixner <tglx@linutronix.de>
Cc: David Miller <davem@davemloft.net>,
Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>
Subject: [RFC patch 15/15] LTTng timestamp x86
Date: Thu, 16 Oct 2008 19:27:44 -0400 [thread overview]
Message-ID: <20081016234657.837704867@polymtl.ca> (raw)
Message-ID: <20081016232744.8hDwIEbGPu0Vj0grIsEk-Lro-cu4AV0ZzDjBh3TaXXM@z> (raw)
In-Reply-To: 20081016232729.699004293@polymtl.ca
[-- Attachment #1: lttng-timestamp-x86.patch --]
[-- Type: text/plain, Size: 4543 bytes --]
X86 LTTng timestamping. Depends on ltt-test-tsc module to detect if timestamp
counters are synchronized on the machine.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Ingo Molnar <mingo@redhat.com>
CC: H. Peter Anvin <hpa@zytor.com>
CC: Linus Torvalds <torvalds@linux-foundation.org>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
CC: Steven Rostedt <rostedt@goodmis.org>
---
arch/x86/Kconfig | 2
include/asm-x86/ltt.h | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 125 insertions(+)
Index: linux-2.6-lttng/include/asm-x86/ltt.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6-lttng/include/asm-x86/ltt.h 2008-10-16 18:53:27.000000000 -0400
@@ -0,0 +1,123 @@
+#ifndef _ASM_X86_LTT_H
+#define _ASM_X86_LTT_H
+/*
+ * linux/include/asm-x86/ltt.h
+ *
+ * Copyright (C) 2005,2006 - Mathieu Desnoyers (mathieu.desnoyers@polymtl.ca)
+ *
+ * x86 time and TSC definitions for ltt
+ */
+
+#include <linux/timex.h>
+#include <asm/system.h>
+#include <asm/processor.h>
+#include <asm/atomic.h>
+
+/* Minimum duration of a probe, in cycles */
+#define LTT_MIN_PROBE_DURATION 200
+
+#ifdef CONFIG_HAVE_LTT_SYNTHETIC_TSC
+/* Only for testing. Never needed on x86. */
+u64 ltt_read_synthetic_tsc(void);
+#endif
+
+#ifdef CONFIG_HAVE_LTT_UNSTABLE_TSC
+extern cycles_t ltt_last_tsc;
+extern int ltt_tsc_is_sync;
+
+/*
+ * Support for architectures with non-sync TSCs.
+ * When the local TSC is discovered to lag behind the highest TSC counter, we
+ * increment the TSC count of an amount that should be, ideally, lower than the
+ * execution time of this routine, in cycles : this is the granularity we look
+ * for : we must be able to order the events.
+ */
+static inline cycles_t ltt_async_tsc_read(void)
+{
+ cycles_t new_tsc;
+ cycles_t last_tsc;
+
+ rdtsc_barrier();
+ new_tsc = get_cycles();
+ rdtsc_barrier();
+ do {
+ last_tsc = ltt_last_tsc;
+ if (new_tsc < last_tsc)
+ new_tsc = last_tsc + LTT_MIN_PROBE_DURATION;
+ /*
+ * If cmpxchg fails with a value higher than the new_tsc, don't
+ * retry : the value has been incremented and the events
+ * happened almost at the same time.
+ * We must retry if cmpxchg fails with a lower value :
+ * it means that we are the CPU with highest frequency and
+ * therefore MUST update the value.
+ */
+ } while (cmpxchg64(<t_last_tsc, last_tsc, new_tsc) < new_tsc);
+ return new_tsc;
+}
+
+static inline u32 ltt_get_timestamp32(void)
+{
+ u32 cycles;
+
+ if (ltt_tsc_is_sync) {
+ rdtsc_barrier();
+ cycles = (u32)get_cycles(); /* only need the 32 LSB */
+ rdtsc_barrier();
+ } else
+ cycles = (u32)ltt_async_tsc_read();
+ return cycles;
+}
+
+static inline u64 ltt_get_timestamp64(void)
+{
+ u64 cycles;
+
+ if (ltt_tsc_is_sync) {
+ rdtsc_barrier();
+ cycles = get_cycles();
+ rdtsc_barrier();
+ } else
+ cycles = ltt_async_tsc_read();
+ return cycles;
+}
+#else /* CONFIG_HAVE_LTT_UNSTABLE_TSC */
+static inline u32 ltt_get_timestamp32(void)
+{
+ u32 cycles;
+
+ rdtsc_barrier();
+ cycles = (u32)get_cycles(); /* only need the 32 LSB */
+ rdtsc_barrier();
+ return cycles;
+}
+
+static inline u64 ltt_get_timestamp64(void)
+{
+ u64 cycles;
+
+ rdtsc_barrier();
+ cycles = get_cycles();
+ rdtsc_barrier();
+ return cycles;
+}
+#endif /* CONFIG_HAVE_LTT_UNSTABLE_TSC */
+
+/*
+ * Periodic IPI to have an upper bound on TSC inaccuracy.
+ * TODO: should implement this in ltt-test-tsc.ko.
+ */
+static inline void ltt_add_timestamp(unsigned long ticks)
+{ }
+
+static inline unsigned int ltt_frequency(void)
+{
+ return cpu_khz;
+}
+
+static inline u32 ltt_freq_scale(void)
+{
+ return 1000;
+}
+
+#endif /* _ASM_X86_LTT_H */
Index: linux-2.6-lttng/arch/x86/Kconfig
===================================================================
--- linux-2.6-lttng.orig/arch/x86/Kconfig 2008-10-16 18:50:29.000000000 -0400
+++ linux-2.6-lttng/arch/x86/Kconfig 2008-10-16 18:53:09.000000000 -0400
@@ -26,6 +26,8 @@ config X86
select HAVE_KPROBES
select ARCH_WANT_OPTIONAL_GPIOLIB
select HAVE_KRETPROBES
+ select HAVE_LTT_CLOCK
+ select HAVE_LTT_UNSTABLE_TSC
select HAVE_DYNAMIC_FTRACE
select HAVE_FTRACE
select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
next prev parent reply other threads:[~2008-10-16 23:27 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-16 23:27 [RFC patch 00/15] Tracer Timestamping Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 01/15] get_cycles() : kconfig HAVE_GET_CYCLES Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 02/15] get_cycles() : x86 HAVE_GET_CYCLES Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 03/15] get_cycles() : sparc64 HAVE_GET_CYCLES Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-17 2:48 ` [RFC patch 03/15] get_cycles() : sparc64 HAVE_GET_CYCLES (update) Mathieu Desnoyers
2008-10-17 2:48 ` Mathieu Desnoyers
2008-10-17 2:57 ` David Miller
2008-10-16 23:27 ` [RFC patch 04/15] get_cycles() : powerpc64 HAVE_GET_CYCLES Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-17 0:26 ` Paul Mackerras
2008-10-17 0:43 ` [RFC patch 04/15] get_cycles() : powerpc64 HAVE_GET_CYCLES (update) Mathieu Desnoyers
2008-10-17 0:54 ` Paul Mackerras
2008-10-17 1:42 ` David Miller
2008-10-17 2:08 ` Mathieu Desnoyers
2008-10-17 2:33 ` David Miller
2008-10-16 23:27 ` [RFC patch 05/15] get_cycles() : MIPS HAVE_GET_CYCLES_32 Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-26 10:18 ` Ralf Baechle
2008-10-26 20:39 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 06/15] LTTng build Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-17 8:10 ` KOSAKI Motohiro
2008-10-17 16:18 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 07/15] LTTng timestamp Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-17 8:15 ` KOSAKI Motohiro
2008-10-17 16:23 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 08/15] LTTng - Timestamping Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 09/15] LTTng mips export hpt frequency Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 10/15] LTTng timestamp mips Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 11/15] LTTng timestamp powerpc Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 12/15] LTTng timestamp sparc64 Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 13/15] LTTng timestamp sh Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` [RFC patch 14/15] LTTng - TSC synchronicity test Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers
2008-10-16 23:27 ` Mathieu Desnoyers [this message]
2008-10-16 23:27 ` [RFC patch 15/15] LTTng timestamp x86 Mathieu Desnoyers
2008-10-17 0:08 ` Linus Torvalds
2008-10-17 0:12 ` Linus Torvalds
2008-10-17 1:28 ` Mathieu Desnoyers
2008-10-17 2:19 ` Luck, Tony
2008-10-17 17:25 ` Steven Rostedt
2008-10-17 18:08 ` Luck, Tony
2008-10-17 18:42 ` Mathieu Desnoyers
2008-10-17 18:58 ` Luck, Tony
2008-10-17 20:23 ` Mathieu Desnoyers
2008-10-17 23:52 ` Luck, Tony
2008-10-18 17:01 ` Mathieu Desnoyers
2008-10-18 17:35 ` Linus Torvalds
2008-10-18 17:50 ` Ingo Molnar
2008-10-22 16:19 ` Mathieu Desnoyers
2008-10-22 15:53 ` Mathieu Desnoyers
2008-10-20 18:07 ` Luck, Tony
2008-10-22 16:51 ` Mathieu Desnoyers
2008-10-17 19:17 ` Steven Rostedt
2008-10-20 20:10 ` Linus Torvalds
2008-10-20 21:38 ` john stultz
2008-10-20 22:06 ` Linus Torvalds
2008-10-20 22:17 ` Ingo Molnar
2008-10-20 22:29 ` H. Peter Anvin
2008-10-21 18:10 ` Bjorn Helgaas
2008-10-23 15:47 ` Linus Torvalds
2008-10-23 16:39 ` H. Peter Anvin
2008-10-23 21:54 ` Paul Mackerras
2008-10-20 23:47 ` john stultz
2008-10-22 17:05 ` Mathieu Desnoyers
2008-10-17 19:36 ` Christoph Lameter
2008-10-17 7:59 ` [RFC patch 00/15] Tracer Timestamping Peter Zijlstra
2008-10-20 20:25 ` Mathieu Desnoyers
2008-10-21 0:20 ` Nicolas Pitre
2008-10-21 1:32 ` Mathieu Desnoyers
2008-10-21 2:32 ` Nicolas Pitre
2008-10-21 4:05 ` Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081016234657.837704867@polymtl.ca \
--to=mathieu.desnoyers@polymtl.ca \
--cc=akpm@linux-foundation.org \
--cc=davem@davemloft.net \
--cc=hpa@zytor.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mingo@redhat.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.