|
@@ -31,9 +31,18 @@ static int perf_trace_event_perm(struct ftrace_event_call *tp_event,
|
|
|
}
|
|
|
|
|
|
/* The ftrace function trace is allowed only for root. */
|
|
|
- if (ftrace_event_is_function(tp_event) &&
|
|
|
- perf_paranoid_tracepoint_raw() && !capable(CAP_SYS_ADMIN))
|
|
|
- return -EPERM;
|
|
|
+ if (ftrace_event_is_function(tp_event)) {
|
|
|
+ if (perf_paranoid_tracepoint_raw() && !capable(CAP_SYS_ADMIN))
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We don't allow user space callchains for function trace
|
|
|
+ * event, due to issues with page faults while tracing page
|
|
|
+ * fault handler and its overall trickiness nature.
|
|
|
+ */
|
|
|
+ if (!p_event->attr.exclude_callchain_user)
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
|
|
|
/* No tracing, just counting, so no obvious leak */
|
|
|
if (!(p_event->attr.sample_type & PERF_SAMPLE_RAW))
|