Skip to contentSkip to conversation

tracing/ftrace: make nop tracer using tracer flags

PATCH In review Frederic Weisbecker 4 participants 7 messages Nov 17, 2008 – Nov 18, 2008 Tracing

lore
Share & tools
lore
#0 lore raw

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
index 0e77415..1d8b4f8 100644
@@ -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
Acked-by on v1 2/3
#1 lore raw
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.

---
 kernel/trace/trace_nop.c |   48 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 48 insertions(+), 0 deletions(-)
kernel/trace/trace_nop.c +6 -0
index 0e77415..1d8b4f8 100644
@@ -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.

author Acked-by Steven Noonan
#2 lore raw
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 3 lines

Other than the change noted above, I think it looks good.

Thanks!

Here is the V2:
--

Quoted 1 line

From 6611913ca6ab732277b187283dba2144af4c9548 Mon 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
index 0e77415..c917789 100644
@@ -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
#5 lore raw
In reply to Frederic Weisbecker

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

author Acked-by Steven Noonan
#6 lore raw
Quoted 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	0x2

please use C enums not CPP defines.

Ingo

Fixed in the V3 below:

--

Quoted 1 line

From adc63c6d8f79927740058a50679a94a1c31c30e2 Mon 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
index 0e77415..b9767ac 100644
@@ -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
#3 lore raw
In reply to Frederic Weisbecker
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.

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

maintainer
#4 lore raw
Quoted 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.

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