perf augmented_syscalls: Use pid_filter
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: ed9a77ba7703f7da8f106d241cd0c734f8664b4d Gitweb: https://git.kernel.org/tip/ed9a77ba7703f7da8f106d241cd0c734f8664b4d Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Tue, 6 Nov 2018 16:09:06 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 21 Nov 2018 12:00:31 -0300
perf augmented_syscalls: Use pid_filter
Just to test filtering a bunch of pids, now its time to go and get that hooked up in 'perf trace', right after we load the bpf program, if we find a "pids_filtered" map defined, we'll populate it with the filtered pids.
Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/examples/bpf/augmented_raw_syscalls.c | 34 ++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-)
tools/perf/examples/bpf/augmented_raw_syscalls.c +32 -2
@@ -16,6 +16,7 @@#include <stdio.h> #include <unistd.h> +#include <pid_filter.h> /* bpf-output associated map */ struct bpf_map SEC("maps") __augmented_syscalls__ = {
@@ -48,6 +49,29 @@ struct augmented_filename {#define SYS_POLL 7#define SYS_OPENAT 257 +pid_filter (pids_filtered); + +static void pid_filter__init (void ) +{ +/* +* Filter a bunch of pids: gnome-shell, kvm, firefox threads, +* avahi-daemon, etc, just for testing as we go along. +* +* These will come from 'perf trace --filter-pids' in a explicit way +* and also it will filter out itself, to avoid the feedback loop: +* syscalls 'perf trace' does gets caught, reported, causing new +* syscalls to get emitted, rinse repeat forever. +*/ +if (pid_filter__add (&pids_filtered,2971 )) +return ;/* pid_filter__init() was already called, bail out */ +pid_filter__add (&pids_filtered,20016 ); +pid_filter__add (&pids_filtered,12018 ); +pid_filter__add (&pids_filtered,2310 ); +pid_filter__add (&pids_filtered,3759 ); +pid_filter__add (&pids_filtered,25978 ); +pid_filter__add (&pids_filtered,883 ); +} + SEC("raw_syscalls:sys_enter")int sys_enter (struct syscall_enter_args *args) {
@@ -57,8 +81,14 @@ int sys_enter(struct syscall_enter_args *args) } augmented_args;unsigned int len =sizeof (augmented_args);const void *filename_arg =NULL ; +/* +* We still don't have a "main()" called first and only once +* call it always, it will exit as soon as it realizes the +* first hard coded filtered pid was already added. +*/ +pid_filter__init (); -if (getpid () ==2971 ) +if (pid_filter__has (&pids_filtered,getpid ()))return 0 ;probe_read (&augmented_args.args,sizeof (augmented_args.args), args);
@@ -132,7 +162,7 @@ int sys_enter(struct syscall_enter_args *args) SEC("raw_syscalls:sys_exit")int sys_exit (struct syscall_exit_args *args) { -return getpid () !=2971 ; +return !pid_filter__has (&pids_filtered,getpid ()); }license (GPL );