tracing/ftrace: make nop tracer using tracer flags
PATCH 2/3 tracing/ftrace: make nop tracer using tracer flags
Impact: give an example on how to use specific tracer flags
This patch propose to use the nop tracer to provide an example for using the tracer's custom flags implementation.
--- kernel/trace/trace_nop.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 48 insertions(+), 0 deletions(-)
kernel/trace/trace_nop.c +48 -0
@@ -41,6 +41,52 @@ static void nop_trace_reset(struct trace_array *tr)stop_nop_trace (tr); } +#define TRACE_NOP_OPT_ACCEPT 0x1 +#define TRACE_NOP_OPT_REFUSE 0x2 +/* Options for the tracer (see trace_options file) */ +static struct tracer_opt nop_opts[] = { +/* Option that will be accepted by set_flag callback */ + {TRACER_OPT (test_nop_accept,TRACE_NOP_OPT_ACCEPT ) }, +/* Option that will be refused by set_flag callback */ + {TRACER_OPT (test_nop_refuse,TRACE_NOP_OPT_REFUSE ) }, + { }/* Always set the last empty entry */ +}; + +static struct tracer_flags nop_flags = { +/* You can check your flags value here when you want. */ + .val =0 ,/* By default: all flags disabled */ + .opts = nop_opts +}; + +/* It only serves as a signal handler and a callback to +* accept or refuse tthe setting of a flag. +* If you don't implement it, then the flag setting will be +* automatically accepted. +*/ +static int nop_set_flag (u32 old_flags,u32 bit,int set) +{ +/* +* Note that you don't need to update nop_flags.val yourself. +* The tracing Api will do it automatically if you return 0 +*/ +if (bit ==TRACE_NOP_OPT_ACCEPT ) { +printk (KERN_DEBUG "nop_test_accept flag set to %d: we accept." +" Now cat trace_options to see the result\n" , + set); +return 0 ; + } + +if (bit ==TRACE_NOP_OPT_REFUSE ) { +printk (KERN_DEBUG "nop_test_refuse flag set to %d: we refuse." +"Now cat trace_options to see the result\n" , + set); +return -EINVAL ; + } + +return 0 ; +} + +struct tracer nop_trace__read_mostly = { .name ="nop" ,
@@ -49,5 +95,7 @@ struct tracer nop_trace __read_mostly =#ifdef CONFIG_FTRACE_SELFTEST .selftest = trace_selftest_startup_nop, #endif + .flags = &nop_flags, + .set_flag = nop_set_flag };
Signature · 1 line
1.5.2.5
Quoted 24 lines · Frederic Weisbecker
Impact: give an example on how to use specific tracer flags
This patch propose to use the nop tracer to provide an example for using the tracer's custom flags implementation.
Signed-off-by Frederic Weisbecker <[email protected]>--- kernel/trace/trace_nop.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 48 insertions(+), 0 deletions(-)kernel/trace/trace_nop.c +6
-0@@ -41,6 +41,52 @@ static void nop_trace_reset(struct trace_array *tr)stop_nop_trace (tr); } +#define TRACE_NOP_OPT_ACCEPT 0x1 +#define TRACE_NOP_OPT_REFUSE 0x2 +/* Options for the tracer (see trace_options file) */ +static struct tracer_opt nop_opts[] = { +/* Option that will be accepted by set_flag callback */ + {TRACER_OPT (test_nop_accept,TRACE_NOP_OPT_ACCEPT ) },
kernel/trace/trace_nop.c static void nop_trace_reset(struct trace_array *tr) · line 59
Quoted 10 lines
kernel/trace/trace_nop.c +10
-0+/* Option that will be refused by set_flag callback */ + { TRACER_OPT(test_nop_refuse, TRACE_NOP_OPT_REFUSE) }, + { }/* Always set the last empty entry */ +}; + +static struct tracer_flags nop_flags = { +/* You can check your flags value here when you want. */ + .val =0 ,/* By default: all flags disabled */ + .opts = nop_opts +};
I'd like these #defines and structs moved to just after the #includes, for cleanliness.
Quoted 42 lines
kernel/trace/trace_nop.c +32
-1+ +/* It only serves as a signal handler and a callback to +* accept or refuse tthe setting of a flag. +* If you don't implement it, then the flag setting will be +* automatically accepted. +*/ +static int nop_set_flag (u32 old_flags,u32 bit,int set) +{ +/* +* Note that you don't need to update nop_flags.val yourself. +* The tracing Api will do it automatically if you return 0 +*/ +if (bit ==TRACE_NOP_OPT_ACCEPT ) { +printk (KERN_DEBUG "nop_test_accept flag set to %d: we accept." +" Now cat trace_options to see the result\n" , + set); +return 0 ; + } + +if (bit ==TRACE_NOP_OPT_REFUSE ) { +printk (KERN_DEBUG "nop_test_refuse flag set to %d: we refuse." +"Now cat trace_options to see the result\n" , + set); +return -EINVAL ; + } + +return 0 ; +} + +struct tracer nop_trace__read_mostly = { .name ="nop" ,@@ -49,5 +95,7 @@ struct tracer nop_trace __read_mostly =#ifdef CONFIG_FTRACE_SELFTEST .selftest = trace_selftest_startup_nop, #endif + .flags = &nop_flags, + .set_flag = nop_set_flag }; --
Quoted 2 lines
1.5.2.5
Other than the change noted above, I think it looks good.
Frederic Weisbecker
Acked-by Steven NoonanQuoted 2 lines · Steven Noonan
I'd like these #defines and structs moved to just after the #includes, for cleanliness.
You're right I just corrected it in this V2.
Quoted 3 lines
Other than the change noted above, I think it looks good.
Acked-by Steven Noonan <[email protected]>
Thanks!
Here is the V2:
--
Quoted 1 line
From
6611913ca6ab732277b187283dba2144af4c9548Mon Sep 17 00:00:00 2001
From: Frederic Weisbecker <[email protected]>
Date: Mon, 17 Nov 2008 03:53:33 +0100
Subject: [PATCH 2/3][V2] tracing/ftrace: make nop tracer using tracer flags
Impact: give an example on how to use specific tracer flags
This patch propose to use the nop tracer to provide an example for using the tracer's custom flags implementation.
(V2: replace structures and defines just after the headers includes for cleanliness).
---
kernel/trace/trace_nop.c +48 -0
@@ -12,6 +12,23 @@#include "trace.h" +#define TRACE_NOP_OPT_ACCEPT 0x1 +#define TRACE_NOP_OPT_REFUSE 0x2 +/* Options for the tracer (see trace_options file) */ +static struct tracer_opt nop_opts[] = { +/* Option that will be accepted by set_flag callback */ + {TRACER_OPT (test_nop_accept,TRACE_NOP_OPT_ACCEPT ) }, +/* Option that will be refused by set_flag callback */ + {TRACER_OPT (test_nop_refuse,TRACE_NOP_OPT_REFUSE ) }, + { }/* Always set a last empty entry */ +}; + +static struct tracer_flags nop_flags = { +/* You can check your flags value here when you want. */ + .val =0 ,/* By default: all flags disabled */ + .opts = nop_opts +}; +static struct trace_array *ctx_trace;static void start_nop_trace (struct trace_array *tr)
@@ -41,6 +58,35 @@ static void nop_trace_reset(struct trace_array *tr)stop_nop_trace (tr); } +/* It only serves as a signal handler and a callback to +* accept or refuse tthe setting of a flag. +* If you don't implement it, then the flag setting will be +* automatically accepted. +*/ +static int nop_set_flag (u32 old_flags,u32 bit,int set) +{ +/* +* Note that you don't need to update nop_flags.val yourself. +* The tracing Api will do it automatically if you return 0 +*/ +if (bit ==TRACE_NOP_OPT_ACCEPT ) { +printk (KERN_DEBUG "nop_test_accept flag set to %d: we accept." +" Now cat trace_options to see the result\n" , + set); +return 0 ; + } + +if (bit ==TRACE_NOP_OPT_REFUSE ) { +printk (KERN_DEBUG "nop_test_refuse flag set to %d: we refuse." +"Now cat trace_options to see the result\n" , + set); +return -EINVAL ; + } + +return 0 ; +} + +struct tracer nop_trace__read_mostly = { .name ="nop" ,
@@ -49,5 +95,7 @@ struct tracer nop_trace __read_mostly =#ifdef CONFIG_FTRACE_SELFTEST .selftest = trace_selftest_startup_nop, #endif + .flags = &nop_flags, + .set_flag = nop_set_flag };
Signature · 1 line
1.5.2.5
Quoted 7 lines · Frederic Weisbecker
Quoted 2 lines · Steven Noonan
I'd like these #defines and structs moved to just after the #includes, for cleanliness.
You're right I just corrected it in this V2.
Quoted 7 lines
Quoted 3 lines
Other than the change noted above, I think it looks good.
Acked-by Steven Noonan <[email protected]>Thanks!
Here is the V2:
thanks.
Steve, what's your take on this method of allowing extensions to tracer plugins? I've put Frederic's commits into tip/tracing/options, but have not merged them into tip/master yet.
Ingo
Steven Rostedt
maintainerQuoted 16 lines · Ingo Molnar
Quoted 13 lines · Frederic Weisbecker
Steven Noonan a ?crit :
Quoted 2 lines
I'd like these #defines and structs moved to just after the #includes, for cleanliness.
You're right I just corrected it in this V2.
Quoted 3 lines
Other than the change noted above, I think it looks good.
Acked-by Steven Noonan <[email protected]>Thanks!
Quoted 7 lines
Quoted 1 line
Here is the V2:
thanks.
Steve, what's your take on this method of allowing extensions to tracer plugins? I've put Frederic's commits into tip/tracing/options, but have not merged them into tip/master yet.
I'll pull it now and play with it to see if there's any issues I might find. But from looking at the patches, I do not see anything major.
I'll let you know.
-- Steve
kernel/trace/trace_nop.c static void nop_trace_reset(struct trace_array *tr) · line 45
Quoted 2 lines · Frederic Weisbecker
kernel/trace/trace_nop.c +2
-0+#define TRACE_NOP_OPT_ACCEPT 0x1 +#define TRACE_NOP_OPT_REFUSE 0x2
please use C enums not CPP defines.
Ingo
Frederic Weisbecker
Acked-by Steven NoonanQuoted 8 lines · Ingo Molnar
Review
Quoted 2 lines · Frederic Weisbecker
(quoted diff) +2
-0+#define TRACE_NOP_OPT_ACCEPT 0x1 +#define TRACE_NOP_OPT_REFUSE 0x2please use C enums not CPP defines.
Ingo
Fixed in the V3 below:
--
Quoted 1 line
From
adc63c6d8f79927740058a50679a94a1c31c30e2Mon Sep 17 00:00:00 2001
From: Frederic Weisbecker <[email protected]>
Date: Mon, 17 Nov 2008 16:19:35 +0100
Subject: [PATCH 2/3][V3] tracing/ftrace: make nop tracer using tracer flags
Impact: give an example on how to use specific tracer flags
This patch propose to use the nop tracer to provide an example for using the tracer's custom flags implementation.
V3: replace defines by enum values.
V2: replace structures and defines just after the headers includes for cleanliness.
--- kernel/trace/trace_nop.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 52 insertions(+), 0 deletions(-)
kernel/trace/trace_nop.c +52 -0
@@ -12,6 +12,27 @@#include "trace.h" +/* Our two options */ +enum { +TRACE_NOP_OPT_ACCEPT =0x1 , +TRACE_NOP_OPT_REFUSE =0x2 +}; + +/* Options for the tracer (see trace_options file) */ +static struct tracer_opt nop_opts[] = { +/* Option that will be accepted by set_flag callback */ + {TRACER_OPT (test_nop_accept,TRACE_NOP_OPT_ACCEPT ) }, +/* Option that will be refused by set_flag callback */ + {TRACER_OPT (test_nop_refuse,TRACE_NOP_OPT_REFUSE ) }, + { }/* Always set a last empty entry */ +}; + +static struct tracer_flags nop_flags = { +/* You can check your flags value here when you want. */ + .val =0 ,/* By default: all flags disabled */ + .opts = nop_opts +}; +static struct trace_array *ctx_trace;static void start_nop_trace (struct trace_array *tr)
@@ -41,6 +62,35 @@ static void nop_trace_reset(struct trace_array *tr)stop_nop_trace (tr); } +/* It only serves as a signal handler and a callback to +* accept or refuse tthe setting of a flag. +* If you don't implement it, then the flag setting will be +* automatically accepted. +*/ +static int nop_set_flag (u32 old_flags,u32 bit,int set) +{ +/* +* Note that you don't need to update nop_flags.val yourself. +* The tracing Api will do it automatically if you return 0 +*/ +if (bit ==TRACE_NOP_OPT_ACCEPT ) { +printk (KERN_DEBUG "nop_test_accept flag set to %d: we accept." +" Now cat trace_options to see the result\n" , + set); +return 0 ; + } + +if (bit ==TRACE_NOP_OPT_REFUSE ) { +printk (KERN_DEBUG "nop_test_refuse flag set to %d: we refuse." +"Now cat trace_options to see the result\n" , + set); +return -EINVAL ; + } + +return 0 ; +} + +struct tracer nop_trace__read_mostly = { .name ="nop" ,
@@ -49,5 +99,7 @@ struct tracer nop_trace __read_mostly =#ifdef CONFIG_FTRACE_SELFTEST .selftest = trace_selftest_startup_nop, #endif + .flags = &nop_flags, + .set_flag = nop_set_flag };
Signature · 1 line
1.5.2.5