linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org
Cc: Ingo Molnar <mingo@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	Francis Deslauriers <francis.deslauriers@efficios.com>
Subject: [for-next][PATCH 11/34] tracing: kprobes: Prohibit probing on notrace function
Date: Sat, 11 Aug 2018 09:49:39 -0400	[thread overview]
Message-ID: <20180811135012.738120829@goodmis.org> (raw)
In-Reply-To: 20180811134928.034373761@goodmis.org

From: Masami Hiramatsu <mhiramat@kernel.org>

Prohibit kprobe-events probing on notrace functions.  Since probing on a
notrace function can cause a recursive event call. In most cases those are just
skipped, but in some cases it falls into an infinite recursive call.

This protection can be disabled by the kconfig
CONFIG_KPROBE_EVENTS_ON_NOTRACE=y, but it is highly recommended to keep it
"n" for normal kernel builds.  Note that this is only available if "kprobes on
ftrace" has been implemented on the target arch and CONFIG_KPROBES_ON_FTRACE=y.

Link: http://lkml.kernel.org/r/153294601436.32740.10557881188933661239.stgit@devbox

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Tested-by: Francis Deslauriers <francis.deslauriers@efficios.com>
[ Slight grammar and spelling fixes ]
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
 kernel/trace/Kconfig        | 20 ++++++++++++++++
 kernel/trace/trace_kprobe.c | 47 ++++++++++++++++++++++++++++++-------
 2 files changed, 58 insertions(+), 9 deletions(-)

diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
index e15fadbe5dfb..4d4eb15cc7fd 100644
--- a/kernel/trace/Kconfig
+++ b/kernel/trace/Kconfig
@@ -456,6 +456,26 @@ config KPROBE_EVENTS
 	  This option is also required by perf-probe subcommand of perf tools.
 	  If you want to use perf tools, this option is strongly recommended.
 
+config KPROBE_EVENTS_ON_NOTRACE
+	bool "Do NOT protect notrace function from kprobe events"
+	depends on KPROBE_EVENTS
+	depends on KPROBES_ON_FTRACE
+	default n
+	help
+	  This is only for the developers who want to debug ftrace itself
+	  using kprobe events.
+
+	  If kprobes can use ftrace instead of breakpoint, ftrace related
+	  functions are protected from kprobe-events to prevent an infinit
+	  recursion or any unexpected execution path which leads to a kernel
+	  crash.
+
+	  This option disables such protection and allows you to put kprobe
+	  events on ftrace functions for debugging ftrace by itself.
+	  Note that this might let you shoot yourself in the foot.
+
+	  If unsure, say N.
+
 config UPROBE_EVENTS
 	bool "Enable uprobes-based dynamic events"
 	depends on ARCH_SUPPORTS_UPROBES
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 0534eb8b7640..25662a780fdf 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -87,6 +87,21 @@ static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk)
 	return nhit;
 }
 
+static nokprobe_inline
+unsigned long trace_kprobe_address(struct trace_kprobe *tk)
+{
+	unsigned long addr;
+
+	if (tk->symbol) {
+		addr = (unsigned long)
+			kallsyms_lookup_name(trace_kprobe_symbol(tk));
+		addr += tk->rp.kp.offset;
+	} else {
+		addr = (unsigned long)tk->rp.kp.addr;
+	}
+	return addr;
+}
+
 bool trace_kprobe_on_func_entry(struct trace_event_call *call)
 {
 	struct trace_kprobe *tk = (struct trace_kprobe *)call->data;
@@ -99,16 +114,8 @@ bool trace_kprobe_on_func_entry(struct trace_event_call *call)
 bool trace_kprobe_error_injectable(struct trace_event_call *call)
 {
 	struct trace_kprobe *tk = (struct trace_kprobe *)call->data;
-	unsigned long addr;
 
-	if (tk->symbol) {
-		addr = (unsigned long)
-			kallsyms_lookup_name(trace_kprobe_symbol(tk));
-		addr += tk->rp.kp.offset;
-	} else {
-		addr = (unsigned long)tk->rp.kp.addr;
-	}
-	return within_error_injection_list(addr);
+	return within_error_injection_list(trace_kprobe_address(tk));
 }
 
 static int register_kprobe_event(struct trace_kprobe *tk);
@@ -504,6 +511,22 @@ disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
 	return ret;
 }
 
+#if defined(CONFIG_KPROBES_ON_FTRACE) && \
+	!defined(CONFIG_KPROBE_EVENTS_ON_NOTRACE)
+static bool within_notrace_func(struct trace_kprobe *tk)
+{
+	unsigned long offset, size, addr;
+
+	addr = trace_kprobe_address(tk);
+	if (!kallsyms_lookup_size_offset(addr, &size, &offset))
+		return true;	/* Out of range. */
+
+	return !ftrace_location_range(addr - offset, addr - offset + size);
+}
+#else
+#define within_notrace_func(tk)	(false)
+#endif
+
 /* Internal register function - just handle k*probes and flags */
 static int __register_trace_kprobe(struct trace_kprobe *tk)
 {
@@ -512,6 +535,12 @@ static int __register_trace_kprobe(struct trace_kprobe *tk)
 	if (trace_probe_is_registered(&tk->tp))
 		return -EINVAL;
 
+	if (within_notrace_func(tk)) {
+		pr_warn("Could not probe notrace function %s\n",
+			trace_kprobe_symbol(tk));
+		return -EINVAL;
+	}
+
 	for (i = 0; i < tk->tp.nr_args; i++)
 		traceprobe_update_arg(&tk->tp.args[i]);
 
-- 
2.18.0



  parent reply	other threads:[~2018-08-11 13:52 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-11 13:49 [for-next][PATCH 00/34] tracing: My official queue finally passed testing and ready for linux-next Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 01/34] srcu: Add notrace variants of srcu_read_{lock,unlock} Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 02/34] srcu: Add notrace variant of srcu_dereference Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 03/34] tracing/irqsoff: Split reset into separate functions Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 04/34] lib: Add module for testing preemptoff/irqsoff latency tracers Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 05/34] kselftests: Add tests for the preemptoff and irqsoff tracers Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 06/34] tracing: Make unregister_trigger() static Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 07/34] tracing: Remove orphaned function using_ftrace_ops_list_func() Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 08/34] tracing: Remove orphaned function ftrace_nr_registered_ops() Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 09/34] tracing/kprobes: Simplify the logic of enable_trace_kprobe() Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 10/34] tracing: preemptirq_delay_run() can be static Steven Rostedt
2018-08-11 13:49 ` Steven Rostedt [this message]
2018-08-11 13:49 ` [for-next][PATCH 12/34] selftest/ftrace: Move kprobe selftest function to separate compile unit Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 13/34] selftests/ftrace: Fix kprobe string testcase to not probe notrace function Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 14/34] lockdep: Use this_cpu_ptr instead of get_cpu_var stats Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 15/34] tracepoint: Make rcuidle tracepoint callers use SRCU Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 16/34] tracing: Centralize preemptirq tracepoints and unify their usage Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 17/34] tracefs: Annotate tracefs_ops with __ro_after_init Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 18/34] tracing: Do not call start/stop() functions when tracing_on does not change Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 19/34] ftrace: Add missing check for existing hwlat thread Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 20/34] tracing: Do a WARN_ON() if start_thread() in hwlat is called when thread exists Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 21/34] tracing: Make tracer_tracing_is_on() return bool Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 22/34] ring-buffer: Make ring_buffer_record_is_on() " Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 23/34] ring-buffer: Make ring_buffer_record_is_set_on() " Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 24/34] ftrace: Use true and false for boolean values in ops_references_rec() Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 25/34] tracing/kprobes: Fix within_notrace_func() to check only notrace functions Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 26/34] trace: Use rcu_dereference_raw for hooks from trace-event subsystem Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 27/34] tracing: irqsoff: Account for additional preempt_disable Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 28/34] tracing: Partial revert of "tracing: Centralize preemptirq tracepoints and unify their usage" Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 29/34] tracing/irqsoff: Handle preempt_count for different configs Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 30/34] tracing: More reverting of "tracing: Centralize preemptirq tracepoints and unify their usage" Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 31/34] ftrace: Remove unused pointer ftrace_swapper_pid Steven Rostedt
2018-08-11 13:50 ` [for-next][PATCH 32/34] tracing: Fix synchronizing to event changes with tracepoint_synchronize_unregister() Steven Rostedt
2018-08-11 13:50 ` [for-next][PATCH 33/34] uprobes: Use synchronize_rcu() not synchronize_sched() Steven Rostedt
2018-08-11 13:50 ` [for-next][PATCH 34/34] tracepoints: Free early tracepoints after RCU is initialized 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=20180811135012.738120829@goodmis.org \
    --to=rostedt@goodmis.org \
    --cc=akpm@linux-foundation.org \
    --cc=francis.deslauriers@efficios.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mingo@kernel.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;
as well as URLs for NNTP newsgroup(s).