Skip to contentSkip to conversation

tracing, function_graph: simplify test for tracing

PATCH Applied Lai Jiangshan 2 participants 4 messages Jan 13, 2010 – Jan 29, 2010 Tracing

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 tracing, function_graph: simplify test for tracing

For function_graph, a calling function is to be traced only when it is enabled or it is nested in a enabled function.

Current code uses TSK_TRACE_FL_GRAPH to test whether it is nested or not. read the code, we can get this:
(trace->depth > 0) <==> (TSK_TRACE_FL_GRAPH is set)

trace->depth is more explicit to tell that it is nested. So we use trace->depth directly and simplify the code.

No functionality is changed.
TSK_TRACE_FL_GRAPH is not removed now, it is left for future usage.

---

kernel/trace/trace.h +1 -1
index 3976520..9a69b9c 100644
@@ -506,7 +506,7 @@ static inline int ftrace_graph_addr(unsigned long addr)
 {
 	int i;
 
-	if (!ftrace_graph_count || test_tsk_trace_graph(current))
+	if (!ftrace_graph_count)
 		return 1;
 
 	for (i = 0; i < ftrace_graph_count; i++) {
kernel/trace/trace_functions_graph.c +2 -6
index b1342c5..8e17a57 100644
@@ -218,7 +218,8 @@ int trace_graph_entry(struct ftrace_graph_ent *trace)
 	if (!ftrace_trace_task(current))
 		return 0;
 
-	if (!ftrace_graph_addr(trace->func))
+	/* trace it when it is-nested-in or is a function enabled. */
+	if (!(trace->depth || ftrace_graph_addr(trace->func)))
 		return 0;
 
 	local_irq_save(flags);
@@ -231,9 +232,6 @@ int trace_graph_entry(struct ftrace_graph_ent *trace)
 	} else {
 		ret = 0;
 	}
-	/* Only do the atomic if it is not already set */
-	if (!test_tsk_trace_graph(current))
-		set_tsk_trace_graph(current);
 
 	atomic_dec(&data->disabled);
 	local_irq_restore(flags);
@@ -281,8 +279,6 @@ void trace_graph_return(struct ftrace_graph_ret *trace)
 		pc = preempt_count();
 		__trace_graph_return(tr, trace, flags, pc);
 	}
-	if (!trace->depth)
-		clear_tsk_trace_graph(current);
 	atomic_dec(&data->disabled);
 	local_irq_restore(flags);
 }
Acked-by on v1 1/1
#1 lore raw
Quoted 8 lines · Lai Jiangshan

For function_graph, a calling function is to be traced only when it is enabled or it is nested in a enabled function.

Current code uses TSK_TRACE_FL_GRAPH to test whether it is nested or not. read the code, we can get this:
(trace->depth > 0) <==> (TSK_TRACE_FL_GRAPH is set)

Quoted 8 lines

trace->depth is more explicit to tell that it is nested. So we use trace->depth directly and simplify the code.

No functionality is changed.
TSK_TRACE_FL_GRAPH is not removed now, it is left for future usage.

---

Looks prety good to me. Nice simplification, the less checks we have in this hot path, the better.

#2 lore raw
In reply to Lai Jiangshan
Quoted 8 lines · Lai Jiangshan

For function_graph, a calling function is to be traced only when it is enabled or it is nested in a enabled function.

Current code uses TSK_TRACE_FL_GRAPH to test whether it is nested or not. read the code, we can get this:
(trace->depth > 0) <==> (TSK_TRACE_FL_GRAPH is set)

Quoted 8 lines

trace->depth is more explicit to tell that it is nested. So we use trace->depth directly and simplify the code.

No functionality is changed.
TSK_TRACE_FL_GRAPH is not removed now, it is left for future usage.

---

I've queued it. Thanks.

#3 lore raw

[tip:tracing/core] tracing: Simplify test for function_graph tracing start point

In reply to Lai Jiangshan
Commit-ID:  ea2c68a08fedb5053ba312d661e47df9f4d72411
Gitweb:     http://git.kernel.org/tip/ea2c68a08fedb5053ba312d661e47df9f4d72411
Author:     Lai Jiangshan <[email protected]>
AuthorDate: Wed, 13 Jan 2010 19:38:30 +0800
Committer:  Frederic Weisbecker <[email protected]>
CommitDate: Fri, 29 Jan 2010 01:05:12 +0100

tracing: Simplify test for function_graph tracing start point

In the function graph tracer, a calling function is to be traced only when it is enabled through the set_graph_function file, or when it is nested in an enabled function.

Current code uses TSK_TRACE_FL_GRAPH to test whether it is nested or not. Looking at the code, we can get this:
(trace->depth > 0) <==> (TSK_TRACE_FL_GRAPH is set)

trace->depth is more explicit to tell that it is nested. So we use trace->depth directly and simplify the code.

No functionality is changed.
TSK_TRACE_FL_GRAPH is not removed yet, it is left for future usage.

Cc Ingo Molnar <[email protected]>
Cc Steven Rostedt <[email protected]>

LKML-Reference: <[email protected]>

---
 kernel/trace/trace.h                 |    2 +-
 kernel/trace/trace_functions_graph.c |    8 ++------
 2 files changed, 3 insertions(+), 7 deletions(-)
kernel/trace/trace.h +1 -1
index 4df6a77..ce077fb 100644
@@ -504,7 +504,7 @@ static inline int ftrace_graph_addr(unsigned long addr)
 {
 	int i;
 
-	if (!ftrace_graph_count || test_tsk_trace_graph(current))
+	if (!ftrace_graph_count)
 		return 1;
 
 	for (i = 0; i < ftrace_graph_count; i++) {
kernel/trace/trace_functions_graph.c +2 -6
index f225229..616b135 100644
@@ -215,7 +215,8 @@ int trace_graph_entry(struct ftrace_graph_ent *trace)
 	if (!ftrace_trace_task(current))
 		return 0;
 
-	if (!ftrace_graph_addr(trace->func))
+	/* trace it when it is-nested-in or is a function enabled. */
+	if (!(trace->depth || ftrace_graph_addr(trace->func)))
 		return 0;
 
 	local_irq_save(flags);
@@ -228,9 +229,6 @@ int trace_graph_entry(struct ftrace_graph_ent *trace)
 	} else {
 		ret = 0;
 	}
-	/* Only do the atomic if it is not already set */
-	if (!test_tsk_trace_graph(current))
-		set_tsk_trace_graph(current);
 
 	atomic_dec(&data->disabled);
 	local_irq_restore(flags);
@@ -278,8 +276,6 @@ void trace_graph_return(struct ftrace_graph_ret *trace)
 		pc = preempt_count();
 		__trace_graph_return(tr, trace, flags, pc);
 	}
-	if (!trace->depth)
-		clear_tsk_trace_graph(current);
 	atomic_dec(&data->disabled);
 	local_irq_restore(flags);
 }