LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH 0/2] boot tracer updates
@ 2008-11-12 5:54 Steven Rostedt
2008-11-12 5:54 ` [PATCH 1/2] tracing/fastboot: Move boot tracer structs and funcs into their own header Steven Rostedt
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Steven Rostedt @ 2008-11-12 5:54 UTC (permalink / raw)
To: linux-kernel; +Cc: Ingo Molnar, Andrew Morton
Ingo,
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
branch: tip/devel
Frederic Weisbecker (2):
tracing/fastboot: Move boot tracer structs and funcs into their own header.
tracing/fastboot: Use the ring-buffer timestamp for initcall entries
----
include/linux/ftrace.h | 41 ---------------
include/trace/boot.h | 56 ++++++++++++++++++++
init/main.c | 33 +++++++------
kernel/trace/trace.h | 16 ++++--
kernel/trace/trace_boot.c | 123 ++++++++++++++++++++++++++++++++++-----------
5 files changed, 179 insertions(+), 90 deletions(-)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/2] tracing/fastboot: Move boot tracer structs and funcs into their own header.
2008-11-12 5:54 [PATCH 0/2] boot tracer updates Steven Rostedt
@ 2008-11-12 5:54 ` Steven Rostedt
2008-11-12 5:54 ` [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries Steven Rostedt
2008-11-12 8:40 ` [PATCH 0/2] boot tracer updates Frédéric Weisbecker
2 siblings, 0 replies; 13+ messages in thread
From: Steven Rostedt @ 2008-11-12 5:54 UTC (permalink / raw)
To: linux-kernel
Cc: Ingo Molnar, Andrew Morton, Frederic Weisbecker, Steven Rostedt
[-- Attachment #1: 0001-tracing-fastboot-Move-boot-tracer-structs-and-funcs.patch --]
[-- Type: text/plain, Size: 4089 bytes --]
Impact: Cleanups on the boot tracer and ftrace
This patch bring some cleanups about the boot tracer headers.
The functions and structures of this tracer have nothing related to
ftrace and should have so their own header file.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
---
include/linux/ftrace.h | 41 -----------------------------------------
include/trace/boot.h | 43 +++++++++++++++++++++++++++++++++++++++++++
init/main.c | 1 +
kernel/trace/trace.h | 1 +
4 files changed, 45 insertions(+), 41 deletions(-)
create mode 100644 include/trace/boot.h
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index dcbbf72..4fbc4a8 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -287,45 +287,4 @@ extern trace_function_return_t ftrace_function_return;
extern void unregister_ftrace_return(void);
#endif
-/*
- * Structure which defines the trace of an initcall.
- * You don't have to fill the func field since it is
- * only used internally by the tracer.
- */
-struct boot_trace {
- pid_t caller;
- char func[KSYM_NAME_LEN];
- int result;
- unsigned long long duration; /* usecs */
- ktime_t calltime;
- ktime_t rettime;
-};
-
-#ifdef CONFIG_BOOT_TRACER
-/* Append the trace on the ring-buffer */
-extern void trace_boot(struct boot_trace *it, initcall_t fn);
-
-/* Tells the tracer that smp_pre_initcall is finished.
- * So we can start the tracing
- */
-extern void start_boot_trace(void);
-
-/* Resume the tracing of other necessary events
- * such as sched switches
- */
-extern void enable_boot_trace(void);
-
-/* Suspend this tracing. Actually, only sched_switches tracing have
- * to be suspended. Initcalls doesn't need it.)
- */
-extern void disable_boot_trace(void);
-#else
-static inline void trace_boot(struct boot_trace *it, initcall_t fn) { }
-static inline void start_boot_trace(void) { }
-static inline void enable_boot_trace(void) { }
-static inline void disable_boot_trace(void) { }
-#endif
-
-
-
#endif /* _LINUX_FTRACE_H */
diff --git a/include/trace/boot.h b/include/trace/boot.h
new file mode 100644
index 0000000..4cbe64e
--- /dev/null
+++ b/include/trace/boot.h
@@ -0,0 +1,43 @@
+#ifndef _LINUX_TRACE_BOOT_H
+#define _LINUX_TRACE_BOOT_H
+
+/*
+ * Structure which defines the trace of an initcall.
+ * You don't have to fill the func field since it is
+ * only used internally by the tracer.
+ */
+struct boot_trace {
+ pid_t caller;
+ char func[KSYM_NAME_LEN];
+ int result;
+ unsigned long long duration; /* usecs */
+ ktime_t calltime;
+ ktime_t rettime;
+};
+
+#ifdef CONFIG_BOOT_TRACER
+/* Append the trace on the ring-buffer */
+extern void trace_boot(struct boot_trace *it, initcall_t fn);
+
+/* Tells the tracer that smp_pre_initcall is finished.
+ * So we can start the tracing
+ */
+extern void start_boot_trace(void);
+
+/* Resume the tracing of other necessary events
+ * such as sched switches
+ */
+extern void enable_boot_trace(void);
+
+/* Suspend this tracing. Actually, only sched_switches tracing have
+ * to be suspended. Initcalls doesn't need it.)
+ */
+extern void disable_boot_trace(void);
+#else
+static inline void trace_boot(struct boot_trace *it, initcall_t fn) { }
+static inline void start_boot_trace(void) { }
+static inline void enable_boot_trace(void) { }
+static inline void disable_boot_trace(void) { }
+#endif /* CONFIG_BOOT_TRACER */
+
+#endif /* __LINUX_TRACE_BOOT_H */
diff --git a/init/main.c b/init/main.c
index f5f4f5b..2a04290 100644
--- a/init/main.c
+++ b/init/main.c
@@ -65,6 +65,7 @@
#include <linux/idr.h>
#include <linux/kmemcheck.h>
#include <linux/ftrace.h>
+#include <trace/boot.h>
#include <asm/io.h>
#include <asm/bugs.h>
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index b20eed0..9878c27 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -8,6 +8,7 @@
#include <linux/ring_buffer.h>
#include <linux/mmiotrace.h>
#include <linux/ftrace.h>
+#include <trace/boot.h>
enum trace_type {
__TRACE_FIRST_TYPE = 0,
--
1.5.6.5
--
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
2008-11-12 5:54 [PATCH 0/2] boot tracer updates Steven Rostedt
2008-11-12 5:54 ` [PATCH 1/2] tracing/fastboot: Move boot tracer structs and funcs into their own header Steven Rostedt
@ 2008-11-12 5:54 ` Steven Rostedt
2008-11-12 6:00 ` Andrew Morton
2008-11-12 8:40 ` [PATCH 0/2] boot tracer updates Frédéric Weisbecker
2 siblings, 1 reply; 13+ messages in thread
From: Steven Rostedt @ 2008-11-12 5:54 UTC (permalink / raw)
To: linux-kernel
Cc: Ingo Molnar, Andrew Morton, Frederic Weisbecker, Steven Rostedt
[-- Attachment #1: 0002-tracing-fastboot-Use-the-ring-buffer-timestamp-for.patch --]
[-- Type: text/plain, Size: 10257 bytes --]
Impact: Split the boot tracer entries in two parts: call and return
Now that we are using the sched tracer from the boot tracer, we want to use the
same timestamp than the ring-buffer to have consistent time captures between sched
events and initcall events.
So we get rid of the old time capture by the boot tracer and split the initcall events
in two parts: call and return. This way we have the ring buffer timestamp of both.
There is an example of a trace in attachment.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
---
include/trace/boot.h | 31 ++++++++---
init/main.c | 32 ++++++------
kernel/trace/trace.h | 15 ++++--
kernel/trace/trace_boot.c | 123 ++++++++++++++++++++++++++++++++++-----------
4 files changed, 143 insertions(+), 58 deletions(-)
diff --git a/include/trace/boot.h b/include/trace/boot.h
index 4cbe64e..9eac38b 100644
--- a/include/trace/boot.h
+++ b/include/trace/boot.h
@@ -2,22 +2,30 @@
#define _LINUX_TRACE_BOOT_H
/*
- * Structure which defines the trace of an initcall.
+ * Structure which defines the trace of an initcall
+ * while it is called.
* You don't have to fill the func field since it is
* only used internally by the tracer.
*/
-struct boot_trace {
+struct boot_trace_call {
pid_t caller;
char func[KSYM_NAME_LEN];
- int result;
- unsigned long long duration; /* usecs */
- ktime_t calltime;
- ktime_t rettime;
+};
+
+/*
+ * Structure which defines the trace of an initcall
+ * while it returns.
+ */
+struct boot_trace_ret {
+ char func[KSYM_NAME_LEN];
+ int result;
+ unsigned long long duration;
};
#ifdef CONFIG_BOOT_TRACER
-/* Append the trace on the ring-buffer */
-extern void trace_boot(struct boot_trace *it, initcall_t fn);
+/* Append the traces on the ring-buffer */
+extern void trace_boot_call(struct boot_trace_call *bt, initcall_t fn);
+extern void trace_boot_ret(struct boot_trace_ret *bt, initcall_t fn);
/* Tells the tracer that smp_pre_initcall is finished.
* So we can start the tracing
@@ -34,7 +42,12 @@ extern void enable_boot_trace(void);
*/
extern void disable_boot_trace(void);
#else
-static inline void trace_boot(struct boot_trace *it, initcall_t fn) { }
+static inline
+void trace_boot_call(struct boot_trace_call *bt, initcall_t fn) { }
+
+static inline
+void trace_boot_ret(struct boot_trace_ret *bt, initcall_t fn) { }
+
static inline void start_boot_trace(void) { }
static inline void enable_boot_trace(void) { }
static inline void disable_boot_trace(void) { }
diff --git a/init/main.c b/init/main.c
index 2a04290..fc7c379 100644
--- a/init/main.c
+++ b/init/main.c
@@ -712,33 +712,35 @@ core_param(initcall_debug, initcall_debug, bool, 0644);
int do_one_initcall(initcall_t fn)
{
int count = preempt_count();
- ktime_t delta;
+ ktime_t calltime, delta, rettime;
char msgbuf[64];
- struct boot_trace it;
+ struct boot_trace_call call;
+ struct boot_trace_ret ret;
if (initcall_debug) {
- it.caller = task_pid_nr(current);
- printk("calling %pF @ %i\n", fn, it.caller);
- it.calltime = ktime_get();
+ call.caller = task_pid_nr(current);
+ printk("calling %pF @ %i\n", fn, call.caller);
+ calltime = ktime_get();
+ trace_boot_call(&call, fn);
enable_boot_trace();
}
- it.result = fn();
+ ret.result = fn();
if (initcall_debug) {
- it.rettime = ktime_get();
- delta = ktime_sub(it.rettime, it.calltime);
- it.duration = (unsigned long long) delta.tv64 >> 10;
- printk("initcall %pF returned %d after %Ld usecs\n", fn,
- it.result, it.duration);
- trace_boot(&it, fn);
disable_boot_trace();
+ rettime = ktime_get();
+ delta = ktime_sub(rettime, calltime);
+ ret.duration = (unsigned long long) delta.tv64 >> 10;
+ trace_boot_ret(&ret, fn);
+ printk("initcall %pF returned %d after %Ld usecs\n", fn,
+ ret.result, ret.duration);
}
msgbuf[0] = 0;
- if (it.result && it.result != -ENODEV && initcall_debug)
- sprintf(msgbuf, "error code %d ", it.result);
+ if (ret.result && ret.result != -ENODEV && initcall_debug)
+ sprintf(msgbuf, "error code %d ", ret.result);
if (preempt_count() != count) {
strlcat(msgbuf, "preemption imbalance ", sizeof(msgbuf));
@@ -752,7 +754,7 @@ int do_one_initcall(initcall_t fn)
printk("initcall %pF returned with %s\n", fn, msgbuf);
}
- return it.result;
+ return ret.result;
}
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 9878c27..97927a8 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -23,7 +23,8 @@ enum trace_type {
TRACE_MMIO_RW,
TRACE_MMIO_MAP,
TRACE_UNLIKELY,
- TRACE_BOOT,
+ TRACE_BOOT_CALL,
+ TRACE_BOOT_RET,
TRACE_FN_RET,
__TRACE_LAST_TYPE
@@ -124,9 +125,14 @@ struct trace_mmiotrace_map {
struct mmiotrace_map map;
};
-struct trace_boot {
+struct trace_boot_call {
struct trace_entry ent;
- struct boot_trace initcall;
+ struct boot_trace_call boot_call;
+};
+
+struct trace_boot_ret {
+ struct trace_entry ent;
+ struct boot_trace_ret boot_ret;
};
#define TRACE_FUNC_SIZE 30
@@ -239,7 +245,8 @@ extern void __ftrace_bad_type(void);
TRACE_MMIO_RW); \
IF_ASSIGN(var, ent, struct trace_mmiotrace_map, \
TRACE_MMIO_MAP); \
- IF_ASSIGN(var, ent, struct trace_boot, TRACE_BOOT); \
+ IF_ASSIGN(var, ent, struct trace_boot_call, TRACE_BOOT_CALL);\
+ IF_ASSIGN(var, ent, struct trace_boot_ret, TRACE_BOOT_RET);\
IF_ASSIGN(var, ent, struct trace_unlikely, TRACE_UNLIKELY); \
IF_ASSIGN(var, ent, struct ftrace_ret_entry, TRACE_FN_RET); \
__ftrace_bad_type(); \
diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c
index 8f71915..cb333b7 100644
--- a/kernel/trace/trace_boot.c
+++ b/kernel/trace/trace_boot.c
@@ -58,35 +58,71 @@ static void boot_trace_init(struct trace_array *tr)
tracing_sched_switch_assign_trace(tr);
}
-static enum print_line_t initcall_print_line(struct trace_iterator *iter)
+static enum print_line_t
+initcall_call_print_line(struct trace_iterator *iter)
{
+ struct trace_entry *entry = iter->ent;
+ struct trace_seq *s = &iter->seq;
+ struct trace_boot_call *field;
+ struct boot_trace_call *call;
+ u64 ts;
+ unsigned long nsec_rem;
int ret;
+
+ trace_assign_type(field, entry);
+ call = &field->boot_call;
+ ts = iter->ts;
+ nsec_rem = do_div(ts, 1000000000);
+
+ ret = trace_seq_printf(s, "[%5ld.%09ld] calling %s @ %i\n",
+ (unsigned long)ts, nsec_rem, call->func, call->caller);
+
+ if (!ret)
+ return TRACE_TYPE_PARTIAL_LINE;
+ else
+ return TRACE_TYPE_HANDLED;
+}
+
+static enum print_line_t
+initcall_ret_print_line(struct trace_iterator *iter)
+{
struct trace_entry *entry = iter->ent;
- struct trace_boot *field = (struct trace_boot *)entry;
- struct boot_trace *it = &field->initcall;
struct trace_seq *s = &iter->seq;
- struct timespec calltime = ktime_to_timespec(it->calltime);
- struct timespec rettime = ktime_to_timespec(it->rettime);
-
- if (entry->type == TRACE_BOOT) {
- ret = trace_seq_printf(s, "[%5ld.%09ld] calling %s @ %i\n",
- calltime.tv_sec,
- calltime.tv_nsec,
- it->func, it->caller);
- if (!ret)
- return TRACE_TYPE_PARTIAL_LINE;
-
- ret = trace_seq_printf(s, "[%5ld.%09ld] initcall %s "
- "returned %d after %lld msecs\n",
- rettime.tv_sec,
- rettime.tv_nsec,
- it->func, it->result, it->duration);
-
- if (!ret)
- return TRACE_TYPE_PARTIAL_LINE;
+ struct trace_boot_ret *field;
+ struct boot_trace_ret *init_ret;
+ u64 ts;
+ unsigned long nsec_rem;
+ int ret;
+
+ trace_assign_type(field, entry);
+ init_ret = &field->boot_ret;
+ ts = iter->ts;
+ nsec_rem = do_div(ts, 1000000000);
+
+ ret = trace_seq_printf(s, "[%5ld.%09ld] initcall %s "
+ "returned %d after %llu msecs\n",
+ (unsigned long) ts,
+ nsec_rem,
+ init_ret->func, init_ret->result, init_ret->duration);
+
+ if (!ret)
+ return TRACE_TYPE_PARTIAL_LINE;
+ else
return TRACE_TYPE_HANDLED;
+}
+
+static enum print_line_t initcall_print_line(struct trace_iterator *iter)
+{
+ struct trace_entry *entry = iter->ent;
+
+ switch (entry->type) {
+ case TRACE_BOOT_CALL:
+ return initcall_call_print_line(iter);
+ case TRACE_BOOT_RET:
+ return initcall_ret_print_line(iter);
+ default:
+ return TRACE_TYPE_UNHANDLED;
}
- return TRACE_TYPE_UNHANDLED;
}
struct tracer boot_tracer __read_mostly =
@@ -97,11 +133,10 @@ struct tracer boot_tracer __read_mostly =
.print_line = initcall_print_line,
};
-void trace_boot(struct boot_trace *it, initcall_t fn)
+void trace_boot_call(struct boot_trace_call *bt, initcall_t fn)
{
struct ring_buffer_event *event;
- struct trace_boot *entry;
- struct trace_array_cpu *data;
+ struct trace_boot_call *entry;
unsigned long irq_flags;
struct trace_array *tr = boot_trace;
@@ -111,9 +146,37 @@ void trace_boot(struct boot_trace *it, initcall_t fn)
/* Get its name now since this function could
* disappear because it is in the .init section.
*/
- sprint_symbol(it->func, (unsigned long)fn);
+ sprint_symbol(bt->func, (unsigned long)fn);
+ preempt_disable();
+
+ event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry),
+ &irq_flags);
+ if (!event)
+ goto out;
+ entry = ring_buffer_event_data(event);
+ tracing_generic_entry_update(&entry->ent, 0, 0);
+ entry->ent.type = TRACE_BOOT_CALL;
+ entry->boot_call = *bt;
+ ring_buffer_unlock_commit(tr->buffer, event, irq_flags);
+
+ trace_wake_up();
+
+ out:
+ preempt_enable();
+}
+
+void trace_boot_ret(struct boot_trace_ret *bt, initcall_t fn)
+{
+ struct ring_buffer_event *event;
+ struct trace_boot_ret *entry;
+ unsigned long irq_flags;
+ struct trace_array *tr = boot_trace;
+
+ if (!pre_initcalls_finished)
+ return;
+
+ sprint_symbol(bt->func, (unsigned long)fn);
preempt_disable();
- data = tr->data[smp_processor_id()];
event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry),
&irq_flags);
@@ -121,8 +184,8 @@ void trace_boot(struct boot_trace *it, initcall_t fn)
goto out;
entry = ring_buffer_event_data(event);
tracing_generic_entry_update(&entry->ent, 0, 0);
- entry->ent.type = TRACE_BOOT;
- entry->initcall = *it;
+ entry->ent.type = TRACE_BOOT_RET;
+ entry->boot_ret = *bt;
ring_buffer_unlock_commit(tr->buffer, event, irq_flags);
trace_wake_up();
--
1.5.6.5
--
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
2008-11-12 5:54 ` [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries Steven Rostedt
@ 2008-11-12 6:00 ` Andrew Morton
2008-11-12 8:45 ` Frédéric Weisbecker
0 siblings, 1 reply; 13+ messages in thread
From: Andrew Morton @ 2008-11-12 6:00 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel, Ingo Molnar, Frederic Weisbecker, Steven Rostedt
On Wed, 12 Nov 2008 00:54:56 -0500 Steven Rostedt <rostedt@goodmis.org> wrote:
> - unsigned long long duration; /* usecs */
> + unsigned long long duration;
my hard-won comment got fragged.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 0/2] boot tracer updates
2008-11-12 5:54 [PATCH 0/2] boot tracer updates Steven Rostedt
2008-11-12 5:54 ` [PATCH 1/2] tracing/fastboot: Move boot tracer structs and funcs into their own header Steven Rostedt
2008-11-12 5:54 ` [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries Steven Rostedt
@ 2008-11-12 8:40 ` Frédéric Weisbecker
2 siblings, 0 replies; 13+ messages in thread
From: Frédéric Weisbecker @ 2008-11-12 8:40 UTC (permalink / raw)
To: Steven Rostedt; +Cc: linux-kernel, Ingo Molnar, Andrew Morton
2008/11/12 Steven Rostedt <rostedt@goodmis.org>:
>
> Ingo,
>
> The following patches are in:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
>
> branch: tip/devel
>
>
> Frederic Weisbecker (2):
> tracing/fastboot: Move boot tracer structs and funcs into their own header.
> tracing/fastboot: Use the ring-buffer timestamp for initcall entries
>
> ----
> include/linux/ftrace.h | 41 ---------------
> include/trace/boot.h | 56 ++++++++++++++++++++
> init/main.c | 33 +++++++------
> kernel/trace/trace.h | 16 ++++--
> kernel/trace/trace_boot.c | 123 ++++++++++++++++++++++++++++++++++-----------
> 5 files changed, 179 insertions(+), 90 deletions(-)
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
Hi Steven,
I didn't know that your tree was the new first repository for tracing.
Should I now send you all my tracing related
patches (including function return tracing?).
Thanks.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
2008-11-12 6:00 ` Andrew Morton
@ 2008-11-12 8:45 ` Frédéric Weisbecker
2008-11-12 10:21 ` Ingo Molnar
0 siblings, 1 reply; 13+ messages in thread
From: Frédéric Weisbecker @ 2008-11-12 8:45 UTC (permalink / raw)
To: Andrew Morton; +Cc: Steven Rostedt, linux-kernel, Ingo Molnar, Steven Rostedt
2008/11/12 Andrew Morton <akpm@linux-foundation.org>:
> On Wed, 12 Nov 2008 00:54:56 -0500 Steven Rostedt <rostedt@goodmis.org> wrote:
>
>> - unsigned long long duration; /* usecs */
>> + unsigned long long duration;
>
> my hard-won comment got fragged.
Oops. I forgot it.
Perhaps I should resend a patch that reset this comment?
BTW it is nsecs actually.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
2008-11-12 8:45 ` Frédéric Weisbecker
@ 2008-11-12 10:21 ` Ingo Molnar
2008-11-12 10:33 ` Frédéric Weisbecker
0 siblings, 1 reply; 13+ messages in thread
From: Ingo Molnar @ 2008-11-12 10:21 UTC (permalink / raw)
To: Frédéric Weisbecker
Cc: Andrew Morton, Steven Rostedt, linux-kernel, Steven Rostedt
* Frédéric Weisbecker <fweisbec@gmail.com> wrote:
> 2008/11/12 Andrew Morton <akpm@linux-foundation.org>:
> > On Wed, 12 Nov 2008 00:54:56 -0500 Steven Rostedt <rostedt@goodmis.org> wrote:
> >
> >> - unsigned long long duration; /* usecs */
> >> + unsigned long long duration;
> >
> > my hard-won comment got fragged.
>
>
> Oops. I forgot it.
> Perhaps I should resend a patch that reset this comment?
> BTW it is nsecs actually.
no need, i fixed it up when applying your patch to tracing/fastboot,
and also changed it to nsecs.
Ingo
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
2008-11-12 10:21 ` Ingo Molnar
@ 2008-11-12 10:33 ` Frédéric Weisbecker
0 siblings, 0 replies; 13+ messages in thread
From: Frédéric Weisbecker @ 2008-11-12 10:33 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Andrew Morton, Steven Rostedt, linux-kernel, Steven Rostedt
2008/11/12 Ingo Molnar <mingo@elte.hu>:
>
> * Frédéric Weisbecker <fweisbec@gmail.com> wrote:
>
>> 2008/11/12 Andrew Morton <akpm@linux-foundation.org>:
>> > On Wed, 12 Nov 2008 00:54:56 -0500 Steven Rostedt <rostedt@goodmis.org> wrote:
>> >
>> >> - unsigned long long duration; /* usecs */
>> >> + unsigned long long duration;
>> >
>> > my hard-won comment got fragged.
>>
>>
>> Oops. I forgot it.
>> Perhaps I should resend a patch that reset this comment?
>> BTW it is nsecs actually.
>
> no need, i fixed it up when applying your patch to tracing/fastboot,
> and also changed it to nsecs.
>
> Ingo
>
Thanks Ingo.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
2008-11-12 12:59 ` Steven Rostedt
@ 2008-11-12 13:01 ` Ingo Molnar
0 siblings, 0 replies; 13+ messages in thread
From: Ingo Molnar @ 2008-11-12 13:01 UTC (permalink / raw)
To: Steven Rostedt; +Cc: Frederic Weisbecker, Linux Kernel
* Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Wed, 12 Nov 2008, Ingo Molnar wrote:
>
> >
> > * Frederic Weisbecker <fweisbec@gmail.com> wrote:
> >
> > > Impact: Split the boot tracer entries in two parts: call and return
> > >
> > > Now that we are using the sched tracer from the boot tracer, we want
> > > to use the same timestamp than the ring-buffer to have consistent
> > > time captures between sched events and initcall events. So we get
> > > rid of the old time capture by the boot tracer and split the
> > > initcall events in two parts: call and return. This way we have the
> > > ring buffer timestamp of both.
> > >
> > > There is an example of a trace in attachment.
> > >
> > > Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
> > > ---
> > > include/trace/boot.h | 31 ++++++++---
> > > init/main.c | 32 ++++++------
> > > kernel/trace/trace.h | 17 ++++--
> > > kernel/trace/trace_boot.c | 123 ++++++++++++++++++++++++++++++++++-----------
> > > 4 files changed, 144 insertions(+), 59 deletions(-)
> >
> > applied to tip/tracing/fastboot, thanks Frederic!
> >
> > one small detail, do we need these messages in the boot tracer:
> >
> > ##### CPU 1 buffer started ####
> >
> > they are helpful for latency traces but might be confusing for boot
> > traces. (they lose their attraction after having seen a dozen of them)
>
> Yeah, I was thinking of putting in a iter_ctrl to disable them. But
> then, should they be on or off by default?
>
> The pro for having them off by default, they are not as distracting.
>
> The con for having them off by default, they lose their meaning, and
> developers get confused when they see CPU 1 starting after 100
> prints of CPU0, when they both should have started.
i think they are useful to be included for most of the tracers, except
the boot tracer (which starts/stop with high frequency). So i'd
suggest to keep the default, but also to expose it in an iter_ctl plus
dynamically turn it off for the boot tracer.
Ingo
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
2008-11-12 9:25 ` Ingo Molnar
2008-11-12 10:58 ` Frédéric Weisbecker
@ 2008-11-12 12:59 ` Steven Rostedt
2008-11-12 13:01 ` Ingo Molnar
1 sibling, 1 reply; 13+ messages in thread
From: Steven Rostedt @ 2008-11-12 12:59 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Frederic Weisbecker, Linux Kernel
On Wed, 12 Nov 2008, Ingo Molnar wrote:
>
> * Frederic Weisbecker <fweisbec@gmail.com> wrote:
>
> > Impact: Split the boot tracer entries in two parts: call and return
> >
> > Now that we are using the sched tracer from the boot tracer, we want
> > to use the same timestamp than the ring-buffer to have consistent
> > time captures between sched events and initcall events. So we get
> > rid of the old time capture by the boot tracer and split the
> > initcall events in two parts: call and return. This way we have the
> > ring buffer timestamp of both.
> >
> > There is an example of a trace in attachment.
> >
> > Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
> > ---
> > include/trace/boot.h | 31 ++++++++---
> > init/main.c | 32 ++++++------
> > kernel/trace/trace.h | 17 ++++--
> > kernel/trace/trace_boot.c | 123 ++++++++++++++++++++++++++++++++++-----------
> > 4 files changed, 144 insertions(+), 59 deletions(-)
>
> applied to tip/tracing/fastboot, thanks Frederic!
>
> one small detail, do we need these messages in the boot tracer:
>
> ##### CPU 1 buffer started ####
>
> they are helpful for latency traces but might be confusing for boot
> traces. (they lose their attraction after having seen a dozen of them)
Yeah, I was thinking of putting in a iter_ctrl to disable them. But then,
should they be on or off by default?
The pro for having them off by default, they are not as distracting.
The con for having them off by default, they lose their meaning, and
developers get confused when they see CPU 1 starting after 100 prints of
CPU0, when they both should have started.
-- Steve
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
2008-11-12 9:25 ` Ingo Molnar
@ 2008-11-12 10:58 ` Frédéric Weisbecker
2008-11-12 12:59 ` Steven Rostedt
1 sibling, 0 replies; 13+ messages in thread
From: Frédéric Weisbecker @ 2008-11-12 10:58 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Steven Rostedt, Linux Kernel, Arjan van de Ven
2008/11/12 Ingo Molnar <mingo@elte.hu>:
>
> * Frederic Weisbecker <fweisbec@gmail.com> wrote:
>
>> Impact: Split the boot tracer entries in two parts: call and return
>>
>> Now that we are using the sched tracer from the boot tracer, we want
>> to use the same timestamp than the ring-buffer to have consistent
>> time captures between sched events and initcall events. So we get
>> rid of the old time capture by the boot tracer and split the
>> initcall events in two parts: call and return. This way we have the
>> ring buffer timestamp of both.
>>
>> There is an example of a trace in attachment.
>>
>> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
>> ---
>> include/trace/boot.h | 31 ++++++++---
>> init/main.c | 32 ++++++------
>> kernel/trace/trace.h | 17 ++++--
>> kernel/trace/trace_boot.c | 123 ++++++++++++++++++++++++++++++++++-----------
>> 4 files changed, 144 insertions(+), 59 deletions(-)
>
> applied to tip/tracing/fastboot, thanks Frederic!
>
> one small detail, do we need these messages in the boot tracer:
>
> ##### CPU 1 buffer started ####
>
> they are helpful for latency traces but might be confusing for boot
> traces. (they lose their attraction after having seen a dozen of them)
>
> Ingo
>
Yes. I'm using the default formatting output in trace.c so perhaps
there is some iter flag I should dynamically remove
from the boot tracer to avoid that or perhaps I may format a custom
output for sched entries for the boot tracer.
I will see that....
By the way Arjan, does the actual state of the boot tracer match your needs?
You can find an example of its trace here:
http://git.kernel.org/?p=linux/kernel/git/x86/linux-2.6-tip.git;a=commit;h=74239072830ef3f1398edeb1bc1076fc330fd4a2
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
2008-11-11 22:24 [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries Frederic Weisbecker
@ 2008-11-12 9:25 ` Ingo Molnar
2008-11-12 10:58 ` Frédéric Weisbecker
2008-11-12 12:59 ` Steven Rostedt
0 siblings, 2 replies; 13+ messages in thread
From: Ingo Molnar @ 2008-11-12 9:25 UTC (permalink / raw)
To: Frederic Weisbecker; +Cc: Steven Rostedt, Linux Kernel
* Frederic Weisbecker <fweisbec@gmail.com> wrote:
> Impact: Split the boot tracer entries in two parts: call and return
>
> Now that we are using the sched tracer from the boot tracer, we want
> to use the same timestamp than the ring-buffer to have consistent
> time captures between sched events and initcall events. So we get
> rid of the old time capture by the boot tracer and split the
> initcall events in two parts: call and return. This way we have the
> ring buffer timestamp of both.
>
> There is an example of a trace in attachment.
>
> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
> ---
> include/trace/boot.h | 31 ++++++++---
> init/main.c | 32 ++++++------
> kernel/trace/trace.h | 17 ++++--
> kernel/trace/trace_boot.c | 123 ++++++++++++++++++++++++++++++++++-----------
> 4 files changed, 144 insertions(+), 59 deletions(-)
applied to tip/tracing/fastboot, thanks Frederic!
one small detail, do we need these messages in the boot tracer:
##### CPU 1 buffer started ####
they are helpful for latency traces but might be confusing for boot
traces. (they lose their attraction after having seen a dozen of them)
Ingo
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries
@ 2008-11-11 22:24 Frederic Weisbecker
2008-11-12 9:25 ` Ingo Molnar
0 siblings, 1 reply; 13+ messages in thread
From: Frederic Weisbecker @ 2008-11-11 22:24 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Steven Rostedt, Linux Kernel
[-- Attachment #1: Type: text/plain, Size: 10190 bytes --]
Impact: Split the boot tracer entries in two parts: call and return
Now that we are using the sched tracer from the boot tracer, we want to use the
same timestamp than the ring-buffer to have consistent time captures between sched
events and initcall events.
So we get rid of the old time capture by the boot tracer and split the initcall events
in two parts: call and return. This way we have the ring buffer timestamp of both.
There is an example of a trace in attachment.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
include/trace/boot.h | 31 ++++++++---
init/main.c | 32 ++++++------
kernel/trace/trace.h | 17 ++++--
kernel/trace/trace_boot.c | 123 ++++++++++++++++++++++++++++++++++-----------
4 files changed, 144 insertions(+), 59 deletions(-)
diff --git a/include/trace/boot.h b/include/trace/boot.h
index 4cbe64e..9eac38b 100644
--- a/include/trace/boot.h
+++ b/include/trace/boot.h
@@ -2,22 +2,30 @@
#define _LINUX_TRACE_BOOT_H
/*
- * Structure which defines the trace of an initcall.
+ * Structure which defines the trace of an initcall
+ * while it is called.
* You don't have to fill the func field since it is
* only used internally by the tracer.
*/
-struct boot_trace {
+struct boot_trace_call {
pid_t caller;
char func[KSYM_NAME_LEN];
- int result;
- unsigned long long duration; /* usecs */
- ktime_t calltime;
- ktime_t rettime;
+};
+
+/*
+ * Structure which defines the trace of an initcall
+ * while it returns.
+ */
+struct boot_trace_ret {
+ char func[KSYM_NAME_LEN];
+ int result;
+ unsigned long long duration;
};
#ifdef CONFIG_BOOT_TRACER
-/* Append the trace on the ring-buffer */
-extern void trace_boot(struct boot_trace *it, initcall_t fn);
+/* Append the traces on the ring-buffer */
+extern void trace_boot_call(struct boot_trace_call *bt, initcall_t fn);
+extern void trace_boot_ret(struct boot_trace_ret *bt, initcall_t fn);
/* Tells the tracer that smp_pre_initcall is finished.
* So we can start the tracing
@@ -34,7 +42,12 @@ extern void enable_boot_trace(void);
*/
extern void disable_boot_trace(void);
#else
-static inline void trace_boot(struct boot_trace *it, initcall_t fn) { }
+static inline
+void trace_boot_call(struct boot_trace_call *bt, initcall_t fn) { }
+
+static inline
+void trace_boot_ret(struct boot_trace_ret *bt, initcall_t fn) { }
+
static inline void start_boot_trace(void) { }
static inline void enable_boot_trace(void) { }
static inline void disable_boot_trace(void) { }
diff --git a/init/main.c b/init/main.c
index 2a04290..fc7c379 100644
--- a/init/main.c
+++ b/init/main.c
@@ -712,33 +712,35 @@ core_param(initcall_debug, initcall_debug, bool, 0644);
int do_one_initcall(initcall_t fn)
{
int count = preempt_count();
- ktime_t delta;
+ ktime_t calltime, delta, rettime;
char msgbuf[64];
- struct boot_trace it;
+ struct boot_trace_call call;
+ struct boot_trace_ret ret;
if (initcall_debug) {
- it.caller = task_pid_nr(current);
- printk("calling %pF @ %i\n", fn, it.caller);
- it.calltime = ktime_get();
+ call.caller = task_pid_nr(current);
+ printk("calling %pF @ %i\n", fn, call.caller);
+ calltime = ktime_get();
+ trace_boot_call(&call, fn);
enable_boot_trace();
}
- it.result = fn();
+ ret.result = fn();
if (initcall_debug) {
- it.rettime = ktime_get();
- delta = ktime_sub(it.rettime, it.calltime);
- it.duration = (unsigned long long) delta.tv64 >> 10;
- printk("initcall %pF returned %d after %Ld usecs\n", fn,
- it.result, it.duration);
- trace_boot(&it, fn);
disable_boot_trace();
+ rettime = ktime_get();
+ delta = ktime_sub(rettime, calltime);
+ ret.duration = (unsigned long long) delta.tv64 >> 10;
+ trace_boot_ret(&ret, fn);
+ printk("initcall %pF returned %d after %Ld usecs\n", fn,
+ ret.result, ret.duration);
}
msgbuf[0] = 0;
- if (it.result && it.result != -ENODEV && initcall_debug)
- sprintf(msgbuf, "error code %d ", it.result);
+ if (ret.result && ret.result != -ENODEV && initcall_debug)
+ sprintf(msgbuf, "error code %d ", ret.result);
if (preempt_count() != count) {
strlcat(msgbuf, "preemption imbalance ", sizeof(msgbuf));
@@ -752,7 +754,7 @@ int do_one_initcall(initcall_t fn)
printk("initcall %pF returned with %s\n", fn, msgbuf);
}
- return it.result;
+ return ret.result;
}
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index f69a519..b5f91f1 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -22,7 +22,8 @@ enum trace_type {
TRACE_SPECIAL,
TRACE_MMIO_RW,
TRACE_MMIO_MAP,
- TRACE_BOOT,
+ TRACE_BOOT_CALL,
+ TRACE_BOOT_RET,
TRACE_FN_RET,
__TRACE_LAST_TYPE
@@ -123,9 +124,14 @@ struct trace_mmiotrace_map {
struct mmiotrace_map map;
};
-struct trace_boot {
+struct trace_boot_call {
struct trace_entry ent;
- struct boot_trace initcall;
+ struct boot_trace_call boot_call;
+};
+
+struct trace_boot_ret {
+ struct trace_entry ent;
+ struct boot_trace_ret boot_ret;
};
/*
@@ -228,8 +234,9 @@ extern void __ftrace_bad_type(void);
TRACE_MMIO_RW); \
IF_ASSIGN(var, ent, struct trace_mmiotrace_map, \
TRACE_MMIO_MAP); \
- IF_ASSIGN(var, ent, struct trace_boot, TRACE_BOOT); \
- IF_ASSIGN(var, ent, struct ftrace_ret_entry, TRACE_FN_RET); \
+ IF_ASSIGN(var, ent, struct trace_boot_call, TRACE_BOOT_CALL);\
+ IF_ASSIGN(var, ent, struct trace_boot_ret, TRACE_BOOT_RET);\
+ IF_ASSIGN(var, ent, struct ftrace_ret_entry, TRACE_FN_RET);\
__ftrace_bad_type(); \
} while (0)
diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c
index 8f71915..cb333b7 100644
--- a/kernel/trace/trace_boot.c
+++ b/kernel/trace/trace_boot.c
@@ -58,35 +58,71 @@ static void boot_trace_init(struct trace_array *tr)
tracing_sched_switch_assign_trace(tr);
}
-static enum print_line_t initcall_print_line(struct trace_iterator *iter)
+static enum print_line_t
+initcall_call_print_line(struct trace_iterator *iter)
{
+ struct trace_entry *entry = iter->ent;
+ struct trace_seq *s = &iter->seq;
+ struct trace_boot_call *field;
+ struct boot_trace_call *call;
+ u64 ts;
+ unsigned long nsec_rem;
int ret;
+
+ trace_assign_type(field, entry);
+ call = &field->boot_call;
+ ts = iter->ts;
+ nsec_rem = do_div(ts, 1000000000);
+
+ ret = trace_seq_printf(s, "[%5ld.%09ld] calling %s @ %i\n",
+ (unsigned long)ts, nsec_rem, call->func, call->caller);
+
+ if (!ret)
+ return TRACE_TYPE_PARTIAL_LINE;
+ else
+ return TRACE_TYPE_HANDLED;
+}
+
+static enum print_line_t
+initcall_ret_print_line(struct trace_iterator *iter)
+{
struct trace_entry *entry = iter->ent;
- struct trace_boot *field = (struct trace_boot *)entry;
- struct boot_trace *it = &field->initcall;
struct trace_seq *s = &iter->seq;
- struct timespec calltime = ktime_to_timespec(it->calltime);
- struct timespec rettime = ktime_to_timespec(it->rettime);
-
- if (entry->type == TRACE_BOOT) {
- ret = trace_seq_printf(s, "[%5ld.%09ld] calling %s @ %i\n",
- calltime.tv_sec,
- calltime.tv_nsec,
- it->func, it->caller);
- if (!ret)
- return TRACE_TYPE_PARTIAL_LINE;
-
- ret = trace_seq_printf(s, "[%5ld.%09ld] initcall %s "
- "returned %d after %lld msecs\n",
- rettime.tv_sec,
- rettime.tv_nsec,
- it->func, it->result, it->duration);
-
- if (!ret)
- return TRACE_TYPE_PARTIAL_LINE;
+ struct trace_boot_ret *field;
+ struct boot_trace_ret *init_ret;
+ u64 ts;
+ unsigned long nsec_rem;
+ int ret;
+
+ trace_assign_type(field, entry);
+ init_ret = &field->boot_ret;
+ ts = iter->ts;
+ nsec_rem = do_div(ts, 1000000000);
+
+ ret = trace_seq_printf(s, "[%5ld.%09ld] initcall %s "
+ "returned %d after %llu msecs\n",
+ (unsigned long) ts,
+ nsec_rem,
+ init_ret->func, init_ret->result, init_ret->duration);
+
+ if (!ret)
+ return TRACE_TYPE_PARTIAL_LINE;
+ else
return TRACE_TYPE_HANDLED;
+}
+
+static enum print_line_t initcall_print_line(struct trace_iterator *iter)
+{
+ struct trace_entry *entry = iter->ent;
+
+ switch (entry->type) {
+ case TRACE_BOOT_CALL:
+ return initcall_call_print_line(iter);
+ case TRACE_BOOT_RET:
+ return initcall_ret_print_line(iter);
+ default:
+ return TRACE_TYPE_UNHANDLED;
}
- return TRACE_TYPE_UNHANDLED;
}
struct tracer boot_tracer __read_mostly =
@@ -97,11 +133,10 @@ struct tracer boot_tracer __read_mostly =
.print_line = initcall_print_line,
};
-void trace_boot(struct boot_trace *it, initcall_t fn)
+void trace_boot_call(struct boot_trace_call *bt, initcall_t fn)
{
struct ring_buffer_event *event;
- struct trace_boot *entry;
- struct trace_array_cpu *data;
+ struct trace_boot_call *entry;
unsigned long irq_flags;
struct trace_array *tr = boot_trace;
@@ -111,9 +146,37 @@ void trace_boot(struct boot_trace *it, initcall_t fn)
/* Get its name now since this function could
* disappear because it is in the .init section.
*/
- sprint_symbol(it->func, (unsigned long)fn);
+ sprint_symbol(bt->func, (unsigned long)fn);
+ preempt_disable();
+
+ event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry),
+ &irq_flags);
+ if (!event)
+ goto out;
+ entry = ring_buffer_event_data(event);
+ tracing_generic_entry_update(&entry->ent, 0, 0);
+ entry->ent.type = TRACE_BOOT_CALL;
+ entry->boot_call = *bt;
+ ring_buffer_unlock_commit(tr->buffer, event, irq_flags);
+
+ trace_wake_up();
+
+ out:
+ preempt_enable();
+}
+
+void trace_boot_ret(struct boot_trace_ret *bt, initcall_t fn)
+{
+ struct ring_buffer_event *event;
+ struct trace_boot_ret *entry;
+ unsigned long irq_flags;
+ struct trace_array *tr = boot_trace;
+
+ if (!pre_initcalls_finished)
+ return;
+
+ sprint_symbol(bt->func, (unsigned long)fn);
preempt_disable();
- data = tr->data[smp_processor_id()];
event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry),
&irq_flags);
@@ -121,8 +184,8 @@ void trace_boot(struct boot_trace *it, initcall_t fn)
goto out;
entry = ring_buffer_event_data(event);
tracing_generic_entry_update(&entry->ent, 0, 0);
- entry->ent.type = TRACE_BOOT;
- entry->initcall = *it;
+ entry->ent.type = TRACE_BOOT_RET;
+ entry->boot_ret = *bt;
ring_buffer_unlock_commit(tr->buffer, event, irq_flags);
trace_wake_up();
--
1.5.2.5
[-- Attachment #2: trace.gz --]
[-- Type: application/x-gzip, Size: 137617 bytes --]
^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2008-11-12 13:01 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-11-12 5:54 [PATCH 0/2] boot tracer updates Steven Rostedt
2008-11-12 5:54 ` [PATCH 1/2] tracing/fastboot: Move boot tracer structs and funcs into their own header Steven Rostedt
2008-11-12 5:54 ` [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries Steven Rostedt
2008-11-12 6:00 ` Andrew Morton
2008-11-12 8:45 ` Frédéric Weisbecker
2008-11-12 10:21 ` Ingo Molnar
2008-11-12 10:33 ` Frédéric Weisbecker
2008-11-12 8:40 ` [PATCH 0/2] boot tracer updates Frédéric Weisbecker
-- strict thread matches above, loose matches on Subject: below --
2008-11-11 22:24 [PATCH 2/2] tracing/fastboot: Use the ring-buffer timestamp for initcall entries Frederic Weisbecker
2008-11-12 9:25 ` Ingo Molnar
2008-11-12 10:58 ` Frédéric Weisbecker
2008-11-12 12:59 ` Steven Rostedt
2008-11-12 13:01 ` Ingo Molnar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).