public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org
Cc: Ingo Molnar <mingo@elte.hu>,
	Andrew Morton <akpm@linux-foundation.org>,
	Frederic Weisbecker <fweisbec@gmail.com>
Subject: [PATCH 10/10] ftrace: do not profile functions when disabled
Date: Tue, 02 Jun 2009 00:43:25 -0400	[thread overview]
Message-ID: <20090602044341.348255521@goodmis.org> (raw)
In-Reply-To: 20090602044315.439593107@goodmis.org

[-- Attachment #1: 0010-ftrace-do-not-profile-functions-when-disabled.patch --]
[-- Type: text/plain, Size: 1989 bytes --]

From: Steven Rostedt <srostedt@redhat.com>

A race was found that if one were to enable and disable the function
profiler repeatedly, then the system can panic. This was because a profiled
function may be preempted just before disabling interrupts. While
the profiler is disabled and then reenabled, the preempted function
could start again, and access the hash as it is being initialized.

This just adds a check in the irq disabled part to check if the profiler
is enabled, and if it is not then it will just exit.

When the system is disabled, the profile_enabled variable is cleared
before calling the unregistering of the function profiler. This
unregistering calls stop machine which also acts as a synchronize schedule.

[ Impact: fix panic in enabling/disabling function profiler ]

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
 kernel/trace/ftrace.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 2074e5b..d6973df 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -599,7 +599,7 @@ function_profile_call(unsigned long ip, unsigned long parent_ip)
 	local_irq_save(flags);
 
 	stat = &__get_cpu_var(ftrace_profile_stats);
-	if (!stat->hash)
+	if (!stat->hash || !ftrace_profile_enabled)
 		goto out;
 
 	rec = ftrace_find_profiled_func(stat, ip);
@@ -630,7 +630,7 @@ static void profile_graph_return(struct ftrace_graph_ret *trace)
 
 	local_irq_save(flags);
 	stat = &__get_cpu_var(ftrace_profile_stats);
-	if (!stat->hash)
+	if (!stat->hash || !ftrace_profile_enabled)
 		goto out;
 
 	calltime = trace->rettime - trace->calltime;
@@ -724,6 +724,10 @@ ftrace_profile_write(struct file *filp, const char __user *ubuf,
 			ftrace_profile_enabled = 1;
 		} else {
 			ftrace_profile_enabled = 0;
+			/*
+			 * unregister_ftrace_profiler calls stop_machine
+			 * so this acts like an synchronize_sched.
+			 */
 			unregister_ftrace_profiler();
 		}
 	}
-- 
1.6.3.1

-- 

  parent reply	other threads:[~2009-06-02  4:45 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-02  4:43 [PATCH 00/10] [GIT PULL] tracing: various updates Steven Rostedt
2009-06-02  4:43 ` [PATCH 01/10] ftrace: add kernel command line function filtering Steven Rostedt
2009-06-02  4:43 ` [PATCH 02/10] tracing: fix config options to not show when automatically selected Steven Rostedt
2009-06-02  4:43 ` [PATCH 03/10] tracing: combine the default tracers into one config Steven Rostedt
2009-06-02  4:43 ` [PATCH 04/10] tracing/events: fix a typo in __string() format output Steven Rostedt
2009-06-02  4:43 ` [PATCH 05/10] tracing/events: put TP_fast_assign into braces Steven Rostedt
2009-06-02  4:43 ` [PATCH 06/10] tracing/events: introduce __dynamic_array() Steven Rostedt
2009-06-02  4:43 ` [PATCH 07/10] tracing: add exports to use __print_symbolic and __print_flags from a module Steven Rostedt
2009-06-02  4:43 ` [PATCH 08/10] tracing: remove redundant SOFTIRQ from softirq event traces Steven Rostedt
2009-06-02  4:43 ` [PATCH 09/10] tracing: make trace pipe recognize latency format flag Steven Rostedt
2009-06-02  4:43 ` Steven Rostedt [this message]
2009-06-02  8:30 ` [PATCH 00/10] [GIT PULL] tracing: various updates Ingo Molnar
2009-06-02  9:28   ` Ingo Molnar
2009-06-02 12:51     ` Steven Rostedt

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=20090602044341.348255521@goodmis.org \
    --to=rostedt@goodmis.org \
    --cc=akpm@linux-foundation.org \
    --cc=fweisbec@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    /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