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 06/10] ftrace: Release the function hlist if we don't need it anymore
Date: Fri, 22 Jan 2010 02:16:18 +0100 [thread overview]
Message-ID: <1264122982-1553-7-git-send-regression-fweisbec@gmail.com> (raw)
In-Reply-To: <1264122982-1553-1-git-send-regression-fweisbec@gmail.com>
After we disable the function profiler, the function hashlist
stays in memory. This is wasteful as nobody needs it anymore,
until the next use if any.
Release it when we disable the function profiler instead of
resetting it in the next use.
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 | 1 +
kernel/trace/functions_hlist.c | 61 +++++++++++++++++-----------------------
kernel/trace/functions_hlist.h | 1 +
3 files changed, 28 insertions(+), 35 deletions(-)
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index dfd8f7c..0ded01c 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -509,6 +509,7 @@ ftrace_profile_write(struct file *filp, const char __user *ubuf,
* so this acts like an synchronize_sched.
*/
unregister_ftrace_profiler();
+ function_hlist_release();
}
}
out:
diff --git a/kernel/trace/functions_hlist.c b/kernel/trace/functions_hlist.c
index 37804c4..c79c4c5 100644
--- a/kernel/trace/functions_hlist.c
+++ b/kernel/trace/functions_hlist.c
@@ -21,20 +21,23 @@ DEFINE_PER_CPU(struct func_hlist, func_hlist_cpu);
int functions_hash_bits __read_mostly;
-static void function_hlist_reset(struct func_hlist *hlist)
+static void __function_hlist_release(struct func_hlist *hlist)
{
- struct func_hlist_page *pg;
-
- pg = hlist->pages = hlist->start;
+ struct func_hlist_page *pg = hlist->start;
while (pg) {
- memset(pg->records, 0, FUNCTIONS_RECORDS_SIZE);
- pg->index = 0;
+ unsigned long tmp = (unsigned long)pg;
+
pg = pg->next;
+ free_page(tmp);
}
- memset(hlist->hash, 0,
- FUNCTIONS_HLIST_SIZE * sizeof(struct hlist_head));
+ free_page((unsigned long)hlist->pages);
+ hlist->pages = NULL;
+ hlist->start = NULL;
+
+ kfree(hlist->hash);
+ hlist->hash = NULL;
}
static int function_hlist_pages_init(struct func_hlist *hlist)
@@ -44,10 +47,6 @@ static int function_hlist_pages_init(struct func_hlist *hlist)
int pages;
int i;
- /* If we already allocated, do nothing */
- if (hlist->pages)
- return 0;
-
hlist->pages = (void *)get_zeroed_page(GFP_KERNEL);
if (!hlist->pages)
return -ENOMEM;
@@ -72,26 +71,11 @@ static int function_hlist_pages_init(struct func_hlist *hlist)
for (i = 0; i < pages; i++) {
pg->next = (void *)get_zeroed_page(GFP_KERNEL);
if (!pg->next)
- goto out_free;
+ return -ENOMEM;
pg = pg->next;
}
return 0;
-
- out_free:
- pg = hlist->start;
- while (pg) {
- unsigned long tmp = (unsigned long)pg;
-
- pg = pg->next;
- free_page(tmp);
- }
-
- free_page((unsigned long)hlist->pages);
- hlist->pages = NULL;
- hlist->start = NULL;
-
- return -ENOMEM;
}
static int function_hlist_init_cpu(int cpu)
@@ -101,11 +85,8 @@ static int function_hlist_init_cpu(int cpu)
hlist = &per_cpu(func_hlist_cpu, cpu);
- if (hlist->hash) {
- /* If the profile is already created, simply reset it */
- function_hlist_reset(hlist);
- return 0;
- }
+ if (WARN_ON_ONCE(hlist->hash))
+ return -EBUSY;
/*
* We are profiling all functions, but usually only a few thousand
@@ -127,14 +108,24 @@ static int function_hlist_init_cpu(int cpu)
/* Preallocate the function profiling pages */
if (function_hlist_pages_init(hlist) < 0) {
- kfree(hlist->hash);
- hlist->hash = NULL;
+ __function_hlist_release(hlist);
return -ENOMEM;
}
return 0;
}
+void function_hlist_release(void)
+{
+ int cpu;
+ struct func_hlist *hlist;
+
+ for_each_online_cpu(cpu) {
+ hlist = &per_cpu(func_hlist_cpu, cpu);
+ __function_hlist_release(hlist);
+ }
+}
+
int function_hlist_init(void)
{
int cpu;
diff --git a/kernel/trace/functions_hlist.h b/kernel/trace/functions_hlist.h
index 3f4e485..8001f95 100644
--- a/kernel/trace/functions_hlist.h
+++ b/kernel/trace/functions_hlist.h
@@ -36,3 +36,4 @@ struct func_node *
function_hlist_record_alloc(struct func_hlist *hlist, unsigned long ip);
int function_hlist_init(void);
+void function_hlist_release(void);
--
1.6.2.3
next prev parent reply other threads:[~2010-01-22 1:16 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 ` Frederic Weisbecker [this message]
2010-01-25 6:41 ` [RFC PATCH 06/10] ftrace: Release the function hlist if we don't need it anymore 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 ` [RFC PATCH 09/10] tracing: Use the hashlist for graph function Frederic Weisbecker
2010-01-25 8:50 ` 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-7-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®