diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2018-08-28 16:39:11 -0300 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2018-08-30 15:52:20 -0300 |
commit | 24a6c2cd1dbd85bd5624a6d0b05de891d0f07696 (patch) | |
tree | 8dde40fc6b2f2c742f722c02766872faa4ca645e /tools/perf/examples | |
parent | d5a7e6613b00d46a4971e8b69e18e2cfd7b00df3 (diff) |
perf trace augmented_syscalls: Add augmented_sockaddr_syscall_enter()
From the one for 'connect', so that we can use it with sendto and others
that receive a 'struct sockaddr'.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-8bdqv1q0ndcjl1nqns5r5je2@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/examples')
-rw-r--r-- | tools/perf/examples/bpf/augmented_syscalls.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/tools/perf/examples/bpf/augmented_syscalls.c b/tools/perf/examples/bpf/augmented_syscalls.c index 6dfead0be74e..5f417e528419 100644 --- a/tools/perf/examples/bpf/augmented_syscalls.c +++ b/tools/perf/examples/bpf/augmented_syscalls.c @@ -95,6 +95,31 @@ struct syscall_enter_newstat_args { augmented_filename_syscall_enter(newstat); +#ifndef _K_SS_MAXSIZE +#define _K_SS_MAXSIZE 128 +#endif + +#define augmented_sockaddr_syscall_enter(syscall) \ +struct augmented_enter_##syscall##_args { \ + struct syscall_enter_##syscall##_args args; \ + struct sockaddr_storage addr; \ +}; \ +int syscall_enter(syscall)(struct syscall_enter_##syscall##_args *args) \ +{ \ + struct augmented_enter_##syscall##_args augmented_args; \ + unsigned long addrlen = sizeof(augmented_args.addr); \ + probe_read(&augmented_args.args, sizeof(augmented_args.args), args); \ +/* FIXME_CLANG_OPTIMIZATION_THAT_ACCESSES_USER_CONTROLLED_ADDRLEN_DESPITE_THIS_CHECK */ \ +/* if (addrlen > augmented_args.args.addrlen) */ \ +/* addrlen = augmented_args.args.addrlen; */ \ +/* */ \ + probe_read(&augmented_args.addr, addrlen, args->addr_ptr); \ + perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, \ + &augmented_args, \ + sizeof(augmented_args) - sizeof(augmented_args.addr) + addrlen); \ + return 0; \ +} + struct sockaddr; struct syscall_enter_connect_args { @@ -105,25 +130,6 @@ struct syscall_enter_connect_args { unsigned long addrlen; }; -struct augmented_enter_connect_args { - struct syscall_enter_connect_args args; - struct sockaddr_storage addr; -}; - -int syscall_enter(connect)(struct syscall_enter_connect_args *args) -{ - struct augmented_enter_connect_args augmented_args; - unsigned long addrlen = sizeof(augmented_args.addr); - - probe_read(&augmented_args.args, sizeof(augmented_args.args), args); -#ifdef FIXME_CLANG_OPTIMIZATION_THAT_ACCESSES_USER_CONTROLLED_ADDRLEN_DESPITE_THIS_CHECK - if (addrlen > augmented_args.args.addrlen) - addrlen = augmented_args.args.addrlen; -#endif - probe_read(&augmented_args.addr, addrlen, args->addr_ptr); - perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, &augmented_args, - sizeof(augmented_args) - sizeof(augmented_args.addr) + addrlen); - return 0; -} +augmented_sockaddr_syscall_enter(connect); license(GPL); |