On Wed, Mar 09, 2016 at 09:46:42PM +0100, Jiri Olsa wrote: > We suppress events with attr::exclude_kernel set when > the event is generated, so following capture will > give no warning but won't produce any data: > > $ sudo perf record -e sched:sched_switch:u ls > $ sudo /perf script | wc -l > 0 > > Checking the attr::exclude_(kernel|user) at the event > init time and failing right away for tracepoints from > uprobes/kprobes and native ones: > > $ sudo perf record -e sched:sched_switch:u ls > Error: > The sys_perf_event_open() syscall returned with 22 (Invalid argument) for > event (sched:sched_switch). > /bin/dmesg may provide additional information. > No CONFIG_PERF_EVENTS=y kernel support configured? > > $ sudo perf record -e probe:sys_read:u ls > Error: > The sys_perf_event_open() syscall returned with 22 (Invalid argument) for > event (probe:sys_read). > /bin/dmesg may provide additional information. > No CONFIG_PERF_EVENTS=y kernel support configured? > > $ ./perf record -e probe_ex:main:k ./ex > Error: > The sys_perf_event_open() syscall returned with 22 (Invalid argument) for > event (probe_ex:main). > /bin/dmesg may provide additional information. > No CONFIG_PERF_EVENTS=y kernel support configured? > > Signed-off-by: Jiri Olsa <jo...@kernel.org>
Acked-by: Namhyung Kim <namhy...@kernel.org> Maybe we need to improve the error message later. Thanks, Namhyung > --- > kernel/events/core.c | 5 ----- > kernel/trace/trace_event_perf.c | 25 +++++++++++++++++++++++++ > 2 files changed, 25 insertions(+), 5 deletions(-) > > diff --git a/kernel/events/core.c b/kernel/events/core.c > index c15fd097af93..ca68fdcf47ce 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -6898,11 +6898,6 @@ static int perf_tp_event_match(struct perf_event > *event, > { > if (event->hw.state & PERF_HES_STOPPED) > return 0; > - /* > - * All tracepoints are from kernel-space. > - */ > - if (event->attr.exclude_kernel) > - return 0; > > if (!perf_tp_filter_match(event, data)) > return 0; > diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c > index a7171ec2c1ca..0a3779bd18a1 100644 > --- a/kernel/trace/trace_event_perf.c > +++ b/kernel/trace/trace_event_perf.c > @@ -182,11 +182,36 @@ static void perf_trace_event_close(struct perf_event > *p_event) > tp_event->class->reg(tp_event, TRACE_REG_PERF_CLOSE, p_event); > } > > +static int perf_trace_event_attr(struct trace_event_call *tp_event, > + struct perf_event *event) > +{ > + /* > + * All tracepoints and kprobes are from kernel-space. > + */ > + if (((tp_event->flags & TRACE_EVENT_FL_TRACEPOINT) || > + (tp_event->flags & TRACE_EVENT_FL_KPROBE)) && > + event->attr.exclude_kernel) > + return -EINVAL; > + > + /* > + * All uprobes are from user-space. > + */ > + if ((tp_event->flags & TRACE_EVENT_FL_UPROBE) && > + event->attr.exclude_user) > + return -EINVAL; > + > + return 0; > +} > + > static int perf_trace_event_init(struct trace_event_call *tp_event, > struct perf_event *p_event) > { > int ret; > > + ret = perf_trace_event_attr(tp_event, p_event); > + if (ret) > + return ret; > + > ret = perf_trace_event_perm(tp_event, p_event); > if (ret) > return ret; > -- > 2.4.3 >