Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-2.6-microblaze.git] / kernel / trace / trace_event_perf.c
index e854f42..c894614 100644 (file)
@@ -31,9 +31,25 @@ 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;
+
+               /*
+                * Same reason to disable user stack dump as for user space
+                * callchains above.
+                */
+               if (p_event->attr.sample_type & PERF_SAMPLE_STACK_USER)
+                       return -EINVAL;
+       }
 
        /* No tracing, just counting, so no obvious leak */
        if (!(p_event->attr.sample_type & PERF_SAMPLE_RAW))