linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [BUGFIX PATCH] tracing/kprobes: Fix to check notrace function with correct range
       [not found] <20180821212448.d20ea26fa998b206adf4ece6@kernel.org>
@ 2018-08-21 13:04 ` Masami Hiramatsu
  2018-08-21 13:42   ` Steven Rostedt
  0 siblings, 1 reply; 5+ messages in thread
From: Masami Hiramatsu @ 2018-08-21 13:04 UTC (permalink / raw)
  To: rostedt
  Cc: Francis Deslauriers, peterz, mhiramat, mathieu.desnoyers,
	linux-kernel, Michael Rodin, Ravi Bangoria, linux-perf-users,
	Arnaldo Carvalho de Melo

Fix within_notrace_func() to check notrace function correctly.

Since the ftrace_location_range(start, end) function checks
the range inclusively (start <= ftrace-loc <= end), the end
address must not include the entry address of next function.

However, within_notrace_func() uses kallsyms_lookup_size_offset()
to get the function size and calculate the end address from
adding the size to the entry address. This means the end address
is the entry address of the next function.

In the result, within_notrace_func() fails to find notrace
function if the next function of the target function is
ftraced.

Let's subtract 1 from the end address so that ftrace_location_range()
can check it correctly.

Fixes: commit 45408c4f9250 ("tracing: kprobes: Prohibit probing on notrace function")
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Reported-by: Michael Rodin <michael@rodin.online>
---
 kernel/trace/trace_kprobe.c |    9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 65a4157af851..ad384b31fe01 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -513,7 +513,14 @@ static bool within_notrace_func(struct trace_kprobe *tk)
 	if (!addr || !kallsyms_lookup_size_offset(addr, &size, &offset))
 		return false;
 
-	return !ftrace_location_range(addr - offset, addr - offset + size);
+	/* Get the entry address of the target function */
+	addr -= offset;
+
+	/*
+	 * Since ftrace_location_range() does inclusive range check, we need
+	 * to subtract 1 byte from the end address.
+	 */
+	return !ftrace_location_range(addr, addr + size - 1);
 }
 #else
 #define within_notrace_func(tk)	(false)


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

* Re: [BUGFIX PATCH] tracing/kprobes: Fix to check notrace function with correct range
  2018-08-21 13:04 ` [BUGFIX PATCH] tracing/kprobes: Fix to check notrace function with correct range Masami Hiramatsu
@ 2018-08-21 13:42   ` Steven Rostedt
  2018-08-22 12:58     ` Steven Rostedt
  0 siblings, 1 reply; 5+ messages in thread
From: Steven Rostedt @ 2018-08-21 13:42 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Francis Deslauriers, peterz, mathieu.desnoyers, linux-kernel,
	Michael Rodin, Ravi Bangoria, linux-perf-users,
	Arnaldo Carvalho de Melo

On Tue, 21 Aug 2018 22:04:57 +0900
Masami Hiramatsu <mhiramat@kernel.org> wrote:

> Fix within_notrace_func() to check notrace function correctly.
> 
> Since the ftrace_location_range(start, end) function checks
> the range inclusively (start <= ftrace-loc <= end), the end
> address must not include the entry address of next function.
> 
> However, within_notrace_func() uses kallsyms_lookup_size_offset()
> to get the function size and calculate the end address from
> adding the size to the entry address. This means the end address
> is the entry address of the next function.
> 
> In the result, within_notrace_func() fails to find notrace
> function if the next function of the target function is
> ftraced.
> 
> Let's subtract 1 from the end address so that ftrace_location_range()
> can check it correctly.
> 
> Fixes: commit 45408c4f9250 ("tracing: kprobes: Prohibit probing on notrace function")
> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> Reported-by: Michael Rodin <michael@rodin.online>
> ---
>

Applied. Thanks Masami! I'll start testing this and send it upstream
when it's finished.

-- Steve

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

* Re: [BUGFIX PATCH] tracing/kprobes: Fix to check notrace function with correct range
  2018-08-21 13:42   ` Steven Rostedt
@ 2018-08-22 12:58     ` Steven Rostedt
  2018-08-23  1:18       ` Masami Hiramatsu
  0 siblings, 1 reply; 5+ messages in thread
From: Steven Rostedt @ 2018-08-22 12:58 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Francis Deslauriers, peterz, mathieu.desnoyers, linux-kernel,
	Michael Rodin, Ravi Bangoria, linux-perf-users,
	Arnaldo Carvalho de Melo

On Tue, 21 Aug 2018 09:42:49 -0400
Steven Rostedt <rostedt@goodmis.org> wrote:

> On Tue, 21 Aug 2018 22:04:57 +0900
> Masami Hiramatsu <mhiramat@kernel.org> wrote:
> 
> > Fix within_notrace_func() to check notrace function correctly.
> > 
> > Since the ftrace_location_range(start, end) function checks
> > the range inclusively (start <= ftrace-loc <= end), the end
> > address must not include the entry address of next function.
> > 
> > However, within_notrace_func() uses kallsyms_lookup_size_offset()
> > to get the function size and calculate the end address from
> > adding the size to the entry address. This means the end address
> > is the entry address of the next function.
> > 
> > In the result, within_notrace_func() fails to find notrace
> > function if the next function of the target function is
> > ftraced.
> > 
> > Let's subtract 1 from the end address so that ftrace_location_range()
> > can check it correctly.
> > 
> > Fixes: commit 45408c4f9250 ("tracing: kprobes: Prohibit probing on notrace function")
> > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> > Reported-by: Michael Rodin <michael@rodin.online>
> > ---
> >  
> 
> Applied. Thanks Masami! I'll start testing this and send it upstream
> when it's finished.
> 

Hmm, this fix shows the extent of not tracing functions with notrace
attched much deeper. For one thing, we can't hook kprobes to the
__schedule() function (which is now what all the main schedule
functions call). One of my tests used this function to test kprobes and
it failed.

I'll push this to Linus, but I'm wondering if we want to perhaps add a
white list of functions marked "notrace" but still kprobes can trace?

-- Steve

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

* Re: [BUGFIX PATCH] tracing/kprobes: Fix to check notrace function with correct range
  2018-08-22 12:58     ` Steven Rostedt
@ 2018-08-23  1:18       ` Masami Hiramatsu
  2018-08-23  1:39         ` Steven Rostedt
  0 siblings, 1 reply; 5+ messages in thread
From: Masami Hiramatsu @ 2018-08-23  1:18 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Francis Deslauriers, peterz, mathieu.desnoyers, linux-kernel,
	Michael Rodin, Ravi Bangoria, linux-perf-users,
	Arnaldo Carvalho de Melo

On Wed, 22 Aug 2018 08:58:09 -0400
Steven Rostedt <rostedt@goodmis.org> wrote:

> On Tue, 21 Aug 2018 09:42:49 -0400
> Steven Rostedt <rostedt@goodmis.org> wrote:
> 
> > On Tue, 21 Aug 2018 22:04:57 +0900
> > Masami Hiramatsu <mhiramat@kernel.org> wrote:
> > 
> > > Fix within_notrace_func() to check notrace function correctly.
> > > 
> > > Since the ftrace_location_range(start, end) function checks
> > > the range inclusively (start <= ftrace-loc <= end), the end
> > > address must not include the entry address of next function.
> > > 
> > > However, within_notrace_func() uses kallsyms_lookup_size_offset()
> > > to get the function size and calculate the end address from
> > > adding the size to the entry address. This means the end address
> > > is the entry address of the next function.
> > > 
> > > In the result, within_notrace_func() fails to find notrace
> > > function if the next function of the target function is
> > > ftraced.
> > > 
> > > Let's subtract 1 from the end address so that ftrace_location_range()
> > > can check it correctly.
> > > 
> > > Fixes: commit 45408c4f9250 ("tracing: kprobes: Prohibit probing on notrace function")
> > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> > > Reported-by: Michael Rodin <michael@rodin.online>
> > > ---
> > >  
> > 
> > Applied. Thanks Masami! I'll start testing this and send it upstream
> > when it's finished.
> > 
> 
> Hmm, this fix shows the extent of not tracing functions with notrace
> attched much deeper. For one thing, we can't hook kprobes to the
> __schedule() function (which is now what all the main schedule
> functions call). One of my tests used this function to test kprobes and
> it failed.
> 
> I'll push this to Linus, but I'm wondering if we want to perhaps add a
> white list of functions marked "notrace" but still kprobes can trace?

Yes, that is what I'm thinking about. Maybe most of notrace function is
safe for kprobes (like __schedule()). And if it is really critical, those
functions must be marked by NOKPROBE_SYMBOL().

Thank you,

-- 
Masami Hiramatsu <mhiramat@kernel.org>

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

* Re: [BUGFIX PATCH] tracing/kprobes: Fix to check notrace function with correct range
  2018-08-23  1:18       ` Masami Hiramatsu
@ 2018-08-23  1:39         ` Steven Rostedt
  0 siblings, 0 replies; 5+ messages in thread
From: Steven Rostedt @ 2018-08-23  1:39 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Francis Deslauriers, peterz, mathieu.desnoyers, linux-kernel,
	Michael Rodin, Ravi Bangoria, linux-perf-users,
	Arnaldo Carvalho de Melo

On Thu, 23 Aug 2018 10:18:31 +0900
Masami Hiramatsu <mhiramat@kernel.org> wrote:

> On Wed, 22 Aug 2018 08:58:09 -0400
> Steven Rostedt <rostedt@goodmis.org> wrote:
> 
> > On Tue, 21 Aug 2018 09:42:49 -0400
> > Steven Rostedt <rostedt@goodmis.org> wrote:
> >   
> > > On Tue, 21 Aug 2018 22:04:57 +0900
> > > Masami Hiramatsu <mhiramat@kernel.org> wrote:
> > >   
> > > > Fix within_notrace_func() to check notrace function correctly.
> > > > 
> > > > Since the ftrace_location_range(start, end) function checks
> > > > the range inclusively (start <= ftrace-loc <= end), the end
> > > > address must not include the entry address of next function.
> > > > 
> > > > However, within_notrace_func() uses kallsyms_lookup_size_offset()
> > > > to get the function size and calculate the end address from
> > > > adding the size to the entry address. This means the end address
> > > > is the entry address of the next function.
> > > > 
> > > > In the result, within_notrace_func() fails to find notrace
> > > > function if the next function of the target function is
> > > > ftraced.
> > > > 
> > > > Let's subtract 1 from the end address so that ftrace_location_range()
> > > > can check it correctly.
> > > > 
> > > > Fixes: commit 45408c4f9250 ("tracing: kprobes: Prohibit probing on notrace function")
> > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> > > > Reported-by: Michael Rodin <michael@rodin.online>
> > > > ---
> > > >    
> > > 
> > > Applied. Thanks Masami! I'll start testing this and send it upstream
> > > when it's finished.
> > >   
> > 
> > Hmm, this fix shows the extent of not tracing functions with notrace
> > attched much deeper. For one thing, we can't hook kprobes to the
> > __schedule() function (which is now what all the main schedule
> > functions call). One of my tests used this function to test kprobes and
> > it failed.
> > 
> > I'll push this to Linus, but I'm wondering if we want to perhaps add a
> > white list of functions marked "notrace" but still kprobes can trace?  
> 
> Yes, that is what I'm thinking about. Maybe most of notrace function is
> safe for kprobes (like __schedule()). And if it is really critical, those
> functions must be marked by NOKPROBE_SYMBOL().
> 

Correct. This notrace was added because we want to not trace any
function call between preempt_schedule() and where NEED_RESCHED is
cleared. Because the function tracer does a preempt_enable_notrace()
which triggers the preempt_schedule() call again, and we can end up in
a recursive loop. But that is fixed, but by tracing __schedule() we do
a song and dance of calling preempt_schedule_notrace and makes the
trace output weird.

See commit 499d79559ffe4.

-- Steve

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

end of thread, other threads:[~2018-08-23  1:39 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20180821212448.d20ea26fa998b206adf4ece6@kernel.org>
2018-08-21 13:04 ` [BUGFIX PATCH] tracing/kprobes: Fix to check notrace function with correct range Masami Hiramatsu
2018-08-21 13:42   ` Steven Rostedt
2018-08-22 12:58     ` Steven Rostedt
2018-08-23  1:18       ` Masami Hiramatsu
2018-08-23  1:39         ` Steven Rostedt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).