2009-10-12 07:46:34

by Stefan Assmann

[permalink] [raw]
Subject: [PATCH] ftrace: add kernel command line graph function filtering

>From 894e934e782ddaa33eb6d156d8326cdf479b5f62 Mon Sep 17 00:00:00 2001
From: Stefan Assmann <[email protected]>
Date: Mon, 12 Oct 2009 09:11:47 +0200
Subject: [PATCH] ftrace: add kernel command line graph function filtering

Add a command line parameter to allow limiting the function graphs that
are traced on boot up, when ftrace=function_graph is specified.

This patch adds the following command line option:
ftrace_graph_filter=function-list

Where function-list is a comma separated list of functions to filter.

Signed-off-by: Stefan Assmann <[email protected]>
---
Documentation/kernel-parameters.txt | 9 ++++++++-
kernel/trace/ftrace.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 1 deletions(-)

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 9107b38..144eb83 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -771,7 +771,14 @@ and is between 256 and 4096 characters. It is defined in the file
tracer at boot up. function-list is a comma separated
list of functions. This list can be changed at run
time by the set_ftrace_filter file in the debugfs
- tracing directory.
+ tracing directory.
+
+ ftrace_graph_filter=[function-list]
+ [FTRACE] Limit the functions traced by the function
+ graph tracer at boot up. function-list is a comma
+ separated list of functions. This list can be changed
+ at run time by the set_graph_function file in the
+ debugfs tracing directory.

ftrace_notrace=[function-list]
[FTRACE] Do not trace the functions specified in
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 3724756..a5cae5c 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -78,6 +78,10 @@ ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub;
ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub;
ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub;

+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+static int ftrace_set_func(unsigned long *array, int *idx, char *buffer);
+#endif
+
static void ftrace_list_func(unsigned long ip, unsigned long parent_ip)
{
struct ftrace_ops *op = ftrace_list;
@@ -2302,6 +2306,7 @@ void ftrace_set_notrace(unsigned char *buf, int len, int reset)
#define FTRACE_FILTER_SIZE COMMAND_LINE_SIZE
static char ftrace_notrace_buf[FTRACE_FILTER_SIZE] __initdata;
static char ftrace_filter_buf[FTRACE_FILTER_SIZE] __initdata;
+static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata;

static int __init set_ftrace_notrace(char *str)
{
@@ -2317,6 +2322,31 @@ static int __init set_ftrace_filter(char *str)
}
__setup("ftrace_filter=", set_ftrace_filter);

+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+static int __init set_graph_function(char *str)
+{
+ strncpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE);
+ return 1;
+}
+__setup("ftrace_graph_filter=", set_graph_function);
+
+static void __init set_ftrace_early_graph(char *buf)
+{
+ int ret;
+ char *func;
+
+ while (buf) {
+ func = strsep(&buf, ",");
+ /* we allow only one expression at a time */
+ ret = ftrace_set_func(ftrace_graph_funcs, &ftrace_graph_count,
+ func);
+ if (ret)
+ printk(KERN_DEBUG "ftrace: function %s not "
+ "traceable\n", func);
+ }
+}
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
+
static void __init set_ftrace_early_filter(char *buf, int enable)
{
char *func;
@@ -2333,6 +2363,10 @@ static void __init set_ftrace_early_filters(void)
set_ftrace_early_filter(ftrace_filter_buf, 1);
if (ftrace_notrace_buf[0])
set_ftrace_early_filter(ftrace_notrace_buf, 0);
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+ if (ftrace_graph_buf[0])
+ set_ftrace_early_graph(ftrace_graph_buf);
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
}

static int
--
1.6.2.5


2009-10-12 09:10:14

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH] ftrace: add kernel command line graph function filtering

2009/10/12 Stefan Assmann <[email protected]>:
> From 894e934e782ddaa33eb6d156d8326cdf479b5f62 Mon Sep 17 00:00:00 2001
> From: Stefan Assmann <[email protected]>
> Date: Mon, 12 Oct 2009 09:11:47 +0200
> Subject: [PATCH] ftrace: add kernel command line graph function filtering
>
> Add a command line parameter to allow limiting the function graphs that
> are traced on boot up, when ftrace=function_graph is specified.
>
> This patch adds the following command line option:
> ftrace_graph_filter=function-list


If we use this parameter, we undoubtedly want to launch the function
graph tracer.
I'd then suggest to arm ftrace=function_graph automatically if we have
ftrace_graph_filter
set.


>
> Where function-list is a comma separated list of functions to filter.
>
> Signed-off-by: Stefan Assmann <[email protected]>
> ---
> ?Documentation/kernel-parameters.txt | ? ?9 ++++++++-
> ?kernel/trace/ftrace.c ? ? ? ? ? ? ? | ? 34 ++++++++++++++++++++++++++++++++++
> ?2 files changed, 42 insertions(+), 1 deletions(-)
>
> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
> index 9107b38..144eb83 100644
> --- a/Documentation/kernel-parameters.txt
> +++ b/Documentation/kernel-parameters.txt
> @@ -771,7 +771,14 @@ and is between 256 and 4096 characters. It is defined in the file
> ? ? ? ? ? ? ? ? ? ? ? ?tracer at boot up. function-list is a comma separated
> ? ? ? ? ? ? ? ? ? ? ? ?list of functions. This list can be changed at run
> ? ? ? ? ? ? ? ? ? ? ? ?time by the set_ftrace_filter file in the debugfs
> - ? ? ? ? ? ? ? ? ? ? ? tracing directory.
> + ? ? ? ? ? ? ? ? ? ? ? tracing directory.
> +
> + ? ? ? ftrace_graph_filter=[function-list]
> + ? ? ? ? ? ? ? ? ? ? ? [FTRACE] Limit the functions traced by the function
> + ? ? ? ? ? ? ? ? ? ? ? graph tracer at boot up. function-list is a comma
> + ? ? ? ? ? ? ? ? ? ? ? separated list of functions. This list can be changed
> + ? ? ? ? ? ? ? ? ? ? ? at run time by the set_graph_function file in the
> + ? ? ? ? ? ? ? ? ? ? ? debugfs tracing directory.



May be you should use a more detailed definition of this parameter.
Limiting a function traced by the function graph tracer is ambiguous.

It means we can have either:

function_to_trace();

or:

function_to_trace() {
foo() {
bar();
}
}

We want the second thing.
May be instead you can write:

"Limit the top level callers functions traced by the function
graph tracer at boot up."

Otherwise, looks good to me:

Acked-by: Frederic Weisbecker <[email protected]>

Thanks.

> ? ? ? ?ftrace_notrace=[function-list]
> ? ? ? ? ? ? ? ? ? ? ? ?[FTRACE] Do not trace the functions specified in
> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
> index 3724756..a5cae5c 100644
> --- a/kernel/trace/ftrace.c
> +++ b/kernel/trace/ftrace.c
> @@ -78,6 +78,10 @@ ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub;
> ?ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub;
> ?ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub;
>
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +static int ftrace_set_func(unsigned long *array, int *idx, char *buffer);
> +#endif
> +
> ?static void ftrace_list_func(unsigned long ip, unsigned long parent_ip)
> ?{
> ? ? ? ?struct ftrace_ops *op = ftrace_list;
> @@ -2302,6 +2306,7 @@ void ftrace_set_notrace(unsigned char *buf, int len, int reset)
> ?#define FTRACE_FILTER_SIZE ? ? ? ? ? ? COMMAND_LINE_SIZE
> ?static char ftrace_notrace_buf[FTRACE_FILTER_SIZE] __initdata;
> ?static char ftrace_filter_buf[FTRACE_FILTER_SIZE] __initdata;
> +static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata;
>
> ?static int __init set_ftrace_notrace(char *str)
> ?{
> @@ -2317,6 +2322,31 @@ static int __init set_ftrace_filter(char *str)
> ?}
> ?__setup("ftrace_filter=", set_ftrace_filter);
>
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +static int __init set_graph_function(char *str)
> +{
> + ? ? ? strncpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE);
> + ? ? ? return 1;
> +}
> +__setup("ftrace_graph_filter=", set_graph_function);
> +
> +static void __init set_ftrace_early_graph(char *buf)
> +{
> + ? ? ? int ret;
> + ? ? ? char *func;
> +
> + ? ? ? while (buf) {
> + ? ? ? ? ? ? ? func = strsep(&buf, ",");
> + ? ? ? ? ? ? ? /* we allow only one expression at a time */
> + ? ? ? ? ? ? ? ret = ftrace_set_func(ftrace_graph_funcs, &ftrace_graph_count,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? func);
> + ? ? ? ? ? ? ? if (ret)
> + ? ? ? ? ? ? ? ? ? ? ? printk(KERN_DEBUG "ftrace: function %s not "
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "traceable\n", func);
> + ? ? ? }
> +}
> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> +
> ?static void __init set_ftrace_early_filter(char *buf, int enable)
> ?{
> ? ? ? ?char *func;
> @@ -2333,6 +2363,10 @@ static void __init set_ftrace_early_filters(void)
> ? ? ? ? ? ? ? ?set_ftrace_early_filter(ftrace_filter_buf, 1);
> ? ? ? ?if (ftrace_notrace_buf[0])
> ? ? ? ? ? ? ? ?set_ftrace_early_filter(ftrace_notrace_buf, 0);
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> + ? ? ? if (ftrace_graph_buf[0])
> + ? ? ? ? ? ? ? set_ftrace_early_graph(ftrace_graph_buf);
> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> ?}
>
> ?static int
> --
> 1.6.2.5
>
>

2009-10-12 10:06:08

by Stefan Assmann

[permalink] [raw]
Subject: Re: [PATCH] ftrace: add kernel command line graph function filtering

On 12.10.2009 11:09, Fr?d?ric Weisbecker wrote:
> 2009/10/12 Stefan Assmann <[email protected]>:
>> From 894e934e782ddaa33eb6d156d8326cdf479b5f62 Mon Sep 17 00:00:00 2001
>> From: Stefan Assmann <[email protected]>
>> Date: Mon, 12 Oct 2009 09:11:47 +0200
>> Subject: [PATCH] ftrace: add kernel command line graph function filtering
>>
>> Add a command line parameter to allow limiting the function graphs that
>> are traced on boot up, when ftrace=function_graph is specified.
>>
>> This patch adds the following command line option:
>> ftrace_graph_filter=function-list
>
>
> If we use this parameter, we undoubtedly want to launch the function
> graph tracer.
> I'd then suggest to arm ftrace=function_graph automatically if we have
> ftrace_graph_filter
> set.
>
>
>>
>> Where function-list is a comma separated list of functions to filter.
>>
>> Signed-off-by: Stefan Assmann <[email protected]>
>> ---
>> Documentation/kernel-parameters.txt | 9 ++++++++-
>> kernel/trace/ftrace.c | 34 ++++++++++++++++++++++++++++++++++
>> 2 files changed, 42 insertions(+), 1 deletions(-)
>>
>> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
>> index 9107b38..144eb83 100644
>> --- a/Documentation/kernel-parameters.txt
>> +++ b/Documentation/kernel-parameters.txt
>> @@ -771,7 +771,14 @@ and is between 256 and 4096 characters. It is defined in the file
>> tracer at boot up. function-list is a comma separated
>> list of functions. This list can be changed at run
>> time by the set_ftrace_filter file in the debugfs
>> - tracing directory.
>> + tracing directory.
>> +
>> + ftrace_graph_filter=[function-list]
>> + [FTRACE] Limit the functions traced by the function
>> + graph tracer at boot up. function-list is a comma
>> + separated list of functions. This list can be changed
>> + at run time by the set_graph_function file in the
>> + debugfs tracing directory.
>
>
>
> May be you should use a more detailed definition of this parameter.
> Limiting a function traced by the function graph tracer is ambiguous.
>
> It means we can have either:
>
> function_to_trace();
>
> or:
>
> function_to_trace() {
> foo() {
> bar();
> }
> }
>
> We want the second thing.
> May be instead you can write:
>
> "Limit the top level callers functions traced by the function
> graph tracer at boot up."
>
> Otherwise, looks good to me:
>
> Acked-by: Frederic Weisbecker <[email protected]>
>
> Thanks.

Thanks for reviewing Fr?d?ric!
I hope the following is what you had in mind.

Stefan

>From edeb75ce9c9a35d5905d45954f66a0e05d5fe8ab Mon Sep 17 00:00:00 2001
From: Stefan Assmann <[email protected]>
Date: Mon, 12 Oct 2009 09:11:47 +0200
Subject: [PATCH] ftrace: add kernel command line graph function filtering

Add a command line parameter to allow limiting the top level callers functions
traced by the function graph tracer at boot up.

This patch adds the following command line option:
ftrace_graph_filter=function-list

Where function-list is a comma separated list of functions to filter.

Signed-off-by: Stefan Assmann <[email protected]>
---
Documentation/kernel-parameters.txt | 9 ++++++++-
kernel/trace/ftrace.c | 35 +++++++++++++++++++++++++++++++++++
kernel/trace/trace.c | 2 +-
kernel/trace/trace.h | 1 +
4 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 9107b38..539a053 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -771,7 +771,14 @@ and is between 256 and 4096 characters. It is defined in the file
tracer at boot up. function-list is a comma separated
list of functions. This list can be changed at run
time by the set_ftrace_filter file in the debugfs
- tracing directory.
+ tracing directory.
+
+ ftrace_graph_filter=[function-list]
+ [FTRACE] Limit the top level callers functions traced
+ by the function graph tracer at boot up.
+ function-list is a comma separated list of functions
+ that can be changed at run time by the
+ set_graph_function file in the debugfs tracing directory.

ftrace_notrace=[function-list]
[FTRACE] Do not trace the functions specified in
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 3724756..ee9c509 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -78,6 +78,10 @@ ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub;
ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub;
ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub;

+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+static int ftrace_set_func(unsigned long *array, int *idx, char *buffer);
+#endif
+
static void ftrace_list_func(unsigned long ip, unsigned long parent_ip)
{
struct ftrace_ops *op = ftrace_list;
@@ -2302,6 +2306,7 @@ void ftrace_set_notrace(unsigned char *buf, int len, int reset)
#define FTRACE_FILTER_SIZE COMMAND_LINE_SIZE
static char ftrace_notrace_buf[FTRACE_FILTER_SIZE] __initdata;
static char ftrace_filter_buf[FTRACE_FILTER_SIZE] __initdata;
+static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata;

static int __init set_ftrace_notrace(char *str)
{
@@ -2317,6 +2322,32 @@ static int __init set_ftrace_filter(char *str)
}
__setup("ftrace_filter=", set_ftrace_filter);

+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+static int __init set_graph_function(char *str)
+{
+ strncpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE);
+ return 1;
+}
+__setup("ftrace_graph_filter=", set_graph_function);
+
+static void __init set_ftrace_early_graph(char *buf)
+{
+ int ret;
+ char *func;
+
+ set_ftrace("function_graph");
+ while (buf) {
+ func = strsep(&buf, ",");
+ /* we allow only one expression at a time */
+ ret = ftrace_set_func(ftrace_graph_funcs, &ftrace_graph_count,
+ func);
+ if (ret)
+ printk(KERN_DEBUG "ftrace: function %s not "
+ "traceable\n", func);
+ }
+}
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
+
static void __init set_ftrace_early_filter(char *buf, int enable)
{
char *func;
@@ -2333,6 +2364,10 @@ static void __init set_ftrace_early_filters(void)
set_ftrace_early_filter(ftrace_filter_buf, 1);
if (ftrace_notrace_buf[0])
set_ftrace_early_filter(ftrace_notrace_buf, 0);
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+ if (ftrace_graph_buf[0])
+ set_ftrace_early_graph(ftrace_graph_buf);
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
}

static int
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 4506826..811c918 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -129,7 +129,7 @@ static int tracing_set_tracer(const char *buf);
static char bootup_tracer_buf[MAX_TRACER_SIZE] __initdata;
static char *default_bootup_tracer;

-static int __init set_ftrace(char *str)
+int __init set_ftrace(char *str)
{
strncpy(bootup_tracer_buf, str, MAX_TRACER_SIZE);
default_bootup_tracer = bootup_tracer_buf;
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 405cb85..4625acc 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -461,6 +461,7 @@ extern int trace_clock_id;
extern enum print_line_t print_graph_function(struct trace_iterator *iter);
extern enum print_line_t
trace_print_graph_duration(unsigned long long duration, struct trace_seq *s);
+extern int set_ftrace(char *str);

#ifdef CONFIG_DYNAMIC_FTRACE
/* TODO: make this variable */
--
1.6.2.5

2009-10-12 10:47:59

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH] ftrace: add kernel command line graph function filtering

Le 12 octobre 2009 12:05, Stefan Assmann <[email protected]> a ?crit :
> Thanks for reviewing Fr?d?ric!
> I hope the following is what you had in mind.
>
> ?Stefan
>
> From edeb75ce9c9a35d5905d45954f66a0e05d5fe8ab Mon Sep 17 00:00:00 2001
> From: Stefan Assmann <[email protected]>
> Date: Mon, 12 Oct 2009 09:11:47 +0200
> Subject: [PATCH] ftrace: add kernel command line graph function filtering
>
> Add a command line parameter to allow limiting the top level callers functions
> traced by the function graph tracer at boot up.
>
> This patch adds the following command line option:
> ftrace_graph_filter=function-list
>
> Where function-list is a comma separated list of functions to filter.
>
> Signed-off-by: Stefan Assmann <[email protected]>
> ---
> ?Documentation/kernel-parameters.txt | ? ?9 ++++++++-
> ?kernel/trace/ftrace.c ? ? ? ? ? ? ? | ? 35 +++++++++++++++++++++++++++++++++++
> ?kernel/trace/trace.c ? ? ? ? ? ? ? ?| ? ?2 +-
> ?kernel/trace/trace.h ? ? ? ? ? ? ? ?| ? ?1 +
> ?4 files changed, 45 insertions(+), 2 deletions(-)


Yup, looks good to me. I'm going to queue it.
Just some minor neats I'll change, see below:


> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
> index 9107b38..539a053 100644
> --- a/Documentation/kernel-parameters.txt
> +++ b/Documentation/kernel-parameters.txt
> @@ -771,7 +771,14 @@ and is between 256 and 4096 characters. It is defined in the file
> ? ? ? ? ? ? ? ? ? ? ? ?tracer at boot up. function-list is a comma separated
> ? ? ? ? ? ? ? ? ? ? ? ?list of functions. This list can be changed at run
> ? ? ? ? ? ? ? ? ? ? ? ?time by the set_ftrace_filter file in the debugfs
> - ? ? ? ? ? ? ? ? ? ? ? tracing directory.
> + ? ? ? ? ? ? ? ? ? ? ? tracing directory.
> +
> + ? ? ? ftrace_graph_filter=[function-list]
> + ? ? ? ? ? ? ? ? ? ? ? [FTRACE] Limit the top level callers functions traced
> + ? ? ? ? ? ? ? ? ? ? ? by the function graph tracer at boot up.
> + ? ? ? ? ? ? ? ? ? ? ? function-list is a comma separated list of functions
> + ? ? ? ? ? ? ? ? ? ? ? that can be changed at run time by the
> + ? ? ? ? ? ? ? ? ? ? ? set_graph_function file in the debugfs tracing directory.
>
> ? ? ? ?ftrace_notrace=[function-list]
> ? ? ? ? ? ? ? ? ? ? ? ?[FTRACE] Do not trace the functions specified in
> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
> index 3724756..ee9c509 100644
> --- a/kernel/trace/ftrace.c
> +++ b/kernel/trace/ftrace.c
> @@ -78,6 +78,10 @@ ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub;
> ?ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub;
> ?ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub;
>
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +static int ftrace_set_func(unsigned long *array, int *idx, char *buffer);
> +#endif



I'll try to move most of this new code in the bottom of ftrace.c, where most of
the ftrace related function graph tracer features are implemented.

Hopefully that could avoid us this ifdef'd declaration and all of the new others
by putting them in the already ifdef'd section of function graph helpers.
And also it's better to group the function graph helpers together.


> ?static void ftrace_list_func(unsigned long ip, unsigned long parent_ip)
> ?{
> ? ? ? ?struct ftrace_ops *op = ftrace_list;
> @@ -2302,6 +2306,7 @@ void ftrace_set_notrace(unsigned char *buf, int len, int reset)
> ?#define FTRACE_FILTER_SIZE ? ? ? ? ? ? COMMAND_LINE_SIZE
> ?static char ftrace_notrace_buf[FTRACE_FILTER_SIZE] __initdata;
> ?static char ftrace_filter_buf[FTRACE_FILTER_SIZE] __initdata;
> +static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata;
>
> ?static int __init set_ftrace_notrace(char *str)
> ?{
> @@ -2317,6 +2322,32 @@ static int __init set_ftrace_filter(char *str)
> ?}
> ?__setup("ftrace_filter=", set_ftrace_filter);
>
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +static int __init set_graph_function(char *str)
> +{
> + ? ? ? strncpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE);
> + ? ? ? return 1;
> +}
> +__setup("ftrace_graph_filter=", set_graph_function);
> +
> +static void __init set_ftrace_early_graph(char *buf)
> +{
> + ? ? ? int ret;
> + ? ? ? char *func;
> +
> + ? ? ? set_ftrace("function_graph");
> + ? ? ? while (buf) {
> + ? ? ? ? ? ? ? func = strsep(&buf, ",");
> + ? ? ? ? ? ? ? /* we allow only one expression at a time */
> + ? ? ? ? ? ? ? ret = ftrace_set_func(ftrace_graph_funcs, &ftrace_graph_count,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? func);
> + ? ? ? ? ? ? ? if (ret)
> + ? ? ? ? ? ? ? ? ? ? ? printk(KERN_DEBUG "ftrace: function %s not "
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "traceable\n", func);
> + ? ? ? }
> +}
> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
>
> ?static void __init set_ftrace_early_filter(char *buf, int enable)
> ?{
> ? ? ? ?char *func;
> @@ -2333,6 +2364,10 @@ static void __init set_ftrace_early_filters(void)
> ? ? ? ? ? ? ? ?set_ftrace_early_filter(ftrace_filter_buf, 1);
> ? ? ? ?if (ftrace_notrace_buf[0])
> ? ? ? ? ? ? ? ?set_ftrace_early_filter(ftrace_notrace_buf, 0);
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> + ? ? ? if (ftrace_graph_buf[0])
> + ? ? ? ? ? ? ? set_ftrace_early_graph(ftrace_graph_buf);
> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> ?}
>
> ?static int
> diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
> index 4506826..811c918 100644
> --- a/kernel/trace/trace.c
> +++ b/kernel/trace/trace.c
> @@ -129,7 +129,7 @@ static int tracing_set_tracer(const char *buf);
> ?static char bootup_tracer_buf[MAX_TRACER_SIZE] __initdata;
> ?static char *default_bootup_tracer;
>
> -static int __init set_ftrace(char *str)
> +int __init set_ftrace(char *str)


I'm also going to rename this into set_early_ftrace() :-)

Thanks!

2009-10-12 13:48:59

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH] ftrace: add kernel command line graph function filtering

On Mon, 2009-10-12 at 11:09 +0200, Fr?d?ric Weisbecker wrote:
> 2009/10/12 Stefan Assmann <[email protected]>:
> > From 894e934e782ddaa33eb6d156d8326cdf479b5f62 Mon Sep 17 00:00:00 2001
> > From: Stefan Assmann <[email protected]>
> > Date: Mon, 12 Oct 2009 09:11:47 +0200
> > Subject: [PATCH] ftrace: add kernel command line graph function filtering
> >
> > Add a command line parameter to allow limiting the function graphs that
> > are traced on boot up, when ftrace=function_graph is specified.
> >
> > This patch adds the following command line option:
> > ftrace_graph_filter=function-list
>
>
> If we use this parameter, we undoubtedly want to launch the function
> graph tracer.
> I'd then suggest to arm ftrace=function_graph automatically if we have
> ftrace_graph_filter
> set.
>

Actually, I disagree. I may just be lazy, and want to set up the
function graph to a particular set of functions. It doesn't mean I want
to run the function_graph tracer on boot up.

This is the same reason I don't automatically set up ftrace=function
when the filter and notrace functions are set.

-- Steve

2009-10-12 13:59:54

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH] ftrace: add kernel command line graph function filtering

Le 12 octobre 2009 15:46, Steven Rostedt <[email protected]> a ?crit :
> On Mon, 2009-10-12 at 11:09 +0200, Fr?d?ric Weisbecker wrote:
>> 2009/10/12 Stefan Assmann <[email protected]>:
>> > From 894e934e782ddaa33eb6d156d8326cdf479b5f62 Mon Sep 17 00:00:00 2001
>> > From: Stefan Assmann <[email protected]>
>> > Date: Mon, 12 Oct 2009 09:11:47 +0200
>> > Subject: [PATCH] ftrace: add kernel command line graph function filtering
>> >
>> > Add a command line parameter to allow limiting the function graphs that
>> > are traced on boot up, when ftrace=function_graph is specified.
>> >
>> > This patch adds the following command line option:
>> > ftrace_graph_filter=function-list
>>
>>
>> If we use this parameter, we undoubtedly want to launch the function
>> graph tracer.
>> I'd then suggest to arm ftrace=function_graph automatically if we have
>> ftrace_graph_filter
>> set.
>>
>
> Actually, I disagree. I may just be lazy, and want to set up the
> function graph to a particular set of functions. It doesn't mean I want
> to run the function_graph tracer on boot up.
>
> This is the same reason I don't automatically set up ftrace=function
> when the filter and notrace functions are set.


No problem. I'll take the previous patch then, plus the kernel
parameter doc fix in the current one :-)

2009-10-12 14:32:55

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH] ftrace: add kernel command line graph function filtering

On Mon, 2009-10-12 at 15:59 +0200, Fr?d?ric Weisbecker wrote:

> No problem. I'll take the previous patch then, plus the kernel
> parameter doc fix in the current one :-)

Great, so you'll pull in these changes then?

-- Steve

2009-10-12 17:02:40

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH] ftrace: add kernel command line graph function filtering

On Mon, Oct 12, 2009 at 10:30:54AM -0400, Steven Rostedt wrote:
> On Mon, 2009-10-12 at 15:59 +0200, Fr?d?ric Weisbecker wrote:
>
> > No problem. I'll take the previous patch then, plus the kernel
> > parameter doc fix in the current one :-)
>
> Great, so you'll pull in these changes then?
>
> -- Steve


Yep, will push that soon.

2009-10-13 10:35:34

by Stefan Assmann

[permalink] [raw]
Subject: [tip:tracing/core] ftrace: add kernel command line graph function filtering

Commit-ID: 369bc18f9a6c4e2686204c1d7476ab684a720968
Gitweb: http://git.kernel.org/tip/369bc18f9a6c4e2686204c1d7476ab684a720968
Author: Stefan Assmann <[email protected]>
AuthorDate: Mon, 12 Oct 2009 22:17:21 +0200
Committer: Frederic Weisbecker <[email protected]>
CommitDate: Mon, 12 Oct 2009 22:17:21 +0200

ftrace: add kernel command line graph function filtering

Add a command line parameter to allow limiting the function graphs
that are traced on boot up from the given top-level callers , when
ftrace=function_graph is specified.

This patch adds the following command line option:
ftrace_graph_filter=function-list

Where function-list is a comma separated list of functions to filter.

[[email protected]: picked the documentation changes from the v2 patch]

Signed-off-by: Stefan Assmann <[email protected]>
Acked-by: Steven Rostedt <[email protected]>
LKML-Reference: <[email protected]>
Signed-off-by: Frederic Weisbecker <[email protected]>
---
Documentation/kernel-parameters.txt | 7 +++++++
kernel/trace/ftrace.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 6fa7292..1dc4b9c 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -778,6 +778,13 @@ and is between 256 and 4096 characters. It is defined in the file
by the set_ftrace_notrace file in the debugfs
tracing directory.

+ ftrace_graph_filter=[function-list]
+ [FTRACE] Limit the top level callers functions traced
+ by the function graph tracer at boot up.
+ function-list is a comma separated list of functions
+ that can be changed at run time by the
+ set_graph_function file in the debugfs tracing directory.
+
gamecon.map[2|3]=
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
support via parallel port (up to 5 devices per port)
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 9a72853..91283d4 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -78,6 +78,10 @@ ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub;
ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub;
ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub;

+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+static int ftrace_set_func(unsigned long *array, int *idx, char *buffer);
+#endif
+
static void ftrace_list_func(unsigned long ip, unsigned long parent_ip)
{
struct ftrace_ops *op = ftrace_list;
@@ -2248,6 +2252,7 @@ void ftrace_set_notrace(unsigned char *buf, int len, int reset)
#define FTRACE_FILTER_SIZE COMMAND_LINE_SIZE
static char ftrace_notrace_buf[FTRACE_FILTER_SIZE] __initdata;
static char ftrace_filter_buf[FTRACE_FILTER_SIZE] __initdata;
+static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata;

static int __init set_ftrace_notrace(char *str)
{
@@ -2263,6 +2268,31 @@ static int __init set_ftrace_filter(char *str)
}
__setup("ftrace_filter=", set_ftrace_filter);

+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+static int __init set_graph_function(char *str)
+{
+ strncpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE);
+ return 1;
+}
+__setup("ftrace_graph_filter=", set_graph_function);
+
+static void __init set_ftrace_early_graph(char *buf)
+{
+ int ret;
+ char *func;
+
+ while (buf) {
+ func = strsep(&buf, ",");
+ /* we allow only one expression at a time */
+ ret = ftrace_set_func(ftrace_graph_funcs, &ftrace_graph_count,
+ func);
+ if (ret)
+ printk(KERN_DEBUG "ftrace: function %s not "
+ "traceable\n", func);
+ }
+}
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
+
static void __init set_ftrace_early_filter(char *buf, int enable)
{
char *func;
@@ -2279,6 +2309,10 @@ static void __init set_ftrace_early_filters(void)
set_ftrace_early_filter(ftrace_filter_buf, 1);
if (ftrace_notrace_buf[0])
set_ftrace_early_filter(ftrace_notrace_buf, 0);
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+ if (ftrace_graph_buf[0])
+ set_ftrace_early_graph(ftrace_graph_buf);
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
}

static int