Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf trace: Introduce augmented_filename_syscall_enter() declarator

Helping with tons of boilerplate for syscalls that only want to augment
a filename. Now supporting one such syscall is just a matter of
declaring its arguments struct + using:

augmented_filename_syscall_enter(openat);

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-ls7ojdseu8fxw7fvj77ejpao@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

+23 -55
+23 -55
tools/perf/examples/bpf/augmented_syscalls.c
··· 33 33 char value[256]; 34 34 }; 35 35 36 + #define augmented_filename_syscall_enter(syscall) \ 37 + struct augmented_enter_##syscall##_args { \ 38 + struct syscall_enter_##syscall##_args args; \ 39 + struct augmented_filename filename; \ 40 + }; \ 41 + int syscall_enter(syscall)(struct syscall_enter_##syscall##_args *args) \ 42 + { \ 43 + struct augmented_enter_##syscall##_args augmented_args = { .filename.reserved = 0, }; \ 44 + probe_read(&augmented_args.args, sizeof(augmented_args.args), args); \ 45 + augmented_args.filename.size = probe_read_str(&augmented_args.filename.value, \ 46 + sizeof(augmented_args.filename.value), \ 47 + args->filename_ptr); \ 48 + perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, \ 49 + &augmented_args, \ 50 + (sizeof(augmented_args) - sizeof(augmented_args.filename.value) + \ 51 + augmented_args.filename.size)); \ 52 + return 0; \ 53 + } 54 + 36 55 struct syscall_enter_openat_args { 37 56 unsigned long long common_tp_fields; 38 57 long syscall_nr; ··· 61 42 long mode; 62 43 }; 63 44 64 - struct augmented_enter_openat_args { 65 - struct syscall_enter_openat_args args; 66 - struct augmented_filename filename; 67 - }; 68 - 69 - int syscall_enter(openat)(struct syscall_enter_openat_args *args) 70 - { 71 - struct augmented_enter_openat_args augmented_args = { .filename.reserved = 0, }; 72 - 73 - probe_read(&augmented_args.args, sizeof(augmented_args.args), args); 74 - augmented_args.filename.size = probe_read_str(&augmented_args.filename.value, 75 - sizeof(augmented_args.filename.value), 76 - args->filename_ptr); 77 - perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, 78 - &augmented_args, 79 - sizeof(augmented_args) - sizeof(augmented_args.filename.value) + augmented_args.filename.size); 80 - return 0; 81 - } 45 + augmented_filename_syscall_enter(openat); 82 46 83 47 struct syscall_enter_open_args { 84 48 unsigned long long common_tp_fields; ··· 71 69 long mode; 72 70 }; 73 71 74 - struct augmented_enter_open_args { 75 - struct syscall_enter_open_args args; 76 - struct augmented_filename filename; 77 - }; 78 - 79 - int syscall_enter(open)(struct syscall_enter_open_args *args) 80 - { 81 - struct augmented_enter_open_args augmented_args = { .filename.reserved = 0, }; 82 - 83 - probe_read(&augmented_args.args, sizeof(augmented_args.args), args); 84 - augmented_args.filename.size = probe_read_str(&augmented_args.filename.value, 85 - sizeof(augmented_args.filename.value), 86 - args->filename_ptr); 87 - perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, 88 - &augmented_args, 89 - sizeof(augmented_args) - sizeof(augmented_args.filename.value) + augmented_args.filename.size); 90 - return 0; 91 - } 72 + augmented_filename_syscall_enter(open); 92 73 93 74 struct syscall_enter_inotify_add_watch_args { 94 75 unsigned long long common_tp_fields; 95 76 long syscall_nr; 96 77 long fd; 97 - char *pathname_ptr; 78 + char *filename_ptr; 98 79 long mask; 99 80 }; 100 81 101 - struct augmented_enter_inotify_add_watch_args { 102 - struct syscall_enter_inotify_add_watch_args args; 103 - struct augmented_filename pathname; 104 - }; 105 - 106 - int syscall_enter(inotify_add_watch)(struct syscall_enter_inotify_add_watch_args *args) 107 - { 108 - struct augmented_enter_inotify_add_watch_args augmented_args = { .pathname.reserved = 0, }; 109 - 110 - probe_read(&augmented_args.args, sizeof(augmented_args.args), args); 111 - augmented_args.pathname.size = probe_read_str(&augmented_args.pathname.value, 112 - sizeof(augmented_args.pathname.value), 113 - args->pathname_ptr); 114 - perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, 115 - &augmented_args, 116 - sizeof(augmented_args) - sizeof(augmented_args.pathname.value) + augmented_args.pathname.size); 117 - return 0; 118 - } 82 + augmented_filename_syscall_enter(inotify_add_watch); 119 83 120 84 license(GPL);