From: Frederic Weisbecker <fweisbec@gmail.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: LKML <linux-kernel@vger.kernel.org>,
Frederic Weisbecker <fweisbec@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
Li Zefan <lizf@cn.fujitsu.com>,
Lai Jiangshan <laijs@cn.fujitsu.com>
Subject: [RFC PATCH 09/10] tracing: Use the hashlist for graph function
Date: Fri, 22 Jan 2010 02:16:21 +0100 [thread overview]
Message-ID: <1264122982-1553-10-git-send-regression-fweisbec@gmail.com> (raw)
In-Reply-To: <1264122982-1553-1-git-send-regression-fweisbec@gmail.com>
When we set a filter to start tracing from a given function in
the function graph tracer, the filter is stored in a linear array.
It doesn't scale very well, we even limited the number of such
functions to 32.
Now that we have a hashlist of functions, lets put a field inside
each function node so that we can check if a function is one of
these filters using the hashlist, not a linear array.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
---
kernel/trace/ftrace.c | 61 ++++++++++++++++++++++++++++++++++
kernel/trace/functions_hlist.c | 29 ++++++++++++++++
kernel/trace/functions_hlist.h | 2 +
kernel/trace/trace.h | 21 +-----------
kernel/trace/trace_functions_graph.c | 41 ++++++++++++++++++++++-
5 files changed, 133 insertions(+), 21 deletions(-)
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 027743c..d719078 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -2193,6 +2193,67 @@ static DEFINE_MUTEX(graph_lock);
int ftrace_graph_count;
unsigned long ftrace_graph_funcs[FTRACE_GRAPH_MAX_FUNCS] __read_mostly;
+static int
+change_graph_function_hlist(unsigned long ip, int val, struct func_hlist *hlist)
+{
+ struct func_node *rec;
+
+ rec = function_find_hlist_node(hlist, ip);
+ if (!rec) {
+ rec = function_hlist_record_alloc(hlist, ip);
+ if (!rec)
+ return 1;
+ }
+
+ rec->graph_start = val;
+
+ return 0;
+}
+
+static int change_graph_function(unsigned long ip, int val)
+{
+ int ret;
+ int cpu;
+ struct func_hlist *hlist;
+
+ for_each_online_cpu(cpu) {
+ hlist = &per_cpu(func_hlist_cpu, cpu);
+ ret = change_graph_function_hlist(ip, val, hlist);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static void clear_graph_functions(void)
+{
+ int i;
+
+ for (i = 0; i < ftrace_graph_count; i++)
+ change_graph_function(ftrace_graph_funcs[i], 0);
+}
+
+int set_graph_functions(void)
+{
+ int i;
+ int ret = 0;
+
+ mutex_lock(&graph_lock);
+
+ for (i = 0; i < ftrace_graph_count; i++) {
+ ret = change_graph_function(ftrace_graph_funcs[i], 1);
+ if (ret) {
+ clear_graph_functions();
+ break;
+ }
+ }
+
+ mutex_unlock(&graph_lock);
+
+ return 0;
+}
+
static void *
__g_next(struct seq_file *m, loff_t *pos)
{
diff --git a/kernel/trace/functions_hlist.c b/kernel/trace/functions_hlist.c
index d682213..7a60265 100644
--- a/kernel/trace/functions_hlist.c
+++ b/kernel/trace/functions_hlist.c
@@ -54,6 +54,35 @@ void function_hlist_reset_profile(void)
function_hlist_reset_profile_cpu(cpu);
}
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+static void function_hlist_reset_graph_cpu(int cpu)
+{
+ struct func_hlist *hlist = &per_cpu(func_hlist_cpu, cpu);
+ struct hlist_head *head;
+ struct hlist_node *node;
+ struct func_node *rec;
+ int i;
+
+ for (i = 0; i < FUNCTIONS_HLIST_SIZE; i++) {
+ head = &hlist->hash[i];
+
+ if (hlist_empty(head))
+ continue;
+
+ hlist_for_each_entry(rec, node, head, node)
+ rec->graph_start = 0;
+ }
+}
+
+void function_hlist_reset_graph(void)
+{
+ int cpu;
+
+ for_each_online_cpu(cpu)
+ function_hlist_reset_graph_cpu(cpu);
+}
+#endif
+
static void __function_hlist_release(struct func_hlist *hlist)
{
struct func_hlist_page *pg = hlist->start;
diff --git a/kernel/trace/functions_hlist.h b/kernel/trace/functions_hlist.h
index a4655c7..39d89b4 100644
--- a/kernel/trace/functions_hlist.h
+++ b/kernel/trace/functions_hlist.h
@@ -8,6 +8,7 @@ struct func_node {
unsigned long counter;
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
unsigned long long time;
+ int graph_start;
#endif
};
@@ -38,3 +39,4 @@ function_hlist_record_alloc(struct func_hlist *hlist, unsigned long ip);
int get_function_hlist(void);
void put_function_hlist(void);
void function_hlist_reset_profile(void);
+void function_hlist_reset_graph(void);
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index ce077fb..ff0b01a 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -499,26 +499,7 @@ trace_print_graph_duration(unsigned long long duration, struct trace_seq *s);
#define FTRACE_GRAPH_MAX_FUNCS 32
extern int ftrace_graph_count;
extern unsigned long ftrace_graph_funcs[FTRACE_GRAPH_MAX_FUNCS];
-
-static inline int ftrace_graph_addr(unsigned long addr)
-{
- int i;
-
- if (!ftrace_graph_count)
- return 1;
-
- for (i = 0; i < ftrace_graph_count; i++) {
- if (addr == ftrace_graph_funcs[i])
- return 1;
- }
-
- return 0;
-}
-#else
-static inline int ftrace_graph_addr(unsigned long addr)
-{
- return 1;
-}
+int set_graph_functions(void);
#endif /* CONFIG_DYNAMIC_FTRACE */
#else /* CONFIG_FUNCTION_GRAPH_TRACER */
static inline enum print_line_t
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
index 616b135..da24add 100644
--- a/kernel/trace/trace_functions_graph.c
+++ b/kernel/trace/trace_functions_graph.c
@@ -13,6 +13,7 @@
#include "trace.h"
#include "trace_output.h"
+#include "functions_hlist.h"
struct fgraph_cpu_data {
pid_t last_pid;
@@ -202,6 +203,33 @@ static int __trace_graph_entry(struct trace_array *tr,
return 1;
}
+static inline int ftrace_graph_addr(unsigned long addr)
+{
+ struct func_node *rec;
+ struct func_hlist *hlist;
+
+ if (!ftrace_graph_count)
+ return 0;
+
+ hlist = &__get_cpu_var(func_hlist_cpu);
+
+ rec = function_find_hlist_node(hlist, addr);
+ if (!rec) {
+ /*
+ * TODO: send a retrieval error event
+ * to keep track of this.
+ */
+ rec = function_hlist_record_alloc(hlist, addr);
+ if (!rec)
+ return 0;
+ }
+
+ if (rec->graph_start)
+ return 1;
+
+ return 0;
+}
+
int trace_graph_entry(struct ftrace_graph_ent *trace)
{
struct trace_array *tr = graph_array;
@@ -294,10 +322,20 @@ static int graph_trace_init(struct trace_array *tr)
int ret;
set_graph_array(tr);
+ ret = get_function_hlist();
+ if (ret)
+ return ret;
+
+ function_hlist_reset_graph();
+ set_graph_functions();
+
ret = register_ftrace_graph(&trace_graph_return,
&trace_graph_entry);
- if (ret)
+ if (ret) {
+ put_function_hlist();
return ret;
+ }
+
tracing_start_cmdline_record();
return 0;
@@ -307,6 +345,7 @@ static void graph_trace_reset(struct trace_array *tr)
{
tracing_stop_cmdline_record();
unregister_ftrace_graph();
+ put_function_hlist();
}
static int max_bytes_for_cpu;
--
1.6.2.3
next prev parent reply other threads:[~2010-01-22 1:17 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-22 1:16 [RFC PATCH 00/10] Ftrace functions hashlist Frederic Weisbecker
2010-01-22 1:16 ` [RFC PATCH 01/10] ftrace: Generalize the function hashlist from function profiler Frederic Weisbecker
2010-01-22 1:16 ` [RFC PATCH 02/10] ftrace: Ensure tracing has really stopped before leaving unregister_ftrace_graph Frederic Weisbecker
2010-01-22 1:51 ` Steven Rostedt
2010-01-22 2:04 ` Frederic Weisbecker
2010-01-22 1:16 ` [RFC PATCH 03/10] ftrace: Drop the ftrace_profile_enabled checks in tracing hot path Frederic Weisbecker
2010-01-22 2:05 ` Steven Rostedt
2010-01-22 2:28 ` Mathieu Desnoyers
2010-01-22 3:12 ` Steven Rostedt
2010-01-22 4:09 ` Mathieu Desnoyers
2010-01-22 4:52 ` Steven Rostedt
2010-01-22 12:34 ` Mathieu Desnoyers
2010-01-22 14:54 ` Masami Hiramatsu
2010-01-25 20:58 ` Frederic Weisbecker
2010-01-25 22:14 ` Masami Hiramatsu
2010-01-26 0:41 ` Frederic Weisbecker
2010-01-26 1:13 ` Mathieu Desnoyers
2010-01-26 1:37 ` Masami Hiramatsu
2010-01-27 21:55 ` [PATCH tracing/kprobes] kprobes: Disable booster when CONFIG_PREEMPT=y Masami Hiramatsu
2010-01-28 1:08 ` Mathieu Desnoyers
2010-01-28 4:21 ` Ananth N Mavinakayanahalli
2010-01-29 9:21 ` Ingo Molnar
2010-01-29 11:30 ` Peter Zijlstra
2010-01-29 14:52 ` Masami Hiramatsu
2010-01-29 17:08 ` Mathieu Desnoyers
2010-01-29 17:15 ` Peter Zijlstra
2010-01-29 17:27 ` Mathieu Desnoyers
2010-01-29 17:32 ` Masami Hiramatsu
2010-01-22 2:43 ` [RFC PATCH 03/10] ftrace: Drop the ftrace_profile_enabled checks in tracing hot path Frederic Weisbecker
2010-01-22 3:05 ` Steven Rostedt
2010-01-25 20:52 ` Frederic Weisbecker
2010-01-22 1:16 ` [RFC PATCH 04/10] ftrace: Ensure buffers are visibles to tracing callbacks right away Frederic Weisbecker
2010-01-22 1:16 ` [RFC PATCH 05/10] ftrace: Drop buffer check in function profiler callbacks Frederic Weisbecker
2010-01-25 6:17 ` Lai Jiangshan
2010-01-30 20:47 ` Frederic Weisbecker
2010-01-22 1:16 ` [RFC PATCH 06/10] ftrace: Release the function hlist if we don't need it anymore Frederic Weisbecker
2010-01-25 6:41 ` Lai Jiangshan
2010-01-30 21:14 ` Frederic Weisbecker
2010-01-22 1:16 ` [RFC PATCH 07/10] ftrace: Make the function hashlist concurrently usable Frederic Weisbecker
2010-01-22 1:16 ` [PATCH 08/10] tracing: Simplify test for function_graph tracing Frederic Weisbecker
2010-01-22 1:16 ` Frederic Weisbecker [this message]
2010-01-25 8:50 ` [RFC PATCH 09/10] tracing: Use the hashlist for graph function Lai Jiangshan
2010-01-30 21:19 ` Frederic Weisbecker
2010-01-22 1:16 ` [RFC PATCH 10/10] ftrace: Factorize search and insertion in the function hashlist Frederic Weisbecker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1264122982-1553-10-git-send-regression-fweisbec@gmail.com \
--to=fweisbec@gmail.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lizf@cn.fujitsu.com \
--cc=mingo@elte.hu \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®