lkml.org 
[lkml]   [2008]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH 1/6] Tracing/fastboot: Enable boot tracing only during initcalls

* Frédéric Weisbecker <fweisbec@gmail.com> wrote:

> 2008/10/10 Ingo Molnar <mingo@elte.hu>:
> >
> > * Frederic Weisbecker <fweisbec@gmail.com> wrote:
> >
> >> We used to disable the initcall tracing at a specified time (IE: end
> >> of builtin initcalls). But we don\'t need it anymore. It will be
> >> stopped when initcalls are finished. However we want two things:
> >>
> >> _Start this tracing only after pre-smp initcalls are finished. _Since
> >> we are planning to trace sched_switches at the same time, we want to
> >> enable them only during the initcall execution. For this purpose, this
> >> patch introduce two functions to enable/disable the sched_switch
> >> tracing during boot.
> >>
> >> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
> >
> > applied to tip/tracing/fastboot, thanks Frederic!
> >
> > Ingo
> >
>
> Oops, sorry Ingo there are some backslashes that taint this patch.
> I will resend a V2....

dont worry, i fixed them already when i applied your patch (and that's
all in latest tip/master).

See the commit below - i sanitize most commit entries to make subject
lines more consistent (note the capitalization difference between your
submission and the end result), to improve paragraphing and general
structure.

Ingo

----------->
From d1b6be5c1bb11dfd23b000a9342b9f8c3750e143 Mon Sep 17 00:00:00 2001
From: Frederic Weisbecker <fweisbec@gmail.com>
Date: Fri, 10 Oct 2008 12:36:15 +0200
Subject: [PATCH] tracing/fastboot: enable boot tracing only during initcalls
We used to disable the initcall tracing at a specified time
(IE: end of builtin initcalls). But we don't need it anymore.
It will be stopped when initcalls are finished.

However we want two things:

_Start this tracing only after pre-smp initcalls are finished.

_Since we are planning to trace sched_switches at the same time, we want
to enable them only during the initcall execution.

For this purpose, this patch introduces two functions to enable/disable
the sched_switch tracing during boot.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
include/linux/ftrace.h | 24 ++++++++++++++++++++++--
init/main.c | 4 +++-
kernel/trace/trace_boot.c | 28 ++++++++++++++++------------
3 files changed, 41 insertions(+), 15 deletions(-)
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index a3d4615..bc9a75a 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -213,6 +213,11 @@ ftrace_init_module(unsigned long *start, unsigned long *end) { }
#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];
@@ -223,13 +228,28 @@ struct boot_trace {
};

#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);
-extern void stop_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 stop_boot_trace(void) { }
+static inline void enable_boot_trace(void) { }
+static inline void disable_boot_trace(void) { }
#endif


diff --git a/init/main.c b/init/main.c
index 8d58855..df48ed1 100644
--- a/init/main.c
+++ b/init/main.c
@@ -714,6 +714,7 @@ int do_one_initcall(initcall_t fn)
it.caller = task_pid_nr(current);
printk("calling %pF @ %i\n", fn, it.caller);
it.calltime = ktime_get();
+ enable_boot_trace();
}

it.result = fn();
@@ -725,6 +726,7 @@ int do_one_initcall(initcall_t fn)
printk("initcall %pF returned %d after %Ld usecs\n", fn,
it.result, it.duration);
trace_boot(&it, fn);
+ disable_boot_trace();
}

msgbuf[0] = 0;
@@ -957,7 +959,7 @@ static int __init kernel_init(void * unused)
* we're essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
*/
- stop_boot_trace();
+
init_post();
return 0;
}
diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c
index d0a5e50..52c3743 100644
--- a/kernel/trace/trace_boot.c
+++ b/kernel/trace/trace_boot.c
@@ -13,23 +13,29 @@
#include "trace.h"

static struct trace_array *boot_trace;
-static int trace_boot_enabled;
+static bool pre_initcalls_finished;

-
-/* Should be started after do_pre_smp_initcalls() in init/main.c */
+/* Tells the boot tracer that the pre_smp_initcalls are finished.
+ * So we are ready .
+ * It doesn\'t enable sched events tracing however.
+ * You have to call enable_boot_trace to do so.
+ */
void start_boot_trace(void)
{
- trace_boot_enabled = 1;
+ pre_initcalls_finished = true;
+}
+
+void enable_boot_trace(void)
+{
}

-void stop_boot_trace(void)
+void disable_boot_trace(void)
{
- trace_boot_enabled = 0;
}

void reset_boot_trace(struct trace_array *tr)
{
- stop_boot_trace();
+ disable_boot_trace();
}

static void boot_trace_init(struct trace_array *tr)
@@ -37,8 +43,6 @@ static void boot_trace_init(struct trace_array *tr)
int cpu;
boot_trace = tr;

- trace_boot_enabled = 0;
-
for_each_cpu_mask(cpu, cpu_possible_map)
tracing_reset(tr, cpu);
}
@@ -46,9 +50,9 @@ static void boot_trace_init(struct trace_array *tr)
static void boot_trace_ctrl_update(struct trace_array *tr)
{
if (tr->ctrl)
- start_boot_trace();
+ enable_boot_trace();
else
- stop_boot_trace();
+ disable_boot_trace();
}

static enum print_line_t initcall_print_line(struct trace_iterator *iter)
@@ -99,7 +103,7 @@ void trace_boot(struct boot_trace *it, initcall_t fn)
unsigned long irq_flags;
struct trace_array *tr = boot_trace;

- if (!trace_boot_enabled)
+ if (!pre_initcalls_finished)
return;

/* Get its name now since this function could
--
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/
\
 
 \ /
  Last update: 2008-10-10 13:07    [from the cache]
©2003-2014 Jasper Spaans. Advertise on this site