mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] tracing - enable records during the module load
@ 2009-10-10 14:00 jolsa
  2009-10-10 15:26 ` Steven Rostedt
  2009-10-10 15:29 ` Steven Rostedt
  0 siblings, 2 replies; 3+ messages in thread
From: jolsa @ 2009-10-10 14:00 UTC (permalink / raw)
  To: mingo, rostedt; +Cc: linux-kernel

I was debuging some module using "function" and "function_graph" tracers
and noticed, that if you load module after you enabled tracing, the module's
hooks will convert only to NOP instructions.

The attached patch enables modules' hooks if there's function
trace allready on, thus allowing to trace module functions.

wbr,
jirka


Signed-off-by: Jiri Olsa <jolsa@redhat.com>
---
 kernel/trace/ftrace.c |   38 ++++++++++++++++++++++++++++++--------
 1 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 1a7f6ab..1ab603b 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1261,12 +1261,34 @@ static int ftrace_update_code(struct module *mod)
 		ftrace_new_addrs = p->newlist;
 		p->flags = 0L;
 
-		/* convert record (i.e, patch mcount-call with NOP) */
-		if (ftrace_code_disable(mod, p)) {
-			p->flags |= FTRACE_FL_CONVERTED;
-			ftrace_update_cnt++;
-		} else
+		/*
+		 * Do the initial record convertion from mcount jump
+		 * to the NOP instructions.
+		 */
+		if (!ftrace_code_disable(mod, p)) {
 			ftrace_free_rec(p);
+			continue;
+		}
+
+		p->flags |= FTRACE_FL_CONVERTED;
+		ftrace_update_cnt++;
+
+		/*
+		 * If the tracing is enabled, go ahead and enable the record.
+		 *
+		 * The reason not to enable the record immediatelly is the
+		 * inherent check of ftrace_make_nop/ftrace_make_call for
+		 * correct previous instructions.  Making first the NOP
+		 * conversion puts the module to the correct state, thus
+		 * passing the ftrace_make_call check.
+		 */
+		if (ftrace_start_up) {
+			int failed = __ftrace_replace_code(p, 1);
+			if (failed) {
+				ftrace_bug(failed, p->ip);
+				ftrace_free_rec(p);
+			}
+		}
 	}
 
 	stop = ftrace_now(raw_smp_processor_id());
@@ -2570,7 +2592,7 @@ static __init int ftrace_init_dyn_debugfs(struct dentry *d_tracer)
 	return 0;
 }
 
-static int ftrace_convert_nops(struct module *mod,
+static int ftrace_process_locs(struct module *mod,
 			       unsigned long *start,
 			       unsigned long *end)
 {
@@ -2630,7 +2652,7 @@ static void ftrace_init_module(struct module *mod,
 {
 	if (ftrace_disabled || start == end)
 		return;
-	ftrace_convert_nops(mod, start, end);
+	ftrace_process_locs(mod, start, end);
 }
 
 static int ftrace_module_notify(struct notifier_block *self,
@@ -2691,7 +2713,7 @@ void __init ftrace_init(void)
 
 	last_ftrace_enabled = ftrace_enabled = 1;
 
-	ret = ftrace_convert_nops(NULL,
+	ret = ftrace_process_locs(NULL,
 				  __start_mcount_loc,
 				  __stop_mcount_loc);
 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] tracing - enable records during the module load
  2009-10-10 14:00 [PATCH] tracing - enable records during the module load jolsa
@ 2009-10-10 15:26 ` Steven Rostedt
  2009-10-10 15:29 ` Steven Rostedt
  1 sibling, 0 replies; 3+ messages in thread
From: Steven Rostedt @ 2009-10-10 15:26 UTC (permalink / raw)
  To: jolsa; +Cc: mingo, linux-kernel

On Sat, 2009-10-10 at 16:00 +0200, jolsa@redhat.com wrote:
> I was debuging some module using "function" and "function_graph" tracers
> and noticed, that if you load module after you enabled tracing, the module's
> hooks will convert only to NOP instructions.

Yeah, I knew when I wrote this that new modules loaded during tracing
would just be initialized as nops, and not become part of that trace.
They will become part of later traces if the function tracing is stopped
and started again.

Actually, I took that as a safety feature, since most bad things can
happen when modules load and unload. But, I think your patch is still
safe. I'll apply it, play with it a bit, then queue it up for 2.6.33.

Thanks,

-- Steve

> 
> The attached patch enables modules' hooks if there's function
> trace allready on, thus allowing to trace module functions.



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] tracing - enable records during the module load
  2009-10-10 14:00 [PATCH] tracing - enable records during the module load jolsa
  2009-10-10 15:26 ` Steven Rostedt
@ 2009-10-10 15:29 ` Steven Rostedt
  1 sibling, 0 replies; 3+ messages in thread
From: Steven Rostedt @ 2009-10-10 15:29 UTC (permalink / raw)
  To: jolsa; +Cc: mingo, linux-kernel

On Sat, 2009-10-10 at 16:00 +0200, jolsa@redhat.com wrote:

As a side note. Can you change your mailer to have your "From:" line
have "Jiri Olsa <jolsa@redhat.com>" instead of just "jolsa@redhat.com".
Unless you like just your email address set up as the author of the
code. The "git am" uses the From: line to assign authorship.

-- Steve



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2009-10-10 15:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-10-10 14:00 [PATCH] tracing - enable records during the module load jolsa
2009-10-10 15:26 ` Steven Rostedt
2009-10-10 15:29 ` Steven Rostedt

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®