* [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
@ 2024-07-05 13:20 ` Howard Chu
2024-07-12 16:51 ` Namhyung Kim
2024-08-30 10:24 ` Jiri Slaby
2024-07-05 13:20 ` [PATCH v5 2/8] perf trace: BTF-based enum pretty printing for syscall args Howard Chu
` (8 subsequent siblings)
9 siblings, 2 replies; 38+ messages in thread
From: Howard Chu @ 2024-07-05 13:20 UTC (permalink / raw)
To: acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
This is a bug found when implementing pretty-printing for the
landlock_add_rule system call, I decided to send this patch separately
because this is a serious bug that should be fixed fast.
I wrote a test program to do landlock_add_rule syscall in a loop,
yet perf trace -e landlock_add_rule freezes, giving no output.
This bug is introduced by the false understanding of the variable "key"
below:
```
for (key = 0; key < trace->sctbl->syscalls.nr_entries; ++key) {
struct syscall *sc = trace__syscall_info(trace, NULL, key);
...
}
```
The code above seems right at the beginning, but when looking at
syscalltbl.c, I found these lines:
```
for (i = 0; i <= syscalltbl_native_max_id; ++i)
if (syscalltbl_native[i])
++nr_entries;
entries = tbl->syscalls.entries = malloc(sizeof(struct syscall) * nr_entries);
...
for (i = 0, j = 0; i <= syscalltbl_native_max_id; ++i) {
if (syscalltbl_native[i]) {
entries[j].name = syscalltbl_native[i];
entries[j].id = i;
++j;
}
}
```
meaning the key is merely an index to traverse the syscall table,
instead of the actual syscall id for this particular syscall.
So if one uses key to do trace__syscall_info(trace, NULL, key), because
key only goes up to trace->sctbl->syscalls.nr_entries, for example, on
my X86_64 machine, this number is 373, it will end up neglecting all
the rest of the syscall, in my case, everything after `rseq`, because
the traversal will stop at 373, and `rseq` is the last syscall whose id
is lower than 373
in tools/perf/arch/x86/include/generated/asm/syscalls_64.c:
```
...
[334] = "rseq",
[424] = "pidfd_send_signal",
...
```
The reason why the key is scrambled but perf trace works well is that
key is used in trace__syscall_info(trace, NULL, key) to do
trace->syscalls.table[id], this makes sure that the struct syscall returned
actually has an id the same value as key, making the later bpf_prog
matching all correct.
After fixing this bug, I can do perf trace on 38 more syscalls, and
because more syscalls are visible, we get 8 more syscalls that can be
augmented.
before:
perf $ perf trace -vv --max-events=1 |& grep Reusing
Reusing "open" BPF sys_enter augmenter for "stat"
Reusing "open" BPF sys_enter augmenter for "lstat"
Reusing "open" BPF sys_enter augmenter for "access"
Reusing "connect" BPF sys_enter augmenter for "accept"
Reusing "sendto" BPF sys_enter augmenter for "recvfrom"
Reusing "connect" BPF sys_enter augmenter for "bind"
Reusing "connect" BPF sys_enter augmenter for "getsockname"
Reusing "connect" BPF sys_enter augmenter for "getpeername"
Reusing "open" BPF sys_enter augmenter for "execve"
Reusing "open" BPF sys_enter augmenter for "truncate"
Reusing "open" BPF sys_enter augmenter for "chdir"
Reusing "open" BPF sys_enter augmenter for "mkdir"
Reusing "open" BPF sys_enter augmenter for "rmdir"
Reusing "open" BPF sys_enter augmenter for "creat"
Reusing "open" BPF sys_enter augmenter for "link"
Reusing "open" BPF sys_enter augmenter for "unlink"
Reusing "open" BPF sys_enter augmenter for "symlink"
Reusing "open" BPF sys_enter augmenter for "readlink"
Reusing "open" BPF sys_enter augmenter for "chmod"
Reusing "open" BPF sys_enter augmenter for "chown"
Reusing "open" BPF sys_enter augmenter for "lchown"
Reusing "open" BPF sys_enter augmenter for "mknod"
Reusing "open" BPF sys_enter augmenter for "statfs"
Reusing "open" BPF sys_enter augmenter for "pivot_root"
Reusing "open" BPF sys_enter augmenter for "chroot"
Reusing "open" BPF sys_enter augmenter for "acct"
Reusing "open" BPF sys_enter augmenter for "swapon"
Reusing "open" BPF sys_enter augmenter for "swapoff"
Reusing "open" BPF sys_enter augmenter for "delete_module"
Reusing "open" BPF sys_enter augmenter for "setxattr"
Reusing "open" BPF sys_enter augmenter for "lsetxattr"
Reusing "openat" BPF sys_enter augmenter for "fsetxattr"
Reusing "open" BPF sys_enter augmenter for "getxattr"
Reusing "open" BPF sys_enter augmenter for "lgetxattr"
Reusing "openat" BPF sys_enter augmenter for "fgetxattr"
Reusing "open" BPF sys_enter augmenter for "listxattr"
Reusing "open" BPF sys_enter augmenter for "llistxattr"
Reusing "open" BPF sys_enter augmenter for "removexattr"
Reusing "open" BPF sys_enter augmenter for "lremovexattr"
Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr"
Reusing "open" BPF sys_enter augmenter for "mq_open"
Reusing "open" BPF sys_enter augmenter for "mq_unlink"
Reusing "fsetxattr" BPF sys_enter augmenter for "add_key"
Reusing "fremovexattr" BPF sys_enter augmenter for "request_key"
Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch"
Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat"
Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat"
Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat"
Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat"
Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat"
Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat"
Reusing "fremovexattr" BPF sys_enter augmenter for "linkat"
Reusing "open" BPF sys_enter augmenter for "symlinkat"
Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat"
Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat"
Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat"
Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat"
Reusing "connect" BPF sys_enter augmenter for "accept4"
Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at"
Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2"
Reusing "open" BPF sys_enter augmenter for "memfd_create"
Reusing "fremovexattr" BPF sys_enter augmenter for "execveat"
Reusing "fremovexattr" BPF sys_enter augmenter for "statx"
after
perf $ perf trace -vv --max-events=1 |& grep Reusing
Reusing "open" BPF sys_enter augmenter for "stat"
Reusing "open" BPF sys_enter augmenter for "lstat"
Reusing "open" BPF sys_enter augmenter for "access"
Reusing "connect" BPF sys_enter augmenter for "accept"
Reusing "sendto" BPF sys_enter augmenter for "recvfrom"
Reusing "connect" BPF sys_enter augmenter for "bind"
Reusing "connect" BPF sys_enter augmenter for "getsockname"
Reusing "connect" BPF sys_enter augmenter for "getpeername"
Reusing "open" BPF sys_enter augmenter for "execve"
Reusing "open" BPF sys_enter augmenter for "truncate"
Reusing "open" BPF sys_enter augmenter for "chdir"
Reusing "open" BPF sys_enter augmenter for "mkdir"
Reusing "open" BPF sys_enter augmenter for "rmdir"
Reusing "open" BPF sys_enter augmenter for "creat"
Reusing "open" BPF sys_enter augmenter for "link"
Reusing "open" BPF sys_enter augmenter for "unlink"
Reusing "open" BPF sys_enter augmenter for "symlink"
Reusing "open" BPF sys_enter augmenter for "readlink"
Reusing "open" BPF sys_enter augmenter for "chmod"
Reusing "open" BPF sys_enter augmenter for "chown"
Reusing "open" BPF sys_enter augmenter for "lchown"
Reusing "open" BPF sys_enter augmenter for "mknod"
Reusing "open" BPF sys_enter augmenter for "statfs"
Reusing "open" BPF sys_enter augmenter for "pivot_root"
Reusing "open" BPF sys_enter augmenter for "chroot"
Reusing "open" BPF sys_enter augmenter for "acct"
Reusing "open" BPF sys_enter augmenter for "swapon"
Reusing "open" BPF sys_enter augmenter for "swapoff"
Reusing "open" BPF sys_enter augmenter for "delete_module"
Reusing "open" BPF sys_enter augmenter for "setxattr"
Reusing "open" BPF sys_enter augmenter for "lsetxattr"
Reusing "openat" BPF sys_enter augmenter for "fsetxattr"
Reusing "open" BPF sys_enter augmenter for "getxattr"
Reusing "open" BPF sys_enter augmenter for "lgetxattr"
Reusing "openat" BPF sys_enter augmenter for "fgetxattr"
Reusing "open" BPF sys_enter augmenter for "listxattr"
Reusing "open" BPF sys_enter augmenter for "llistxattr"
Reusing "open" BPF sys_enter augmenter for "removexattr"
Reusing "open" BPF sys_enter augmenter for "lremovexattr"
Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr"
Reusing "open" BPF sys_enter augmenter for "mq_open"
Reusing "open" BPF sys_enter augmenter for "mq_unlink"
Reusing "fsetxattr" BPF sys_enter augmenter for "add_key"
Reusing "fremovexattr" BPF sys_enter augmenter for "request_key"
Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch"
Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat"
Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat"
Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat"
Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat"
Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat"
Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat"
Reusing "fremovexattr" BPF sys_enter augmenter for "linkat"
Reusing "open" BPF sys_enter augmenter for "symlinkat"
Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat"
Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat"
Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat"
Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat"
Reusing "connect" BPF sys_enter augmenter for "accept4"
Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at"
Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2"
Reusing "open" BPF sys_enter augmenter for "memfd_create"
Reusing "fremovexattr" BPF sys_enter augmenter for "execveat"
Reusing "fremovexattr" BPF sys_enter augmenter for "statx"
TL;DR:
These are the new syscalls that can be augmented
Reusing "openat" BPF sys_enter augmenter for "open_tree"
Reusing "openat" BPF sys_enter augmenter for "openat2"
Reusing "openat" BPF sys_enter augmenter for "mount_setattr"
Reusing "openat" BPF sys_enter augmenter for "move_mount"
Reusing "open" BPF sys_enter augmenter for "fsopen"
Reusing "openat" BPF sys_enter augmenter for "fspick"
Reusing "openat" BPF sys_enter augmenter for "faccessat2"
Reusing "openat" BPF sys_enter augmenter for "fchmodat2"
as for the perf trace output:
before
perf $ perf trace -e faccessat2 --max-events=1
[no output]
after
perf $ ./perf trace -e faccessat2 --max-events=1
0.000 ( 0.037 ms): waybar/958 faccessat2(dfd: 40, filename: "uevent") = 0
P.S. The reason why this bug was not found in the past five years is
probably because it only happens to the newer syscalls whose id is
greater, for instance, faccessat2 of id 439, which not a lot of people
care about when using perf trace.
Commiter notes:
That and the fact that the BPF code was hidden before having to use -e,
that got changed kinda recently when we switched to using BPF skels for
augmenting syscalls in 'perf trace':
⬢[acme@toolbox perf-tools-next]$ git log --oneline tools/perf/util/bpf_skel/augmented_raw_syscalls.bpf.c
a9f4c6c999008c92 perf trace: Collect sys_nanosleep first argument
29d16de26df17e94 perf augmented_raw_syscalls.bpf: Move 'struct timespec64' to vmlinux.h
5069211e2f0b47e7 perf trace: Use the right bpf_probe_read(_str) variant for reading user data
33b725ce7b988756 perf trace: Avoid compile error wrt redefining bool
7d9642311b6d9d31 perf bpf augmented_raw_syscalls: Add an assert to make sure sizeof(augmented_arg->value) is a power of two.
262b54b6c9396823 perf bpf augmented_raw_syscalls: Add an assert to make sure sizeof(saddr) is a power of two.
1836480429d173c0 perf bpf_skel augmented_raw_syscalls: Cap the socklen parameter using &= sizeof(saddr)
cd2cece61ac5f900 perf trace: Tidy comments related to BPF + syscall augmentation
5e6da6be3082f77b perf trace: Migrate BPF augmentation to use a skeleton
⬢[acme@toolbox perf-tools-next]$
⬢[acme@toolbox perf-tools-next]$ git show --oneline --pretty=reference 5e6da6be3082f77b | head -1
5e6da6be3082f77b (perf trace: Migrate BPF augmentation to use a skeleton, 2023-08-10)
⬢[acme@toolbox perf-tools-next]$
I.e. from August, 2023.
One had as well to ask for BUILD_BPF_SKEL=1, which now is default if all
it needs is available on the system.
I simplified the code to not expose the 'struct syscall' outside of
tools/perf/util/syscalltbl.c, instead providing a function to go from
the index to the syscall id:
int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx);
Signed-off-by: Howard Chu <howardchu95@gmail.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/lkml/ZmhlAxbVcAKoPTg8@x1
Link: https://lore.kernel.org/r/20240624181345.124764-2-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-trace.c | 14 +++++++-------
tools/perf/util/syscalltbl.c | 7 +++++++
tools/perf/util/syscalltbl.h | 1 +
3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index a547ccfa92c9..8449f2beb54d 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -3354,8 +3354,6 @@ static int trace__bpf_prog_sys_exit_fd(struct trace *trace, int id)
static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace, struct syscall *sc)
{
struct tep_format_field *field, *candidate_field;
- int id;
-
/*
* We're only interested in syscalls that have a pointer:
*/
@@ -3367,7 +3365,8 @@ static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace
return NULL;
try_to_find_pair:
- for (id = 0; id < trace->sctbl->syscalls.nr_entries; ++id) {
+ for (int i = 0; i < trace->sctbl->syscalls.nr_entries; ++i) {
+ int id = syscalltbl__id_at_idx(trace->sctbl, i);
struct syscall *pair = trace__syscall_info(trace, NULL, id);
struct bpf_program *pair_prog;
bool is_candidate = false;
@@ -3456,10 +3455,10 @@ static int trace__init_syscalls_bpf_prog_array_maps(struct trace *trace)
{
int map_enter_fd = bpf_map__fd(trace->skel->maps.syscalls_sys_enter);
int map_exit_fd = bpf_map__fd(trace->skel->maps.syscalls_sys_exit);
- int err = 0, key;
+ int err = 0;
- for (key = 0; key < trace->sctbl->syscalls.nr_entries; ++key) {
- int prog_fd;
+ for (int i = 0; i < trace->sctbl->syscalls.nr_entries; ++i) {
+ int prog_fd, key = syscalltbl__id_at_idx(trace->sctbl, i);
if (!trace__syscall_enabled(trace, key))
continue;
@@ -3505,7 +3504,8 @@ static int trace__init_syscalls_bpf_prog_array_maps(struct trace *trace)
* first and second arg (this one on the raw_syscalls:sys_exit prog
* array tail call, then that one will be used.
*/
- for (key = 0; key < trace->sctbl->syscalls.nr_entries; ++key) {
+ for (int i = 0; i < trace->sctbl->syscalls.nr_entries; ++i) {
+ int key = syscalltbl__id_at_idx(trace->sctbl, i);
struct syscall *sc = trace__syscall_info(trace, NULL, key);
struct bpf_program *pair_prog;
int prog_fd;
diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
index 63be7b58761d..0dd26b991b3f 100644
--- a/tools/perf/util/syscalltbl.c
+++ b/tools/perf/util/syscalltbl.c
@@ -123,6 +123,13 @@ int syscalltbl__id(struct syscalltbl *tbl, const char *name)
return sc ? sc->id : -1;
}
+int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx)
+{
+ struct syscall *syscalls = tbl->syscalls.entries;
+
+ return idx < tbl->syscalls.nr_entries ? syscalls[idx].id : -1;
+}
+
int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *syscall_glob, int *idx)
{
int i;
diff --git a/tools/perf/util/syscalltbl.h b/tools/perf/util/syscalltbl.h
index a41d2ca9e4ae..2b53b7ed25a6 100644
--- a/tools/perf/util/syscalltbl.h
+++ b/tools/perf/util/syscalltbl.h
@@ -16,6 +16,7 @@ void syscalltbl__delete(struct syscalltbl *tbl);
const char *syscalltbl__name(const struct syscalltbl *tbl, int id);
int syscalltbl__id(struct syscalltbl *tbl, const char *name);
+int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx);
int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *syscall_glob, int *idx);
int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *syscall_glob, int *idx);
--
2.45.2
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-07-05 13:20 ` [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries Howard Chu
@ 2024-07-12 16:51 ` Namhyung Kim
2024-08-30 10:24 ` Jiri Slaby
1 sibling, 0 replies; 38+ messages in thread
From: Namhyung Kim @ 2024-07-12 16:51 UTC (permalink / raw)
To: Howard Chu
Cc: acme, adrian.hunter, irogers, jolsa, kan.liang, linux-perf-users,
linux-kernel, Arnaldo Carvalho de Melo
Hello Howard,
On Fri, Jul 05, 2024 at 09:20:51PM +0800, Howard Chu wrote:
> This is a bug found when implementing pretty-printing for the
> landlock_add_rule system call, I decided to send this patch separately
> because this is a serious bug that should be fixed fast.
I'll pick up this from the series separately for v6.11.
Thanks,
Namhyung
>
> I wrote a test program to do landlock_add_rule syscall in a loop,
> yet perf trace -e landlock_add_rule freezes, giving no output.
>
> This bug is introduced by the false understanding of the variable "key"
> below:
> ```
> for (key = 0; key < trace->sctbl->syscalls.nr_entries; ++key) {
> struct syscall *sc = trace__syscall_info(trace, NULL, key);
> ...
> }
> ```
> The code above seems right at the beginning, but when looking at
> syscalltbl.c, I found these lines:
>
> ```
> for (i = 0; i <= syscalltbl_native_max_id; ++i)
> if (syscalltbl_native[i])
> ++nr_entries;
>
> entries = tbl->syscalls.entries = malloc(sizeof(struct syscall) * nr_entries);
> ...
>
> for (i = 0, j = 0; i <= syscalltbl_native_max_id; ++i) {
> if (syscalltbl_native[i]) {
> entries[j].name = syscalltbl_native[i];
> entries[j].id = i;
> ++j;
> }
> }
> ```
>
> meaning the key is merely an index to traverse the syscall table,
> instead of the actual syscall id for this particular syscall.
>
> So if one uses key to do trace__syscall_info(trace, NULL, key), because
> key only goes up to trace->sctbl->syscalls.nr_entries, for example, on
> my X86_64 machine, this number is 373, it will end up neglecting all
> the rest of the syscall, in my case, everything after `rseq`, because
> the traversal will stop at 373, and `rseq` is the last syscall whose id
> is lower than 373
>
> in tools/perf/arch/x86/include/generated/asm/syscalls_64.c:
> ```
> ...
> [334] = "rseq",
> [424] = "pidfd_send_signal",
> ...
> ```
>
> The reason why the key is scrambled but perf trace works well is that
> key is used in trace__syscall_info(trace, NULL, key) to do
> trace->syscalls.table[id], this makes sure that the struct syscall returned
> actually has an id the same value as key, making the later bpf_prog
> matching all correct.
>
> After fixing this bug, I can do perf trace on 38 more syscalls, and
> because more syscalls are visible, we get 8 more syscalls that can be
> augmented.
>
> before:
>
> perf $ perf trace -vv --max-events=1 |& grep Reusing
> Reusing "open" BPF sys_enter augmenter for "stat"
> Reusing "open" BPF sys_enter augmenter for "lstat"
> Reusing "open" BPF sys_enter augmenter for "access"
> Reusing "connect" BPF sys_enter augmenter for "accept"
> Reusing "sendto" BPF sys_enter augmenter for "recvfrom"
> Reusing "connect" BPF sys_enter augmenter for "bind"
> Reusing "connect" BPF sys_enter augmenter for "getsockname"
> Reusing "connect" BPF sys_enter augmenter for "getpeername"
> Reusing "open" BPF sys_enter augmenter for "execve"
> Reusing "open" BPF sys_enter augmenter for "truncate"
> Reusing "open" BPF sys_enter augmenter for "chdir"
> Reusing "open" BPF sys_enter augmenter for "mkdir"
> Reusing "open" BPF sys_enter augmenter for "rmdir"
> Reusing "open" BPF sys_enter augmenter for "creat"
> Reusing "open" BPF sys_enter augmenter for "link"
> Reusing "open" BPF sys_enter augmenter for "unlink"
> Reusing "open" BPF sys_enter augmenter for "symlink"
> Reusing "open" BPF sys_enter augmenter for "readlink"
> Reusing "open" BPF sys_enter augmenter for "chmod"
> Reusing "open" BPF sys_enter augmenter for "chown"
> Reusing "open" BPF sys_enter augmenter for "lchown"
> Reusing "open" BPF sys_enter augmenter for "mknod"
> Reusing "open" BPF sys_enter augmenter for "statfs"
> Reusing "open" BPF sys_enter augmenter for "pivot_root"
> Reusing "open" BPF sys_enter augmenter for "chroot"
> Reusing "open" BPF sys_enter augmenter for "acct"
> Reusing "open" BPF sys_enter augmenter for "swapon"
> Reusing "open" BPF sys_enter augmenter for "swapoff"
> Reusing "open" BPF sys_enter augmenter for "delete_module"
> Reusing "open" BPF sys_enter augmenter for "setxattr"
> Reusing "open" BPF sys_enter augmenter for "lsetxattr"
> Reusing "openat" BPF sys_enter augmenter for "fsetxattr"
> Reusing "open" BPF sys_enter augmenter for "getxattr"
> Reusing "open" BPF sys_enter augmenter for "lgetxattr"
> Reusing "openat" BPF sys_enter augmenter for "fgetxattr"
> Reusing "open" BPF sys_enter augmenter for "listxattr"
> Reusing "open" BPF sys_enter augmenter for "llistxattr"
> Reusing "open" BPF sys_enter augmenter for "removexattr"
> Reusing "open" BPF sys_enter augmenter for "lremovexattr"
> Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr"
> Reusing "open" BPF sys_enter augmenter for "mq_open"
> Reusing "open" BPF sys_enter augmenter for "mq_unlink"
> Reusing "fsetxattr" BPF sys_enter augmenter for "add_key"
> Reusing "fremovexattr" BPF sys_enter augmenter for "request_key"
> Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch"
> Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "linkat"
> Reusing "open" BPF sys_enter augmenter for "symlinkat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat"
> Reusing "connect" BPF sys_enter augmenter for "accept4"
> Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at"
> Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2"
> Reusing "open" BPF sys_enter augmenter for "memfd_create"
> Reusing "fremovexattr" BPF sys_enter augmenter for "execveat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "statx"
>
> after
>
> perf $ perf trace -vv --max-events=1 |& grep Reusing
> Reusing "open" BPF sys_enter augmenter for "stat"
> Reusing "open" BPF sys_enter augmenter for "lstat"
> Reusing "open" BPF sys_enter augmenter for "access"
> Reusing "connect" BPF sys_enter augmenter for "accept"
> Reusing "sendto" BPF sys_enter augmenter for "recvfrom"
> Reusing "connect" BPF sys_enter augmenter for "bind"
> Reusing "connect" BPF sys_enter augmenter for "getsockname"
> Reusing "connect" BPF sys_enter augmenter for "getpeername"
> Reusing "open" BPF sys_enter augmenter for "execve"
> Reusing "open" BPF sys_enter augmenter for "truncate"
> Reusing "open" BPF sys_enter augmenter for "chdir"
> Reusing "open" BPF sys_enter augmenter for "mkdir"
> Reusing "open" BPF sys_enter augmenter for "rmdir"
> Reusing "open" BPF sys_enter augmenter for "creat"
> Reusing "open" BPF sys_enter augmenter for "link"
> Reusing "open" BPF sys_enter augmenter for "unlink"
> Reusing "open" BPF sys_enter augmenter for "symlink"
> Reusing "open" BPF sys_enter augmenter for "readlink"
> Reusing "open" BPF sys_enter augmenter for "chmod"
> Reusing "open" BPF sys_enter augmenter for "chown"
> Reusing "open" BPF sys_enter augmenter for "lchown"
> Reusing "open" BPF sys_enter augmenter for "mknod"
> Reusing "open" BPF sys_enter augmenter for "statfs"
> Reusing "open" BPF sys_enter augmenter for "pivot_root"
> Reusing "open" BPF sys_enter augmenter for "chroot"
> Reusing "open" BPF sys_enter augmenter for "acct"
> Reusing "open" BPF sys_enter augmenter for "swapon"
> Reusing "open" BPF sys_enter augmenter for "swapoff"
> Reusing "open" BPF sys_enter augmenter for "delete_module"
> Reusing "open" BPF sys_enter augmenter for "setxattr"
> Reusing "open" BPF sys_enter augmenter for "lsetxattr"
> Reusing "openat" BPF sys_enter augmenter for "fsetxattr"
> Reusing "open" BPF sys_enter augmenter for "getxattr"
> Reusing "open" BPF sys_enter augmenter for "lgetxattr"
> Reusing "openat" BPF sys_enter augmenter for "fgetxattr"
> Reusing "open" BPF sys_enter augmenter for "listxattr"
> Reusing "open" BPF sys_enter augmenter for "llistxattr"
> Reusing "open" BPF sys_enter augmenter for "removexattr"
> Reusing "open" BPF sys_enter augmenter for "lremovexattr"
> Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr"
> Reusing "open" BPF sys_enter augmenter for "mq_open"
> Reusing "open" BPF sys_enter augmenter for "mq_unlink"
> Reusing "fsetxattr" BPF sys_enter augmenter for "add_key"
> Reusing "fremovexattr" BPF sys_enter augmenter for "request_key"
> Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch"
> Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "linkat"
> Reusing "open" BPF sys_enter augmenter for "symlinkat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat"
> Reusing "connect" BPF sys_enter augmenter for "accept4"
> Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at"
> Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2"
> Reusing "open" BPF sys_enter augmenter for "memfd_create"
> Reusing "fremovexattr" BPF sys_enter augmenter for "execveat"
> Reusing "fremovexattr" BPF sys_enter augmenter for "statx"
>
> TL;DR:
>
> These are the new syscalls that can be augmented
> Reusing "openat" BPF sys_enter augmenter for "open_tree"
> Reusing "openat" BPF sys_enter augmenter for "openat2"
> Reusing "openat" BPF sys_enter augmenter for "mount_setattr"
> Reusing "openat" BPF sys_enter augmenter for "move_mount"
> Reusing "open" BPF sys_enter augmenter for "fsopen"
> Reusing "openat" BPF sys_enter augmenter for "fspick"
> Reusing "openat" BPF sys_enter augmenter for "faccessat2"
> Reusing "openat" BPF sys_enter augmenter for "fchmodat2"
>
> as for the perf trace output:
>
> before
>
> perf $ perf trace -e faccessat2 --max-events=1
> [no output]
>
> after
>
> perf $ ./perf trace -e faccessat2 --max-events=1
> 0.000 ( 0.037 ms): waybar/958 faccessat2(dfd: 40, filename: "uevent") = 0
>
> P.S. The reason why this bug was not found in the past five years is
> probably because it only happens to the newer syscalls whose id is
> greater, for instance, faccessat2 of id 439, which not a lot of people
> care about when using perf trace.
>
> Commiter notes:
>
> That and the fact that the BPF code was hidden before having to use -e,
> that got changed kinda recently when we switched to using BPF skels for
> augmenting syscalls in 'perf trace':
>
> ⬢[acme@toolbox perf-tools-next]$ git log --oneline tools/perf/util/bpf_skel/augmented_raw_syscalls.bpf.c
> a9f4c6c999008c92 perf trace: Collect sys_nanosleep first argument
> 29d16de26df17e94 perf augmented_raw_syscalls.bpf: Move 'struct timespec64' to vmlinux.h
> 5069211e2f0b47e7 perf trace: Use the right bpf_probe_read(_str) variant for reading user data
> 33b725ce7b988756 perf trace: Avoid compile error wrt redefining bool
> 7d9642311b6d9d31 perf bpf augmented_raw_syscalls: Add an assert to make sure sizeof(augmented_arg->value) is a power of two.
> 262b54b6c9396823 perf bpf augmented_raw_syscalls: Add an assert to make sure sizeof(saddr) is a power of two.
> 1836480429d173c0 perf bpf_skel augmented_raw_syscalls: Cap the socklen parameter using &= sizeof(saddr)
> cd2cece61ac5f900 perf trace: Tidy comments related to BPF + syscall augmentation
> 5e6da6be3082f77b perf trace: Migrate BPF augmentation to use a skeleton
> ⬢[acme@toolbox perf-tools-next]$
>
> ⬢[acme@toolbox perf-tools-next]$ git show --oneline --pretty=reference 5e6da6be3082f77b | head -1
> 5e6da6be3082f77b (perf trace: Migrate BPF augmentation to use a skeleton, 2023-08-10)
> ⬢[acme@toolbox perf-tools-next]$
>
> I.e. from August, 2023.
>
> One had as well to ask for BUILD_BPF_SKEL=1, which now is default if all
> it needs is available on the system.
>
> I simplified the code to not expose the 'struct syscall' outside of
> tools/perf/util/syscalltbl.c, instead providing a function to go from
> the index to the syscall id:
>
> int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx);
>
> Signed-off-by: Howard Chu <howardchu95@gmail.com>
> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Adrian Hunter <adrian.hunter@intel.com>
> Cc: Ian Rogers <irogers@google.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: Kan Liang <kan.liang@linux.intel.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Link: https://lore.kernel.org/lkml/ZmhlAxbVcAKoPTg8@x1
> Link: https://lore.kernel.org/r/20240624181345.124764-2-howardchu95@gmail.com
> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> ---
> tools/perf/builtin-trace.c | 14 +++++++-------
> tools/perf/util/syscalltbl.c | 7 +++++++
> tools/perf/util/syscalltbl.h | 1 +
> 3 files changed, 15 insertions(+), 7 deletions(-)
>
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index a547ccfa92c9..8449f2beb54d 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -3354,8 +3354,6 @@ static int trace__bpf_prog_sys_exit_fd(struct trace *trace, int id)
> static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace, struct syscall *sc)
> {
> struct tep_format_field *field, *candidate_field;
> - int id;
> -
> /*
> * We're only interested in syscalls that have a pointer:
> */
> @@ -3367,7 +3365,8 @@ static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace
> return NULL;
>
> try_to_find_pair:
> - for (id = 0; id < trace->sctbl->syscalls.nr_entries; ++id) {
> + for (int i = 0; i < trace->sctbl->syscalls.nr_entries; ++i) {
> + int id = syscalltbl__id_at_idx(trace->sctbl, i);
> struct syscall *pair = trace__syscall_info(trace, NULL, id);
> struct bpf_program *pair_prog;
> bool is_candidate = false;
> @@ -3456,10 +3455,10 @@ static int trace__init_syscalls_bpf_prog_array_maps(struct trace *trace)
> {
> int map_enter_fd = bpf_map__fd(trace->skel->maps.syscalls_sys_enter);
> int map_exit_fd = bpf_map__fd(trace->skel->maps.syscalls_sys_exit);
> - int err = 0, key;
> + int err = 0;
>
> - for (key = 0; key < trace->sctbl->syscalls.nr_entries; ++key) {
> - int prog_fd;
> + for (int i = 0; i < trace->sctbl->syscalls.nr_entries; ++i) {
> + int prog_fd, key = syscalltbl__id_at_idx(trace->sctbl, i);
>
> if (!trace__syscall_enabled(trace, key))
> continue;
> @@ -3505,7 +3504,8 @@ static int trace__init_syscalls_bpf_prog_array_maps(struct trace *trace)
> * first and second arg (this one on the raw_syscalls:sys_exit prog
> * array tail call, then that one will be used.
> */
> - for (key = 0; key < trace->sctbl->syscalls.nr_entries; ++key) {
> + for (int i = 0; i < trace->sctbl->syscalls.nr_entries; ++i) {
> + int key = syscalltbl__id_at_idx(trace->sctbl, i);
> struct syscall *sc = trace__syscall_info(trace, NULL, key);
> struct bpf_program *pair_prog;
> int prog_fd;
> diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
> index 63be7b58761d..0dd26b991b3f 100644
> --- a/tools/perf/util/syscalltbl.c
> +++ b/tools/perf/util/syscalltbl.c
> @@ -123,6 +123,13 @@ int syscalltbl__id(struct syscalltbl *tbl, const char *name)
> return sc ? sc->id : -1;
> }
>
> +int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx)
> +{
> + struct syscall *syscalls = tbl->syscalls.entries;
> +
> + return idx < tbl->syscalls.nr_entries ? syscalls[idx].id : -1;
> +}
> +
> int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *syscall_glob, int *idx)
> {
> int i;
> diff --git a/tools/perf/util/syscalltbl.h b/tools/perf/util/syscalltbl.h
> index a41d2ca9e4ae..2b53b7ed25a6 100644
> --- a/tools/perf/util/syscalltbl.h
> +++ b/tools/perf/util/syscalltbl.h
> @@ -16,6 +16,7 @@ void syscalltbl__delete(struct syscalltbl *tbl);
>
> const char *syscalltbl__name(const struct syscalltbl *tbl, int id);
> int syscalltbl__id(struct syscalltbl *tbl, const char *name);
> +int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx);
>
> int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *syscall_glob, int *idx);
> int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *syscall_glob, int *idx);
> --
> 2.45.2
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-07-05 13:20 ` [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries Howard Chu
2024-07-12 16:51 ` Namhyung Kim
@ 2024-08-30 10:24 ` Jiri Slaby
2024-08-30 10:27 ` Jiri Slaby
2024-08-30 23:30 ` [PATCH/RFT] " Arnaldo Carvalho de Melo
1 sibling, 2 replies; 38+ messages in thread
From: Jiri Slaby @ 2024-08-30 10:24 UTC (permalink / raw)
To: Howard Chu, acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
On 05. 07. 24, 15:20, Howard Chu wrote:
> This is a bug found when implementing pretty-printing for the
> landlock_add_rule system call, I decided to send this patch separately
> because this is a serious bug that should be fixed fast.
...
> I simplified the code to not expose the 'struct syscall' outside of
> tools/perf/util/syscalltbl.c, instead providing a function to go from
> the index to the syscall id:
>
> int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx);
...
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -3354,8 +3354,6 @@ static int trace__bpf_prog_sys_exit_fd(struct trace *trace, int id)
> static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace, struct syscall *sc)
> {
> struct tep_format_field *field, *candidate_field;
> - int id;
> -
> /*
> * We're only interested in syscalls that have a pointer:
> */
> @@ -3367,7 +3365,8 @@ static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace
> return NULL;
>
> try_to_find_pair:
> - for (id = 0; id < trace->sctbl->syscalls.nr_entries; ++id) {
> + for (int i = 0; i < trace->sctbl->syscalls.nr_entries; ++i) {
> + int id = syscalltbl__id_at_idx(trace->sctbl, i);
> struct syscall *pair = trace__syscall_info(trace, NULL, id);
> struct bpf_program *pair_prog;
> bool is_candidate = false;
> @@ -3456,10 +3455,10 @@ static int trace__init_syscalls_bpf_prog_array_maps(struct trace *trace)
> {
> int map_enter_fd = bpf_map__fd(trace->skel->maps.syscalls_sys_enter);
> int map_exit_fd = bpf_map__fd(trace->skel->maps.syscalls_sys_exit);
> - int err = 0, key;
> + int err = 0;
>
> - for (key = 0; key < trace->sctbl->syscalls.nr_entries; ++key) {
> - int prog_fd;
> + for (int i = 0; i < trace->sctbl->syscalls.nr_entries; ++i) {
> + int prog_fd, key = syscalltbl__id_at_idx(trace->sctbl, i);
>
> if (!trace__syscall_enabled(trace, key))
> continue;
> @@ -3505,7 +3504,8 @@ static int trace__init_syscalls_bpf_prog_array_maps(struct trace *trace)
> * first and second arg (this one on the raw_syscalls:sys_exit prog
> * array tail call, then that one will be used.
> */
> - for (key = 0; key < trace->sctbl->syscalls.nr_entries; ++key) {
> + for (int i = 0; i < trace->sctbl->syscalls.nr_entries; ++i) {
> + int key = syscalltbl__id_at_idx(trace->sctbl, i);
> struct syscall *sc = trace__syscall_info(trace, NULL, key);
> struct bpf_program *pair_prog;
> int prog_fd;
> diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
> index 63be7b58761d..0dd26b991b3f 100644
> --- a/tools/perf/util/syscalltbl.c
> +++ b/tools/perf/util/syscalltbl.c
> @@ -123,6 +123,13 @@ int syscalltbl__id(struct syscalltbl *tbl, const char *name)
> return sc ? sc->id : -1;
> }
>
> +int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx)
> +{
> + struct syscall *syscalls = tbl->syscalls.entries;
> +
> + return idx < tbl->syscalls.nr_entries ? syscalls[idx].id : -1;
> +}
> +
This broke NO_SYSCALL_TABLE builds. i586 in particular
(HAVE_SYSCALL_TABLE_SUPPORT is undefined there):
> gcc -fomit-frame-pointer -O2 -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -Werror=return-type -Wbad-function-cast -Wdeclaration-after-statement -Wformat-security -Wformat-y2k -Winit-self -Wmissing-declarations -Wmissing-prototypes -Wno-system-headers -Wold-style-definition -Wpacked -Wredundant-decls -Wstrict-prototypes -Wswitch-default -Wswitch-enum -Wundef -Wwrite-strings -Wformat -Wno-type-limits -Wstrict-aliasing=3 -Wshadow -DHAVE_ARCH_REGS_QUERY_REGISTER_OFFSET -DNDEBUG=1 -O6 -fno-omit-frame-pointer -Wall -Wextra -std=gnu11 -fstack-protector-all -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/home/abuild/rpmbuild/BUILD/tools/perf/util/include -I/home/abuild/rpmbuild/BUILD/tools/perf/arch/x86/include -I/home/abuild/rpmbuild/BUILD/tools/include/ -I/home/abuild/rpmbuild/BUILD/tools/arch/x86/include/uapi -I/home/abuild/rpmbuild/BUILD/tools/include/uapi -I/home/abuild/rpmbuild/BUILD/tools/arch/x86/include/ -I/home/abuild/rpmbuild/BUILD/tools/arch/x86/ -I/home/abuild/rpmbuild/BUILD/tools/perf/util -I/home/abuild/rpmbuild/BUILD/tools/perf -DHAVE_PTHREAD_ATTR_SETAFFINITY_NP -DHAVE_PTHREAD_BARRIER -DHAVE_EVENTFD_SUPPORT -DHAVE_GET_CURRENT_DIR_NAME -DHAVE_GETTID -DHAVE_FILE_HANDLE -DHAVE_DWARF_GETLOCATIONS_SUPPORT -DHAVE_DWARF_CFI_SUPPORT -DHAVE_AIO_SUPPORT -DHAVE_SCANDIRAT_SUPPORT -DHAVE_SCHED_GETCPU_SUPPORT -DHAVE_SETNS_SUPPORT -DHAVE_CSTRACE_SUPPORT -DHAVE_ZLIB_SUPPORT -DHAVE_LIBELF_SUPPORT -DHAVE_ELF_GETPHDRNUM_SUPPORT -DHAVE_GELF_GETNOTE_SUPPORT -DHAVE_ELF_GETSHDRSTRNDX_SUPPORT -DHAVE_DWARF_SUPPORT -DHAVE_LIBBPF_SUPPORT -DHAVE_JITDUMP -DHAVE_LIBUNWIND_X86_SUPPORT -DHAVE_BPF_SKEL -DHAVE_DWARF_UNWIND_SUPPORT -DNO_LIBUNWIND_DEBUG_FRAME -DHAVE_LIBUNWIND_SUPPORT -DHAVE_LIBAUDIT_SUPPORT -DHAVE_LIBCRYPTO_SUPPORT -DHAVE_SLANG_SUPPORT -DHAVE_GTK2_SUPPORT -DHAVE_LIBPERL_SUPPORT -DHAVE_TIMERFD_SUPPORT -DHAVE_LIBPYTHON_SUPPORT -fPIC -DHAVE_CXA_DEMANGLE_SUPPORT -DHAVE_LZMA_SUPPORT -DHAVE_ZSTD_SUPPORT -DHAVE_LIBCAP_SUPPORT -DHAVE_BACKTRACE_SUPPORT -DHAVE_KVM_STAT_SUPPORT -DDISASM_INIT_STYLED -DHAVE_LIBBABELTRACE_SUPPORT -DHAVE_AUXTRACE_SUPPORT -DHAVE_LIBTRACEEVENT -DLIBTRACEEVENT_VERSION=67067 -I/home/abuild/rpmbuild/BUILD/tools/perf/libapi/include -I/home/abuild/rpmbuild/BUILD/tools/perf/libbpf/include -I/home/abuild/rpmbuild/BUILD/tools/perf/libsubcmd/include -I/home/abuild/rpmbuild/BUILD/tools/perf/libsymbol/include -I/home/abuild/rpmbuild/BUILD/tools/perf/libperf/include -Wl,-z,noexecstack -lunwind-x86 -lunwind-x86 -llzma -lunwind -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.40.0/i586-linux-thread-multi-64int/CORE -fstack-protector-strong -L/usr/lib/perl5/5.40.0/i586-linux-thread-multi-64int/CORE -L/usr/lib \
> perf-in.o -Wl,--whole-archive /home/abuild/rpmbuild/BUILD/tools/perf/libapi/libapi.a /home/abuild/rpmbuild/BUILD/tools/perf/libperf/libperf.a /home/abuild/rpmbuild/BUILD/tools/perf/libsubcmd/libsubcmd.a /home/abuild/rpmbuild/BUILD/tools/perf/libsymbol/libsymbol.a /home/abuild/rpmbuild/BUILD/tools/perf/libbpf/libbpf.a libperf-bench.a libperf-test.a libperf-ui.a libperf-util.a libpmu-events.a -Wl,--no-whole-archive -Wl,--start-group -lpthread -lrt -lm -ldl -lopencsd_c_api -lopencsd -lz -lelf -ldw -lunwind-x86 -llzma -lunwind -lunwind-x86 -laudit -lcrypto -lslang -ldl -lperl -lpthread -ldl -lm -lcrypt -lutil -lc -lpython3.11 -ldl -lm -lutil -lstdc++ -llzma -lzstd -lcap -lbabeltrace-ctf -ltraceevent -Wl,--end-group -o perf
> /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld: perf-in.o: in function `cmd_trace':
> (.text+0x81411): undefined reference to `syscalltbl__id_at_idx'
> /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld: (.text+0x814b2): undefined reference to `syscalltbl__id_at_idx'
> /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld: (.text+0x8154c): undefined reference to `syscalltbl__id_at_idx'
Should there be something like a function returning identity mapping for
!HAVE_SYSCALL_TABLE_SUPPORT?
thanks,
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-08-30 10:24 ` Jiri Slaby
@ 2024-08-30 10:27 ` Jiri Slaby
2024-08-30 23:30 ` [PATCH/RFT] " Arnaldo Carvalho de Melo
1 sibling, 0 replies; 38+ messages in thread
From: Jiri Slaby @ 2024-08-30 10:27 UTC (permalink / raw)
To: Howard Chu, acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
On 30. 08. 24, 12:24, Jiri Slaby wrote:
>> /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld:
>> (.text+0x8154c): undefined reference to `syscalltbl__id_at_idx'
>
> Should there be something like a function returning identity mapping for
> !HAVE_SYSCALL_TABLE_SUPPORT?
Something like:
--- a/tools/perf/util/syscalltbl.c
+++ b/tools/perf/util/syscalltbl.c
@@ -178,6 +178,11 @@ int syscalltbl__id(struct syscalltbl *tbl, const
char *name)
return audit_name_to_syscall(name, tbl->audit_machine);
}
+int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx)
+{
+ return idx;
+}
+
int syscalltbl__strglobmatch_next(struct syscalltbl *tbl __maybe_unused,
const char *syscall_glob
__maybe_unused, int *idx __maybe_unused)
{
?
> thanks,--
js
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-08-30 10:24 ` Jiri Slaby
2024-08-30 10:27 ` Jiri Slaby
@ 2024-08-30 23:30 ` Arnaldo Carvalho de Melo
2024-08-31 0:35 ` Ian Rogers
2024-09-02 5:25 ` Jiri Slaby
1 sibling, 2 replies; 38+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-08-30 23:30 UTC (permalink / raw)
To: Jiri Slaby
Cc: Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa, Kan Liang,
Namhyung Kim, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On Fri, Aug 30, 2024 at 12:24:29PM +0200, Jiri Slaby wrote:
> This broke NO_SYSCALL_TABLE builds. i586 in particular
> (HAVE_SYSCALL_TABLE_SUPPORT is undefined there):
> > gcc -fomit-frame-pointer -O2 -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-protector-strong -funwind-tables -fasynchronous
> > perf-in.o -Wl,--whole-archive /home/abuild/rpmbuild/BUILD/tools/perf/libapi/libapi.a /home/abuild/rpmbuild/BUILD/tools/pe
> > /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld: perf-in.o: in function `cmd_trace':
> > (.text+0x81411): undefined reference to `syscalltbl__id_at_idx'
> > /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld: (.text+0x814b2): undefined reference to `syscalltbl__id_at_idx'
> > /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld: (.text+0x8154c): undefined reference to `syscalltbl__id_at_idx'
>
> Should there be something like a function returning identity mapping for
> !HAVE_SYSCALL_TABLE_SUPPORT?
I'll address this later, meantime I'm adding the patch below to
perf-tools-next, probably your fix/suggestion of an identity mapping is
way shorter and solves the !HAVE_SYSCALL_TABLE_SUPPORT case and thus
should go to perf-tools.
Please test the patch below and see if it fixes things for you, for me,
with this container:
WARNING: image platform (linux/386) does not match the expected platform (linux/amd64)
WARNING: image platform (linux/386) does not match the expected platform (linux/amd64)
110.55 almalinux:9-i386 : Ok gcc (GCC) 11.4.1 20231218 (Red Hat 11.4.1-3) , clang version 17.0.6 (AlmaLinux OS Foundation 17.0.6-5.el9) flex 2.6.4
BUILD_TARBALL_HEAD=174899051e54ecdab06c07652a3d04ad000ab301
Using https://hub.docker.com/r/almalinux/i386/tags
It builds as part of my set of tools[1] (not perf specific, I use it for
pahole as well) build containers, using gcc and clang, with/without
various build options, and will thus be tested from now on before I push
things upstream.
- Arnaldo
[1] https://github.com/acmel/linux-tools-container-builds
From 174899051e54ecdab06c07652a3d04ad000ab301 Mon Sep 17 00:00:00 2001
From: Arnaldo Carvalho de Melo <acme@redhat.com>
Date: Fri, 30 Aug 2024 19:53:47 -0300
Subject: [PATCH 1/1] perf tools: Build x86 32-bit syscall table from
arch/x86/entry/syscalls/syscall_32.tbl
To remove one more use of the audit libs and address a problem reported
with a recent change where a function isn't available when using the
audit libs method, that should really go away, this being one step in
that direction.
The script used to generate the 64-bit syscall table was already
parametrized to generate for both 64-bit and 32-bit, so just use it and
wire the generated table to the syscalltbl.c routines.
Reported-by: Jiri Slaby <jirislaby@kernel.org>
Suggested-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/lkml/6fe63fa3-6c63-4b75-ac09-884d26f6fb95@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/Makefile.config | 13 +-
tools/perf/arch/x86/Makefile | 6 +-
.../arch/x86/entry/syscalls/syscall_32.tbl | 470 ++++++++++++++++++
| 1 +
tools/perf/util/syscalltbl.c | 4 +
5 files changed, 484 insertions(+), 10 deletions(-)
create mode 100644 tools/perf/arch/x86/entry/syscalls/syscall_32.tbl
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 4eb1fc897baf64b8..9998cd7a879206ae 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -31,14 +31,8 @@ $(call detected_var,SRCARCH)
ifneq ($(NO_SYSCALL_TABLE),1)
NO_SYSCALL_TABLE := 1
- ifeq ($(SRCARCH),x86)
- ifeq (${IS_64_BIT}, 1)
- NO_SYSCALL_TABLE := 0
- endif
- else
- ifeq ($(SRCARCH),$(filter $(SRCARCH),powerpc arm64 s390 mips loongarch))
- NO_SYSCALL_TABLE := 0
- endif
+ ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm64 s390 mips loongarch))
+ NO_SYSCALL_TABLE := 0
endif
ifneq ($(NO_SYSCALL_TABLE),1)
@@ -55,8 +49,9 @@ endif
# Additional ARCH settings for x86
ifeq ($(SRCARCH),x86)
$(call detected,CONFIG_X86)
+ CFLAGS += -I$(OUTPUT)arch/x86/include/generated
ifeq (${IS_64_BIT}, 1)
- CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT -I$(OUTPUT)arch/x86/include/generated
+ CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT
ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind -llzma
$(call detected,CONFIG_X86_64)
diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile
index 8952e00f9b60203a..67b4969a673836eb 100644
--- a/tools/perf/arch/x86/Makefile
+++ b/tools/perf/arch/x86/Makefile
@@ -13,6 +13,7 @@ PERF_HAVE_JITDUMP := 1
generated := $(OUTPUT)arch/x86/include/generated
out := $(generated)/asm
header := $(out)/syscalls_64.c
+header_32 := $(out)/syscalls_32.c
sys := $(srctree)/tools/perf/arch/x86/entry/syscalls
systbl := $(sys)/syscalltbl.sh
@@ -22,7 +23,10 @@ $(shell [ -d '$(out)' ] || mkdir -p '$(out)')
$(header): $(sys)/syscall_64.tbl $(systbl)
$(Q)$(SHELL) '$(systbl)' $(sys)/syscall_64.tbl 'x86_64' > $@
+$(header_32): $(sys)/syscall_32.tbl $(systbl)
+ $(Q)$(SHELL) '$(systbl)' $(sys)/syscall_32.tbl 'x86' > $@
+
clean::
$(call QUIET_CLEAN, x86) $(RM) -r $(header) $(generated)
-archheaders: $(header)
+archheaders: $(header) $(header_32)
diff --git a/tools/perf/arch/x86/entry/syscalls/syscall_32.tbl b/tools/perf/arch/x86/entry/syscalls/syscall_32.tbl
new file mode 100644
index 0000000000000000..534c74b14fab5117
--- /dev/null
+++ b/tools/perf/arch/x86/entry/syscalls/syscall_32.tbl
@@ -0,0 +1,470 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# 32-bit system call numbers and entry vectors
+#
+# The format is:
+# <number> <abi> <name> <entry point> [<compat entry point> [noreturn]]
+#
+# The __ia32_sys and __ia32_compat_sys stubs are created on-the-fly for
+# sys_*() system calls and compat_sys_*() compat system calls if
+# IA32_EMULATION is defined, and expect struct pt_regs *regs as their only
+# parameter.
+#
+# The abi is always "i386" for this file.
+#
+0 i386 restart_syscall sys_restart_syscall
+1 i386 exit sys_exit - noreturn
+2 i386 fork sys_fork
+3 i386 read sys_read
+4 i386 write sys_write
+5 i386 open sys_open compat_sys_open
+6 i386 close sys_close
+7 i386 waitpid sys_waitpid
+8 i386 creat sys_creat
+9 i386 link sys_link
+10 i386 unlink sys_unlink
+11 i386 execve sys_execve compat_sys_execve
+12 i386 chdir sys_chdir
+13 i386 time sys_time32
+14 i386 mknod sys_mknod
+15 i386 chmod sys_chmod
+16 i386 lchown sys_lchown16
+17 i386 break
+18 i386 oldstat sys_stat
+19 i386 lseek sys_lseek compat_sys_lseek
+20 i386 getpid sys_getpid
+21 i386 mount sys_mount
+22 i386 umount sys_oldumount
+23 i386 setuid sys_setuid16
+24 i386 getuid sys_getuid16
+25 i386 stime sys_stime32
+26 i386 ptrace sys_ptrace compat_sys_ptrace
+27 i386 alarm sys_alarm
+28 i386 oldfstat sys_fstat
+29 i386 pause sys_pause
+30 i386 utime sys_utime32
+31 i386 stty
+32 i386 gtty
+33 i386 access sys_access
+34 i386 nice sys_nice
+35 i386 ftime
+36 i386 sync sys_sync
+37 i386 kill sys_kill
+38 i386 rename sys_rename
+39 i386 mkdir sys_mkdir
+40 i386 rmdir sys_rmdir
+41 i386 dup sys_dup
+42 i386 pipe sys_pipe
+43 i386 times sys_times compat_sys_times
+44 i386 prof
+45 i386 brk sys_brk
+46 i386 setgid sys_setgid16
+47 i386 getgid sys_getgid16
+48 i386 signal sys_signal
+49 i386 geteuid sys_geteuid16
+50 i386 getegid sys_getegid16
+51 i386 acct sys_acct
+52 i386 umount2 sys_umount
+53 i386 lock
+54 i386 ioctl sys_ioctl compat_sys_ioctl
+55 i386 fcntl sys_fcntl compat_sys_fcntl64
+56 i386 mpx
+57 i386 setpgid sys_setpgid
+58 i386 ulimit
+59 i386 oldolduname sys_olduname
+60 i386 umask sys_umask
+61 i386 chroot sys_chroot
+62 i386 ustat sys_ustat compat_sys_ustat
+63 i386 dup2 sys_dup2
+64 i386 getppid sys_getppid
+65 i386 getpgrp sys_getpgrp
+66 i386 setsid sys_setsid
+67 i386 sigaction sys_sigaction compat_sys_sigaction
+68 i386 sgetmask sys_sgetmask
+69 i386 ssetmask sys_ssetmask
+70 i386 setreuid sys_setreuid16
+71 i386 setregid sys_setregid16
+72 i386 sigsuspend sys_sigsuspend
+73 i386 sigpending sys_sigpending compat_sys_sigpending
+74 i386 sethostname sys_sethostname
+75 i386 setrlimit sys_setrlimit compat_sys_setrlimit
+76 i386 getrlimit sys_old_getrlimit compat_sys_old_getrlimit
+77 i386 getrusage sys_getrusage compat_sys_getrusage
+78 i386 gettimeofday sys_gettimeofday compat_sys_gettimeofday
+79 i386 settimeofday sys_settimeofday compat_sys_settimeofday
+80 i386 getgroups sys_getgroups16
+81 i386 setgroups sys_setgroups16
+82 i386 select sys_old_select compat_sys_old_select
+83 i386 symlink sys_symlink
+84 i386 oldlstat sys_lstat
+85 i386 readlink sys_readlink
+86 i386 uselib sys_uselib
+87 i386 swapon sys_swapon
+88 i386 reboot sys_reboot
+89 i386 readdir sys_old_readdir compat_sys_old_readdir
+90 i386 mmap sys_old_mmap compat_sys_ia32_mmap
+91 i386 munmap sys_munmap
+92 i386 truncate sys_truncate compat_sys_truncate
+93 i386 ftruncate sys_ftruncate compat_sys_ftruncate
+94 i386 fchmod sys_fchmod
+95 i386 fchown sys_fchown16
+96 i386 getpriority sys_getpriority
+97 i386 setpriority sys_setpriority
+98 i386 profil
+99 i386 statfs sys_statfs compat_sys_statfs
+100 i386 fstatfs sys_fstatfs compat_sys_fstatfs
+101 i386 ioperm sys_ioperm
+102 i386 socketcall sys_socketcall compat_sys_socketcall
+103 i386 syslog sys_syslog
+104 i386 setitimer sys_setitimer compat_sys_setitimer
+105 i386 getitimer sys_getitimer compat_sys_getitimer
+106 i386 stat sys_newstat compat_sys_newstat
+107 i386 lstat sys_newlstat compat_sys_newlstat
+108 i386 fstat sys_newfstat compat_sys_newfstat
+109 i386 olduname sys_uname
+110 i386 iopl sys_iopl
+111 i386 vhangup sys_vhangup
+112 i386 idle
+113 i386 vm86old sys_vm86old sys_ni_syscall
+114 i386 wait4 sys_wait4 compat_sys_wait4
+115 i386 swapoff sys_swapoff
+116 i386 sysinfo sys_sysinfo compat_sys_sysinfo
+117 i386 ipc sys_ipc compat_sys_ipc
+118 i386 fsync sys_fsync
+119 i386 sigreturn sys_sigreturn compat_sys_sigreturn
+120 i386 clone sys_clone compat_sys_ia32_clone
+121 i386 setdomainname sys_setdomainname
+122 i386 uname sys_newuname
+123 i386 modify_ldt sys_modify_ldt
+124 i386 adjtimex sys_adjtimex_time32
+125 i386 mprotect sys_mprotect
+126 i386 sigprocmask sys_sigprocmask compat_sys_sigprocmask
+127 i386 create_module
+128 i386 init_module sys_init_module
+129 i386 delete_module sys_delete_module
+130 i386 get_kernel_syms
+131 i386 quotactl sys_quotactl
+132 i386 getpgid sys_getpgid
+133 i386 fchdir sys_fchdir
+134 i386 bdflush sys_ni_syscall
+135 i386 sysfs sys_sysfs
+136 i386 personality sys_personality
+137 i386 afs_syscall
+138 i386 setfsuid sys_setfsuid16
+139 i386 setfsgid sys_setfsgid16
+140 i386 _llseek sys_llseek
+141 i386 getdents sys_getdents compat_sys_getdents
+142 i386 _newselect sys_select compat_sys_select
+143 i386 flock sys_flock
+144 i386 msync sys_msync
+145 i386 readv sys_readv
+146 i386 writev sys_writev
+147 i386 getsid sys_getsid
+148 i386 fdatasync sys_fdatasync
+149 i386 _sysctl sys_ni_syscall
+150 i386 mlock sys_mlock
+151 i386 munlock sys_munlock
+152 i386 mlockall sys_mlockall
+153 i386 munlockall sys_munlockall
+154 i386 sched_setparam sys_sched_setparam
+155 i386 sched_getparam sys_sched_getparam
+156 i386 sched_setscheduler sys_sched_setscheduler
+157 i386 sched_getscheduler sys_sched_getscheduler
+158 i386 sched_yield sys_sched_yield
+159 i386 sched_get_priority_max sys_sched_get_priority_max
+160 i386 sched_get_priority_min sys_sched_get_priority_min
+161 i386 sched_rr_get_interval sys_sched_rr_get_interval_time32
+162 i386 nanosleep sys_nanosleep_time32
+163 i386 mremap sys_mremap
+164 i386 setresuid sys_setresuid16
+165 i386 getresuid sys_getresuid16
+166 i386 vm86 sys_vm86 sys_ni_syscall
+167 i386 query_module
+168 i386 poll sys_poll
+169 i386 nfsservctl
+170 i386 setresgid sys_setresgid16
+171 i386 getresgid sys_getresgid16
+172 i386 prctl sys_prctl
+173 i386 rt_sigreturn sys_rt_sigreturn compat_sys_rt_sigreturn
+174 i386 rt_sigaction sys_rt_sigaction compat_sys_rt_sigaction
+175 i386 rt_sigprocmask sys_rt_sigprocmask compat_sys_rt_sigprocmask
+176 i386 rt_sigpending sys_rt_sigpending compat_sys_rt_sigpending
+177 i386 rt_sigtimedwait sys_rt_sigtimedwait_time32 compat_sys_rt_sigtimedwait_time32
+178 i386 rt_sigqueueinfo sys_rt_sigqueueinfo compat_sys_rt_sigqueueinfo
+179 i386 rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend
+180 i386 pread64 sys_ia32_pread64
+181 i386 pwrite64 sys_ia32_pwrite64
+182 i386 chown sys_chown16
+183 i386 getcwd sys_getcwd
+184 i386 capget sys_capget
+185 i386 capset sys_capset
+186 i386 sigaltstack sys_sigaltstack compat_sys_sigaltstack
+187 i386 sendfile sys_sendfile compat_sys_sendfile
+188 i386 getpmsg
+189 i386 putpmsg
+190 i386 vfork sys_vfork
+191 i386 ugetrlimit sys_getrlimit compat_sys_getrlimit
+192 i386 mmap2 sys_mmap_pgoff
+193 i386 truncate64 sys_ia32_truncate64
+194 i386 ftruncate64 sys_ia32_ftruncate64
+195 i386 stat64 sys_stat64 compat_sys_ia32_stat64
+196 i386 lstat64 sys_lstat64 compat_sys_ia32_lstat64
+197 i386 fstat64 sys_fstat64 compat_sys_ia32_fstat64
+198 i386 lchown32 sys_lchown
+199 i386 getuid32 sys_getuid
+200 i386 getgid32 sys_getgid
+201 i386 geteuid32 sys_geteuid
+202 i386 getegid32 sys_getegid
+203 i386 setreuid32 sys_setreuid
+204 i386 setregid32 sys_setregid
+205 i386 getgroups32 sys_getgroups
+206 i386 setgroups32 sys_setgroups
+207 i386 fchown32 sys_fchown
+208 i386 setresuid32 sys_setresuid
+209 i386 getresuid32 sys_getresuid
+210 i386 setresgid32 sys_setresgid
+211 i386 getresgid32 sys_getresgid
+212 i386 chown32 sys_chown
+213 i386 setuid32 sys_setuid
+214 i386 setgid32 sys_setgid
+215 i386 setfsuid32 sys_setfsuid
+216 i386 setfsgid32 sys_setfsgid
+217 i386 pivot_root sys_pivot_root
+218 i386 mincore sys_mincore
+219 i386 madvise sys_madvise
+220 i386 getdents64 sys_getdents64
+221 i386 fcntl64 sys_fcntl64 compat_sys_fcntl64
+# 222 is unused
+# 223 is unused
+224 i386 gettid sys_gettid
+225 i386 readahead sys_ia32_readahead
+226 i386 setxattr sys_setxattr
+227 i386 lsetxattr sys_lsetxattr
+228 i386 fsetxattr sys_fsetxattr
+229 i386 getxattr sys_getxattr
+230 i386 lgetxattr sys_lgetxattr
+231 i386 fgetxattr sys_fgetxattr
+232 i386 listxattr sys_listxattr
+233 i386 llistxattr sys_llistxattr
+234 i386 flistxattr sys_flistxattr
+235 i386 removexattr sys_removexattr
+236 i386 lremovexattr sys_lremovexattr
+237 i386 fremovexattr sys_fremovexattr
+238 i386 tkill sys_tkill
+239 i386 sendfile64 sys_sendfile64
+240 i386 futex sys_futex_time32
+241 i386 sched_setaffinity sys_sched_setaffinity compat_sys_sched_setaffinity
+242 i386 sched_getaffinity sys_sched_getaffinity compat_sys_sched_getaffinity
+243 i386 set_thread_area sys_set_thread_area
+244 i386 get_thread_area sys_get_thread_area
+245 i386 io_setup sys_io_setup compat_sys_io_setup
+246 i386 io_destroy sys_io_destroy
+247 i386 io_getevents sys_io_getevents_time32
+248 i386 io_submit sys_io_submit compat_sys_io_submit
+249 i386 io_cancel sys_io_cancel
+250 i386 fadvise64 sys_ia32_fadvise64
+# 251 is available for reuse (was briefly sys_set_zone_reclaim)
+252 i386 exit_group sys_exit_group - noreturn
+253 i386 lookup_dcookie
+254 i386 epoll_create sys_epoll_create
+255 i386 epoll_ctl sys_epoll_ctl
+256 i386 epoll_wait sys_epoll_wait
+257 i386 remap_file_pages sys_remap_file_pages
+258 i386 set_tid_address sys_set_tid_address
+259 i386 timer_create sys_timer_create compat_sys_timer_create
+260 i386 timer_settime sys_timer_settime32
+261 i386 timer_gettime sys_timer_gettime32
+262 i386 timer_getoverrun sys_timer_getoverrun
+263 i386 timer_delete sys_timer_delete
+264 i386 clock_settime sys_clock_settime32
+265 i386 clock_gettime sys_clock_gettime32
+266 i386 clock_getres sys_clock_getres_time32
+267 i386 clock_nanosleep sys_clock_nanosleep_time32
+268 i386 statfs64 sys_statfs64 compat_sys_statfs64
+269 i386 fstatfs64 sys_fstatfs64 compat_sys_fstatfs64
+270 i386 tgkill sys_tgkill
+271 i386 utimes sys_utimes_time32
+272 i386 fadvise64_64 sys_ia32_fadvise64_64
+273 i386 vserver
+274 i386 mbind sys_mbind
+275 i386 get_mempolicy sys_get_mempolicy
+276 i386 set_mempolicy sys_set_mempolicy
+277 i386 mq_open sys_mq_open compat_sys_mq_open
+278 i386 mq_unlink sys_mq_unlink
+279 i386 mq_timedsend sys_mq_timedsend_time32
+280 i386 mq_timedreceive sys_mq_timedreceive_time32
+281 i386 mq_notify sys_mq_notify compat_sys_mq_notify
+282 i386 mq_getsetattr sys_mq_getsetattr compat_sys_mq_getsetattr
+283 i386 kexec_load sys_kexec_load compat_sys_kexec_load
+284 i386 waitid sys_waitid compat_sys_waitid
+# 285 sys_setaltroot
+286 i386 add_key sys_add_key
+287 i386 request_key sys_request_key
+288 i386 keyctl sys_keyctl compat_sys_keyctl
+289 i386 ioprio_set sys_ioprio_set
+290 i386 ioprio_get sys_ioprio_get
+291 i386 inotify_init sys_inotify_init
+292 i386 inotify_add_watch sys_inotify_add_watch
+293 i386 inotify_rm_watch sys_inotify_rm_watch
+294 i386 migrate_pages sys_migrate_pages
+295 i386 openat sys_openat compat_sys_openat
+296 i386 mkdirat sys_mkdirat
+297 i386 mknodat sys_mknodat
+298 i386 fchownat sys_fchownat
+299 i386 futimesat sys_futimesat_time32
+300 i386 fstatat64 sys_fstatat64 compat_sys_ia32_fstatat64
+301 i386 unlinkat sys_unlinkat
+302 i386 renameat sys_renameat
+303 i386 linkat sys_linkat
+304 i386 symlinkat sys_symlinkat
+305 i386 readlinkat sys_readlinkat
+306 i386 fchmodat sys_fchmodat
+307 i386 faccessat sys_faccessat
+308 i386 pselect6 sys_pselect6_time32 compat_sys_pselect6_time32
+309 i386 ppoll sys_ppoll_time32 compat_sys_ppoll_time32
+310 i386 unshare sys_unshare
+311 i386 set_robust_list sys_set_robust_list compat_sys_set_robust_list
+312 i386 get_robust_list sys_get_robust_list compat_sys_get_robust_list
+313 i386 splice sys_splice
+314 i386 sync_file_range sys_ia32_sync_file_range
+315 i386 tee sys_tee
+316 i386 vmsplice sys_vmsplice
+317 i386 move_pages sys_move_pages
+318 i386 getcpu sys_getcpu
+319 i386 epoll_pwait sys_epoll_pwait
+320 i386 utimensat sys_utimensat_time32
+321 i386 signalfd sys_signalfd compat_sys_signalfd
+322 i386 timerfd_create sys_timerfd_create
+323 i386 eventfd sys_eventfd
+324 i386 fallocate sys_ia32_fallocate
+325 i386 timerfd_settime sys_timerfd_settime32
+326 i386 timerfd_gettime sys_timerfd_gettime32
+327 i386 signalfd4 sys_signalfd4 compat_sys_signalfd4
+328 i386 eventfd2 sys_eventfd2
+329 i386 epoll_create1 sys_epoll_create1
+330 i386 dup3 sys_dup3
+331 i386 pipe2 sys_pipe2
+332 i386 inotify_init1 sys_inotify_init1
+333 i386 preadv sys_preadv compat_sys_preadv
+334 i386 pwritev sys_pwritev compat_sys_pwritev
+335 i386 rt_tgsigqueueinfo sys_rt_tgsigqueueinfo compat_sys_rt_tgsigqueueinfo
+336 i386 perf_event_open sys_perf_event_open
+337 i386 recvmmsg sys_recvmmsg_time32 compat_sys_recvmmsg_time32
+338 i386 fanotify_init sys_fanotify_init
+339 i386 fanotify_mark sys_fanotify_mark compat_sys_fanotify_mark
+340 i386 prlimit64 sys_prlimit64
+341 i386 name_to_handle_at sys_name_to_handle_at
+342 i386 open_by_handle_at sys_open_by_handle_at compat_sys_open_by_handle_at
+343 i386 clock_adjtime sys_clock_adjtime32
+344 i386 syncfs sys_syncfs
+345 i386 sendmmsg sys_sendmmsg compat_sys_sendmmsg
+346 i386 setns sys_setns
+347 i386 process_vm_readv sys_process_vm_readv
+348 i386 process_vm_writev sys_process_vm_writev
+349 i386 kcmp sys_kcmp
+350 i386 finit_module sys_finit_module
+351 i386 sched_setattr sys_sched_setattr
+352 i386 sched_getattr sys_sched_getattr
+353 i386 renameat2 sys_renameat2
+354 i386 seccomp sys_seccomp
+355 i386 getrandom sys_getrandom
+356 i386 memfd_create sys_memfd_create
+357 i386 bpf sys_bpf
+358 i386 execveat sys_execveat compat_sys_execveat
+359 i386 socket sys_socket
+360 i386 socketpair sys_socketpair
+361 i386 bind sys_bind
+362 i386 connect sys_connect
+363 i386 listen sys_listen
+364 i386 accept4 sys_accept4
+365 i386 getsockopt sys_getsockopt sys_getsockopt
+366 i386 setsockopt sys_setsockopt sys_setsockopt
+367 i386 getsockname sys_getsockname
+368 i386 getpeername sys_getpeername
+369 i386 sendto sys_sendto
+370 i386 sendmsg sys_sendmsg compat_sys_sendmsg
+371 i386 recvfrom sys_recvfrom compat_sys_recvfrom
+372 i386 recvmsg sys_recvmsg compat_sys_recvmsg
+373 i386 shutdown sys_shutdown
+374 i386 userfaultfd sys_userfaultfd
+375 i386 membarrier sys_membarrier
+376 i386 mlock2 sys_mlock2
+377 i386 copy_file_range sys_copy_file_range
+378 i386 preadv2 sys_preadv2 compat_sys_preadv2
+379 i386 pwritev2 sys_pwritev2 compat_sys_pwritev2
+380 i386 pkey_mprotect sys_pkey_mprotect
+381 i386 pkey_alloc sys_pkey_alloc
+382 i386 pkey_free sys_pkey_free
+383 i386 statx sys_statx
+384 i386 arch_prctl sys_arch_prctl compat_sys_arch_prctl
+385 i386 io_pgetevents sys_io_pgetevents_time32 compat_sys_io_pgetevents
+386 i386 rseq sys_rseq
+393 i386 semget sys_semget
+394 i386 semctl sys_semctl compat_sys_semctl
+395 i386 shmget sys_shmget
+396 i386 shmctl sys_shmctl compat_sys_shmctl
+397 i386 shmat sys_shmat compat_sys_shmat
+398 i386 shmdt sys_shmdt
+399 i386 msgget sys_msgget
+400 i386 msgsnd sys_msgsnd compat_sys_msgsnd
+401 i386 msgrcv sys_msgrcv compat_sys_msgrcv
+402 i386 msgctl sys_msgctl compat_sys_msgctl
+403 i386 clock_gettime64 sys_clock_gettime
+404 i386 clock_settime64 sys_clock_settime
+405 i386 clock_adjtime64 sys_clock_adjtime
+406 i386 clock_getres_time64 sys_clock_getres
+407 i386 clock_nanosleep_time64 sys_clock_nanosleep
+408 i386 timer_gettime64 sys_timer_gettime
+409 i386 timer_settime64 sys_timer_settime
+410 i386 timerfd_gettime64 sys_timerfd_gettime
+411 i386 timerfd_settime64 sys_timerfd_settime
+412 i386 utimensat_time64 sys_utimensat
+413 i386 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
+414 i386 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
+416 i386 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
+417 i386 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
+418 i386 mq_timedsend_time64 sys_mq_timedsend
+419 i386 mq_timedreceive_time64 sys_mq_timedreceive
+420 i386 semtimedop_time64 sys_semtimedop
+421 i386 rt_sigtimedwait_time64 sys_rt_sigtimedwait compat_sys_rt_sigtimedwait_time64
+422 i386 futex_time64 sys_futex
+423 i386 sched_rr_get_interval_time64 sys_sched_rr_get_interval
+424 i386 pidfd_send_signal sys_pidfd_send_signal
+425 i386 io_uring_setup sys_io_uring_setup
+426 i386 io_uring_enter sys_io_uring_enter
+427 i386 io_uring_register sys_io_uring_register
+428 i386 open_tree sys_open_tree
+429 i386 move_mount sys_move_mount
+430 i386 fsopen sys_fsopen
+431 i386 fsconfig sys_fsconfig
+432 i386 fsmount sys_fsmount
+433 i386 fspick sys_fspick
+434 i386 pidfd_open sys_pidfd_open
+435 i386 clone3 sys_clone3
+436 i386 close_range sys_close_range
+437 i386 openat2 sys_openat2
+438 i386 pidfd_getfd sys_pidfd_getfd
+439 i386 faccessat2 sys_faccessat2
+440 i386 process_madvise sys_process_madvise
+441 i386 epoll_pwait2 sys_epoll_pwait2 compat_sys_epoll_pwait2
+442 i386 mount_setattr sys_mount_setattr
+443 i386 quotactl_fd sys_quotactl_fd
+444 i386 landlock_create_ruleset sys_landlock_create_ruleset
+445 i386 landlock_add_rule sys_landlock_add_rule
+446 i386 landlock_restrict_self sys_landlock_restrict_self
+447 i386 memfd_secret sys_memfd_secret
+448 i386 process_mrelease sys_process_mrelease
+449 i386 futex_waitv sys_futex_waitv
+450 i386 set_mempolicy_home_node sys_set_mempolicy_home_node
+451 i386 cachestat sys_cachestat
+452 i386 fchmodat2 sys_fchmodat2
+453 i386 map_shadow_stack sys_map_shadow_stack
+454 i386 futex_wake sys_futex_wake
+455 i386 futex_wait sys_futex_wait
+456 i386 futex_requeue sys_futex_requeue
+457 i386 statmount sys_statmount
+458 i386 listmount sys_listmount
+459 i386 lsm_get_self_attr sys_lsm_get_self_attr
+460 i386 lsm_set_self_attr sys_lsm_set_self_attr
+461 i386 lsm_list_modules sys_lsm_list_modules
+462 i386 mseal sys_mseal
--git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh
index 672421b858ac1a7f..714c78e5da07c163 100755
--- a/tools/perf/check-headers.sh
+++ b/tools/perf/check-headers.sh
@@ -172,6 +172,7 @@ check lib/ctype.c '-I "^EXPORT_SYMBOL" -I "^#include <linux/export.h>" -B
check lib/list_sort.c '-I "^#include <linux/bug.h>"'
# diff non-symmetric files
+check_2 tools/perf/arch/x86/entry/syscalls/syscall_32.tbl arch/x86/entry/syscalls/syscall_32.tbl
check_2 tools/perf/arch/x86/entry/syscalls/syscall_64.tbl arch/x86/entry/syscalls/syscall_64.tbl
check_2 tools/perf/arch/powerpc/entry/syscalls/syscall.tbl arch/powerpc/kernel/syscalls/syscall.tbl
check_2 tools/perf/arch/s390/entry/syscalls/syscall.tbl arch/s390/kernel/syscalls/syscall.tbl
diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
index 0dd26b991b3fb513..7c15dec6900d8aaa 100644
--- a/tools/perf/util/syscalltbl.c
+++ b/tools/perf/util/syscalltbl.c
@@ -18,6 +18,10 @@
#include <asm/syscalls_64.c>
const int syscalltbl_native_max_id = SYSCALLTBL_x86_64_MAX_ID;
static const char *const *syscalltbl_native = syscalltbl_x86_64;
+#elif defined(__i386__)
+#include <asm/syscalls_32.c>
+const int syscalltbl_native_max_id = SYSCALLTBL_x86_MAX_ID;
+static const char *const *syscalltbl_native = syscalltbl_x86;
#elif defined(__s390x__)
#include <asm/syscalls_64.c>
const int syscalltbl_native_max_id = SYSCALLTBL_S390_64_MAX_ID;
--
2.46.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-08-30 23:30 ` [PATCH/RFT] " Arnaldo Carvalho de Melo
@ 2024-08-31 0:35 ` Ian Rogers
2024-09-02 18:53 ` Arnaldo Carvalho de Melo
2024-09-02 5:25 ` Jiri Slaby
1 sibling, 1 reply; 38+ messages in thread
From: Ian Rogers @ 2024-08-31 0:35 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Jiri Slaby, Howard Chu, Adrian Hunter, Jiri Olsa, Kan Liang,
Namhyung Kim, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On Fri, Aug 30, 2024 at 4:30 PM Arnaldo Carvalho de Melo
<acme@kernel.org> wrote:
>
> On Fri, Aug 30, 2024 at 12:24:29PM +0200, Jiri Slaby wrote:
> > This broke NO_SYSCALL_TABLE builds. i586 in particular
> > (HAVE_SYSCALL_TABLE_SUPPORT is undefined there):
> > > gcc -fomit-frame-pointer -O2 -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-protector-strong -funwind-tables -fasynchronous
> > > perf-in.o -Wl,--whole-archive /home/abuild/rpmbuild/BUILD/tools/perf/libapi/libapi.a /home/abuild/rpmbuild/BUILD/tools/pe
> > > /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld: perf-in.o: in function `cmd_trace':
> > > (.text+0x81411): undefined reference to `syscalltbl__id_at_idx'
> > > /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld: (.text+0x814b2): undefined reference to `syscalltbl__id_at_idx'
> > > /usr/lib/gcc/i586-suse-linux/14/../../../../i586-suse-linux/bin/ld: (.text+0x8154c): undefined reference to `syscalltbl__id_at_idx'
> >
> > Should there be something like a function returning identity mapping for
> > !HAVE_SYSCALL_TABLE_SUPPORT?
>
> I'll address this later, meantime I'm adding the patch below to
> perf-tools-next, probably your fix/suggestion of an identity mapping is
> way shorter and solves the !HAVE_SYSCALL_TABLE_SUPPORT case and thus
> should go to perf-tools.
>
> Please test the patch below and see if it fixes things for you, for me,
> with this container:
>
> WARNING: image platform (linux/386) does not match the expected platform (linux/amd64)
> WARNING: image platform (linux/386) does not match the expected platform (linux/amd64)
> 110.55 almalinux:9-i386 : Ok gcc (GCC) 11.4.1 20231218 (Red Hat 11.4.1-3) , clang version 17.0.6 (AlmaLinux OS Foundation 17.0.6-5.el9) flex 2.6.4
> BUILD_TARBALL_HEAD=174899051e54ecdab06c07652a3d04ad000ab301
>
> Using https://hub.docker.com/r/almalinux/i386/tags
>
> It builds as part of my set of tools[1] (not perf specific, I use it for
> pahole as well) build containers, using gcc and clang, with/without
> various build options, and will thus be tested from now on before I push
> things upstream.
>
> - Arnaldo
>
> [1] https://github.com/acmel/linux-tools-container-builds
>
> From 174899051e54ecdab06c07652a3d04ad000ab301 Mon Sep 17 00:00:00 2001
> From: Arnaldo Carvalho de Melo <acme@redhat.com>
> Date: Fri, 30 Aug 2024 19:53:47 -0300
> Subject: [PATCH 1/1] perf tools: Build x86 32-bit syscall table from
> arch/x86/entry/syscalls/syscall_32.tbl
>
> To remove one more use of the audit libs and address a problem reported
> with a recent change where a function isn't available when using the
> audit libs method, that should really go away, this being one step in
> that direction.
>
> The script used to generate the 64-bit syscall table was already
> parametrized to generate for both 64-bit and 32-bit, so just use it and
> wire the generated table to the syscalltbl.c routines.
>
> Reported-by: Jiri Slaby <jirislaby@kernel.org>
> Suggested-by: Ian Rogers <irogers@google.com>
> Cc: Adrian Hunter <adrian.hunter@intel.com>
> Cc: Howard Chu <howardchu95@gmail.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: Kan Liang <kan.liang@linux.intel.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Link: https://lore.kernel.org/lkml/6fe63fa3-6c63-4b75-ac09-884d26f6fb95@kernel.org
> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This looks great!
Reviewed-by: Ian Rogers <irogers@google.com>
It seems strange to me that the 64-bit binary doesn't need a 32-bit
syscall table given it could start a 32-bit binary, but that's a
problem for another day.
Thanks,
Ian
> ---
> tools/perf/Makefile.config | 13 +-
> tools/perf/arch/x86/Makefile | 6 +-
> .../arch/x86/entry/syscalls/syscall_32.tbl | 470 ++++++++++++++++++
> tools/perf/check-headers.sh | 1 +
> tools/perf/util/syscalltbl.c | 4 +
> 5 files changed, 484 insertions(+), 10 deletions(-)
> create mode 100644 tools/perf/arch/x86/entry/syscalls/syscall_32.tbl
>
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 4eb1fc897baf64b8..9998cd7a879206ae 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -31,14 +31,8 @@ $(call detected_var,SRCARCH)
> ifneq ($(NO_SYSCALL_TABLE),1)
> NO_SYSCALL_TABLE := 1
>
> - ifeq ($(SRCARCH),x86)
> - ifeq (${IS_64_BIT}, 1)
> - NO_SYSCALL_TABLE := 0
> - endif
> - else
> - ifeq ($(SRCARCH),$(filter $(SRCARCH),powerpc arm64 s390 mips loongarch))
> - NO_SYSCALL_TABLE := 0
> - endif
> + ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm64 s390 mips loongarch))
> + NO_SYSCALL_TABLE := 0
> endif
>
> ifneq ($(NO_SYSCALL_TABLE),1)
> @@ -55,8 +49,9 @@ endif
> # Additional ARCH settings for x86
> ifeq ($(SRCARCH),x86)
> $(call detected,CONFIG_X86)
> + CFLAGS += -I$(OUTPUT)arch/x86/include/generated
> ifeq (${IS_64_BIT}, 1)
> - CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT -I$(OUTPUT)arch/x86/include/generated
> + CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT
> ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
> LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind -llzma
> $(call detected,CONFIG_X86_64)
> diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile
> index 8952e00f9b60203a..67b4969a673836eb 100644
> --- a/tools/perf/arch/x86/Makefile
> +++ b/tools/perf/arch/x86/Makefile
> @@ -13,6 +13,7 @@ PERF_HAVE_JITDUMP := 1
> generated := $(OUTPUT)arch/x86/include/generated
> out := $(generated)/asm
> header := $(out)/syscalls_64.c
> +header_32 := $(out)/syscalls_32.c
> sys := $(srctree)/tools/perf/arch/x86/entry/syscalls
> systbl := $(sys)/syscalltbl.sh
>
> @@ -22,7 +23,10 @@ $(shell [ -d '$(out)' ] || mkdir -p '$(out)')
> $(header): $(sys)/syscall_64.tbl $(systbl)
> $(Q)$(SHELL) '$(systbl)' $(sys)/syscall_64.tbl 'x86_64' > $@
>
> +$(header_32): $(sys)/syscall_32.tbl $(systbl)
> + $(Q)$(SHELL) '$(systbl)' $(sys)/syscall_32.tbl 'x86' > $@
> +
> clean::
> $(call QUIET_CLEAN, x86) $(RM) -r $(header) $(generated)
>
> -archheaders: $(header)
> +archheaders: $(header) $(header_32)
> diff --git a/tools/perf/arch/x86/entry/syscalls/syscall_32.tbl b/tools/perf/arch/x86/entry/syscalls/syscall_32.tbl
> new file mode 100644
> index 0000000000000000..534c74b14fab5117
> --- /dev/null
> +++ b/tools/perf/arch/x86/entry/syscalls/syscall_32.tbl
> @@ -0,0 +1,470 @@
> +# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
> +#
> +# 32-bit system call numbers and entry vectors
> +#
> +# The format is:
> +# <number> <abi> <name> <entry point> [<compat entry point> [noreturn]]
> +#
> +# The __ia32_sys and __ia32_compat_sys stubs are created on-the-fly for
> +# sys_*() system calls and compat_sys_*() compat system calls if
> +# IA32_EMULATION is defined, and expect struct pt_regs *regs as their only
> +# parameter.
> +#
> +# The abi is always "i386" for this file.
> +#
> +0 i386 restart_syscall sys_restart_syscall
> +1 i386 exit sys_exit - noreturn
> +2 i386 fork sys_fork
> +3 i386 read sys_read
> +4 i386 write sys_write
> +5 i386 open sys_open compat_sys_open
> +6 i386 close sys_close
> +7 i386 waitpid sys_waitpid
> +8 i386 creat sys_creat
> +9 i386 link sys_link
> +10 i386 unlink sys_unlink
> +11 i386 execve sys_execve compat_sys_execve
> +12 i386 chdir sys_chdir
> +13 i386 time sys_time32
> +14 i386 mknod sys_mknod
> +15 i386 chmod sys_chmod
> +16 i386 lchown sys_lchown16
> +17 i386 break
> +18 i386 oldstat sys_stat
> +19 i386 lseek sys_lseek compat_sys_lseek
> +20 i386 getpid sys_getpid
> +21 i386 mount sys_mount
> +22 i386 umount sys_oldumount
> +23 i386 setuid sys_setuid16
> +24 i386 getuid sys_getuid16
> +25 i386 stime sys_stime32
> +26 i386 ptrace sys_ptrace compat_sys_ptrace
> +27 i386 alarm sys_alarm
> +28 i386 oldfstat sys_fstat
> +29 i386 pause sys_pause
> +30 i386 utime sys_utime32
> +31 i386 stty
> +32 i386 gtty
> +33 i386 access sys_access
> +34 i386 nice sys_nice
> +35 i386 ftime
> +36 i386 sync sys_sync
> +37 i386 kill sys_kill
> +38 i386 rename sys_rename
> +39 i386 mkdir sys_mkdir
> +40 i386 rmdir sys_rmdir
> +41 i386 dup sys_dup
> +42 i386 pipe sys_pipe
> +43 i386 times sys_times compat_sys_times
> +44 i386 prof
> +45 i386 brk sys_brk
> +46 i386 setgid sys_setgid16
> +47 i386 getgid sys_getgid16
> +48 i386 signal sys_signal
> +49 i386 geteuid sys_geteuid16
> +50 i386 getegid sys_getegid16
> +51 i386 acct sys_acct
> +52 i386 umount2 sys_umount
> +53 i386 lock
> +54 i386 ioctl sys_ioctl compat_sys_ioctl
> +55 i386 fcntl sys_fcntl compat_sys_fcntl64
> +56 i386 mpx
> +57 i386 setpgid sys_setpgid
> +58 i386 ulimit
> +59 i386 oldolduname sys_olduname
> +60 i386 umask sys_umask
> +61 i386 chroot sys_chroot
> +62 i386 ustat sys_ustat compat_sys_ustat
> +63 i386 dup2 sys_dup2
> +64 i386 getppid sys_getppid
> +65 i386 getpgrp sys_getpgrp
> +66 i386 setsid sys_setsid
> +67 i386 sigaction sys_sigaction compat_sys_sigaction
> +68 i386 sgetmask sys_sgetmask
> +69 i386 ssetmask sys_ssetmask
> +70 i386 setreuid sys_setreuid16
> +71 i386 setregid sys_setregid16
> +72 i386 sigsuspend sys_sigsuspend
> +73 i386 sigpending sys_sigpending compat_sys_sigpending
> +74 i386 sethostname sys_sethostname
> +75 i386 setrlimit sys_setrlimit compat_sys_setrlimit
> +76 i386 getrlimit sys_old_getrlimit compat_sys_old_getrlimit
> +77 i386 getrusage sys_getrusage compat_sys_getrusage
> +78 i386 gettimeofday sys_gettimeofday compat_sys_gettimeofday
> +79 i386 settimeofday sys_settimeofday compat_sys_settimeofday
> +80 i386 getgroups sys_getgroups16
> +81 i386 setgroups sys_setgroups16
> +82 i386 select sys_old_select compat_sys_old_select
> +83 i386 symlink sys_symlink
> +84 i386 oldlstat sys_lstat
> +85 i386 readlink sys_readlink
> +86 i386 uselib sys_uselib
> +87 i386 swapon sys_swapon
> +88 i386 reboot sys_reboot
> +89 i386 readdir sys_old_readdir compat_sys_old_readdir
> +90 i386 mmap sys_old_mmap compat_sys_ia32_mmap
> +91 i386 munmap sys_munmap
> +92 i386 truncate sys_truncate compat_sys_truncate
> +93 i386 ftruncate sys_ftruncate compat_sys_ftruncate
> +94 i386 fchmod sys_fchmod
> +95 i386 fchown sys_fchown16
> +96 i386 getpriority sys_getpriority
> +97 i386 setpriority sys_setpriority
> +98 i386 profil
> +99 i386 statfs sys_statfs compat_sys_statfs
> +100 i386 fstatfs sys_fstatfs compat_sys_fstatfs
> +101 i386 ioperm sys_ioperm
> +102 i386 socketcall sys_socketcall compat_sys_socketcall
> +103 i386 syslog sys_syslog
> +104 i386 setitimer sys_setitimer compat_sys_setitimer
> +105 i386 getitimer sys_getitimer compat_sys_getitimer
> +106 i386 stat sys_newstat compat_sys_newstat
> +107 i386 lstat sys_newlstat compat_sys_newlstat
> +108 i386 fstat sys_newfstat compat_sys_newfstat
> +109 i386 olduname sys_uname
> +110 i386 iopl sys_iopl
> +111 i386 vhangup sys_vhangup
> +112 i386 idle
> +113 i386 vm86old sys_vm86old sys_ni_syscall
> +114 i386 wait4 sys_wait4 compat_sys_wait4
> +115 i386 swapoff sys_swapoff
> +116 i386 sysinfo sys_sysinfo compat_sys_sysinfo
> +117 i386 ipc sys_ipc compat_sys_ipc
> +118 i386 fsync sys_fsync
> +119 i386 sigreturn sys_sigreturn compat_sys_sigreturn
> +120 i386 clone sys_clone compat_sys_ia32_clone
> +121 i386 setdomainname sys_setdomainname
> +122 i386 uname sys_newuname
> +123 i386 modify_ldt sys_modify_ldt
> +124 i386 adjtimex sys_adjtimex_time32
> +125 i386 mprotect sys_mprotect
> +126 i386 sigprocmask sys_sigprocmask compat_sys_sigprocmask
> +127 i386 create_module
> +128 i386 init_module sys_init_module
> +129 i386 delete_module sys_delete_module
> +130 i386 get_kernel_syms
> +131 i386 quotactl sys_quotactl
> +132 i386 getpgid sys_getpgid
> +133 i386 fchdir sys_fchdir
> +134 i386 bdflush sys_ni_syscall
> +135 i386 sysfs sys_sysfs
> +136 i386 personality sys_personality
> +137 i386 afs_syscall
> +138 i386 setfsuid sys_setfsuid16
> +139 i386 setfsgid sys_setfsgid16
> +140 i386 _llseek sys_llseek
> +141 i386 getdents sys_getdents compat_sys_getdents
> +142 i386 _newselect sys_select compat_sys_select
> +143 i386 flock sys_flock
> +144 i386 msync sys_msync
> +145 i386 readv sys_readv
> +146 i386 writev sys_writev
> +147 i386 getsid sys_getsid
> +148 i386 fdatasync sys_fdatasync
> +149 i386 _sysctl sys_ni_syscall
> +150 i386 mlock sys_mlock
> +151 i386 munlock sys_munlock
> +152 i386 mlockall sys_mlockall
> +153 i386 munlockall sys_munlockall
> +154 i386 sched_setparam sys_sched_setparam
> +155 i386 sched_getparam sys_sched_getparam
> +156 i386 sched_setscheduler sys_sched_setscheduler
> +157 i386 sched_getscheduler sys_sched_getscheduler
> +158 i386 sched_yield sys_sched_yield
> +159 i386 sched_get_priority_max sys_sched_get_priority_max
> +160 i386 sched_get_priority_min sys_sched_get_priority_min
> +161 i386 sched_rr_get_interval sys_sched_rr_get_interval_time32
> +162 i386 nanosleep sys_nanosleep_time32
> +163 i386 mremap sys_mremap
> +164 i386 setresuid sys_setresuid16
> +165 i386 getresuid sys_getresuid16
> +166 i386 vm86 sys_vm86 sys_ni_syscall
> +167 i386 query_module
> +168 i386 poll sys_poll
> +169 i386 nfsservctl
> +170 i386 setresgid sys_setresgid16
> +171 i386 getresgid sys_getresgid16
> +172 i386 prctl sys_prctl
> +173 i386 rt_sigreturn sys_rt_sigreturn compat_sys_rt_sigreturn
> +174 i386 rt_sigaction sys_rt_sigaction compat_sys_rt_sigaction
> +175 i386 rt_sigprocmask sys_rt_sigprocmask compat_sys_rt_sigprocmask
> +176 i386 rt_sigpending sys_rt_sigpending compat_sys_rt_sigpending
> +177 i386 rt_sigtimedwait sys_rt_sigtimedwait_time32 compat_sys_rt_sigtimedwait_time32
> +178 i386 rt_sigqueueinfo sys_rt_sigqueueinfo compat_sys_rt_sigqueueinfo
> +179 i386 rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend
> +180 i386 pread64 sys_ia32_pread64
> +181 i386 pwrite64 sys_ia32_pwrite64
> +182 i386 chown sys_chown16
> +183 i386 getcwd sys_getcwd
> +184 i386 capget sys_capget
> +185 i386 capset sys_capset
> +186 i386 sigaltstack sys_sigaltstack compat_sys_sigaltstack
> +187 i386 sendfile sys_sendfile compat_sys_sendfile
> +188 i386 getpmsg
> +189 i386 putpmsg
> +190 i386 vfork sys_vfork
> +191 i386 ugetrlimit sys_getrlimit compat_sys_getrlimit
> +192 i386 mmap2 sys_mmap_pgoff
> +193 i386 truncate64 sys_ia32_truncate64
> +194 i386 ftruncate64 sys_ia32_ftruncate64
> +195 i386 stat64 sys_stat64 compat_sys_ia32_stat64
> +196 i386 lstat64 sys_lstat64 compat_sys_ia32_lstat64
> +197 i386 fstat64 sys_fstat64 compat_sys_ia32_fstat64
> +198 i386 lchown32 sys_lchown
> +199 i386 getuid32 sys_getuid
> +200 i386 getgid32 sys_getgid
> +201 i386 geteuid32 sys_geteuid
> +202 i386 getegid32 sys_getegid
> +203 i386 setreuid32 sys_setreuid
> +204 i386 setregid32 sys_setregid
> +205 i386 getgroups32 sys_getgroups
> +206 i386 setgroups32 sys_setgroups
> +207 i386 fchown32 sys_fchown
> +208 i386 setresuid32 sys_setresuid
> +209 i386 getresuid32 sys_getresuid
> +210 i386 setresgid32 sys_setresgid
> +211 i386 getresgid32 sys_getresgid
> +212 i386 chown32 sys_chown
> +213 i386 setuid32 sys_setuid
> +214 i386 setgid32 sys_setgid
> +215 i386 setfsuid32 sys_setfsuid
> +216 i386 setfsgid32 sys_setfsgid
> +217 i386 pivot_root sys_pivot_root
> +218 i386 mincore sys_mincore
> +219 i386 madvise sys_madvise
> +220 i386 getdents64 sys_getdents64
> +221 i386 fcntl64 sys_fcntl64 compat_sys_fcntl64
> +# 222 is unused
> +# 223 is unused
> +224 i386 gettid sys_gettid
> +225 i386 readahead sys_ia32_readahead
> +226 i386 setxattr sys_setxattr
> +227 i386 lsetxattr sys_lsetxattr
> +228 i386 fsetxattr sys_fsetxattr
> +229 i386 getxattr sys_getxattr
> +230 i386 lgetxattr sys_lgetxattr
> +231 i386 fgetxattr sys_fgetxattr
> +232 i386 listxattr sys_listxattr
> +233 i386 llistxattr sys_llistxattr
> +234 i386 flistxattr sys_flistxattr
> +235 i386 removexattr sys_removexattr
> +236 i386 lremovexattr sys_lremovexattr
> +237 i386 fremovexattr sys_fremovexattr
> +238 i386 tkill sys_tkill
> +239 i386 sendfile64 sys_sendfile64
> +240 i386 futex sys_futex_time32
> +241 i386 sched_setaffinity sys_sched_setaffinity compat_sys_sched_setaffinity
> +242 i386 sched_getaffinity sys_sched_getaffinity compat_sys_sched_getaffinity
> +243 i386 set_thread_area sys_set_thread_area
> +244 i386 get_thread_area sys_get_thread_area
> +245 i386 io_setup sys_io_setup compat_sys_io_setup
> +246 i386 io_destroy sys_io_destroy
> +247 i386 io_getevents sys_io_getevents_time32
> +248 i386 io_submit sys_io_submit compat_sys_io_submit
> +249 i386 io_cancel sys_io_cancel
> +250 i386 fadvise64 sys_ia32_fadvise64
> +# 251 is available for reuse (was briefly sys_set_zone_reclaim)
> +252 i386 exit_group sys_exit_group - noreturn
> +253 i386 lookup_dcookie
> +254 i386 epoll_create sys_epoll_create
> +255 i386 epoll_ctl sys_epoll_ctl
> +256 i386 epoll_wait sys_epoll_wait
> +257 i386 remap_file_pages sys_remap_file_pages
> +258 i386 set_tid_address sys_set_tid_address
> +259 i386 timer_create sys_timer_create compat_sys_timer_create
> +260 i386 timer_settime sys_timer_settime32
> +261 i386 timer_gettime sys_timer_gettime32
> +262 i386 timer_getoverrun sys_timer_getoverrun
> +263 i386 timer_delete sys_timer_delete
> +264 i386 clock_settime sys_clock_settime32
> +265 i386 clock_gettime sys_clock_gettime32
> +266 i386 clock_getres sys_clock_getres_time32
> +267 i386 clock_nanosleep sys_clock_nanosleep_time32
> +268 i386 statfs64 sys_statfs64 compat_sys_statfs64
> +269 i386 fstatfs64 sys_fstatfs64 compat_sys_fstatfs64
> +270 i386 tgkill sys_tgkill
> +271 i386 utimes sys_utimes_time32
> +272 i386 fadvise64_64 sys_ia32_fadvise64_64
> +273 i386 vserver
> +274 i386 mbind sys_mbind
> +275 i386 get_mempolicy sys_get_mempolicy
> +276 i386 set_mempolicy sys_set_mempolicy
> +277 i386 mq_open sys_mq_open compat_sys_mq_open
> +278 i386 mq_unlink sys_mq_unlink
> +279 i386 mq_timedsend sys_mq_timedsend_time32
> +280 i386 mq_timedreceive sys_mq_timedreceive_time32
> +281 i386 mq_notify sys_mq_notify compat_sys_mq_notify
> +282 i386 mq_getsetattr sys_mq_getsetattr compat_sys_mq_getsetattr
> +283 i386 kexec_load sys_kexec_load compat_sys_kexec_load
> +284 i386 waitid sys_waitid compat_sys_waitid
> +# 285 sys_setaltroot
> +286 i386 add_key sys_add_key
> +287 i386 request_key sys_request_key
> +288 i386 keyctl sys_keyctl compat_sys_keyctl
> +289 i386 ioprio_set sys_ioprio_set
> +290 i386 ioprio_get sys_ioprio_get
> +291 i386 inotify_init sys_inotify_init
> +292 i386 inotify_add_watch sys_inotify_add_watch
> +293 i386 inotify_rm_watch sys_inotify_rm_watch
> +294 i386 migrate_pages sys_migrate_pages
> +295 i386 openat sys_openat compat_sys_openat
> +296 i386 mkdirat sys_mkdirat
> +297 i386 mknodat sys_mknodat
> +298 i386 fchownat sys_fchownat
> +299 i386 futimesat sys_futimesat_time32
> +300 i386 fstatat64 sys_fstatat64 compat_sys_ia32_fstatat64
> +301 i386 unlinkat sys_unlinkat
> +302 i386 renameat sys_renameat
> +303 i386 linkat sys_linkat
> +304 i386 symlinkat sys_symlinkat
> +305 i386 readlinkat sys_readlinkat
> +306 i386 fchmodat sys_fchmodat
> +307 i386 faccessat sys_faccessat
> +308 i386 pselect6 sys_pselect6_time32 compat_sys_pselect6_time32
> +309 i386 ppoll sys_ppoll_time32 compat_sys_ppoll_time32
> +310 i386 unshare sys_unshare
> +311 i386 set_robust_list sys_set_robust_list compat_sys_set_robust_list
> +312 i386 get_robust_list sys_get_robust_list compat_sys_get_robust_list
> +313 i386 splice sys_splice
> +314 i386 sync_file_range sys_ia32_sync_file_range
> +315 i386 tee sys_tee
> +316 i386 vmsplice sys_vmsplice
> +317 i386 move_pages sys_move_pages
> +318 i386 getcpu sys_getcpu
> +319 i386 epoll_pwait sys_epoll_pwait
> +320 i386 utimensat sys_utimensat_time32
> +321 i386 signalfd sys_signalfd compat_sys_signalfd
> +322 i386 timerfd_create sys_timerfd_create
> +323 i386 eventfd sys_eventfd
> +324 i386 fallocate sys_ia32_fallocate
> +325 i386 timerfd_settime sys_timerfd_settime32
> +326 i386 timerfd_gettime sys_timerfd_gettime32
> +327 i386 signalfd4 sys_signalfd4 compat_sys_signalfd4
> +328 i386 eventfd2 sys_eventfd2
> +329 i386 epoll_create1 sys_epoll_create1
> +330 i386 dup3 sys_dup3
> +331 i386 pipe2 sys_pipe2
> +332 i386 inotify_init1 sys_inotify_init1
> +333 i386 preadv sys_preadv compat_sys_preadv
> +334 i386 pwritev sys_pwritev compat_sys_pwritev
> +335 i386 rt_tgsigqueueinfo sys_rt_tgsigqueueinfo compat_sys_rt_tgsigqueueinfo
> +336 i386 perf_event_open sys_perf_event_open
> +337 i386 recvmmsg sys_recvmmsg_time32 compat_sys_recvmmsg_time32
> +338 i386 fanotify_init sys_fanotify_init
> +339 i386 fanotify_mark sys_fanotify_mark compat_sys_fanotify_mark
> +340 i386 prlimit64 sys_prlimit64
> +341 i386 name_to_handle_at sys_name_to_handle_at
> +342 i386 open_by_handle_at sys_open_by_handle_at compat_sys_open_by_handle_at
> +343 i386 clock_adjtime sys_clock_adjtime32
> +344 i386 syncfs sys_syncfs
> +345 i386 sendmmsg sys_sendmmsg compat_sys_sendmmsg
> +346 i386 setns sys_setns
> +347 i386 process_vm_readv sys_process_vm_readv
> +348 i386 process_vm_writev sys_process_vm_writev
> +349 i386 kcmp sys_kcmp
> +350 i386 finit_module sys_finit_module
> +351 i386 sched_setattr sys_sched_setattr
> +352 i386 sched_getattr sys_sched_getattr
> +353 i386 renameat2 sys_renameat2
> +354 i386 seccomp sys_seccomp
> +355 i386 getrandom sys_getrandom
> +356 i386 memfd_create sys_memfd_create
> +357 i386 bpf sys_bpf
> +358 i386 execveat sys_execveat compat_sys_execveat
> +359 i386 socket sys_socket
> +360 i386 socketpair sys_socketpair
> +361 i386 bind sys_bind
> +362 i386 connect sys_connect
> +363 i386 listen sys_listen
> +364 i386 accept4 sys_accept4
> +365 i386 getsockopt sys_getsockopt sys_getsockopt
> +366 i386 setsockopt sys_setsockopt sys_setsockopt
> +367 i386 getsockname sys_getsockname
> +368 i386 getpeername sys_getpeername
> +369 i386 sendto sys_sendto
> +370 i386 sendmsg sys_sendmsg compat_sys_sendmsg
> +371 i386 recvfrom sys_recvfrom compat_sys_recvfrom
> +372 i386 recvmsg sys_recvmsg compat_sys_recvmsg
> +373 i386 shutdown sys_shutdown
> +374 i386 userfaultfd sys_userfaultfd
> +375 i386 membarrier sys_membarrier
> +376 i386 mlock2 sys_mlock2
> +377 i386 copy_file_range sys_copy_file_range
> +378 i386 preadv2 sys_preadv2 compat_sys_preadv2
> +379 i386 pwritev2 sys_pwritev2 compat_sys_pwritev2
> +380 i386 pkey_mprotect sys_pkey_mprotect
> +381 i386 pkey_alloc sys_pkey_alloc
> +382 i386 pkey_free sys_pkey_free
> +383 i386 statx sys_statx
> +384 i386 arch_prctl sys_arch_prctl compat_sys_arch_prctl
> +385 i386 io_pgetevents sys_io_pgetevents_time32 compat_sys_io_pgetevents
> +386 i386 rseq sys_rseq
> +393 i386 semget sys_semget
> +394 i386 semctl sys_semctl compat_sys_semctl
> +395 i386 shmget sys_shmget
> +396 i386 shmctl sys_shmctl compat_sys_shmctl
> +397 i386 shmat sys_shmat compat_sys_shmat
> +398 i386 shmdt sys_shmdt
> +399 i386 msgget sys_msgget
> +400 i386 msgsnd sys_msgsnd compat_sys_msgsnd
> +401 i386 msgrcv sys_msgrcv compat_sys_msgrcv
> +402 i386 msgctl sys_msgctl compat_sys_msgctl
> +403 i386 clock_gettime64 sys_clock_gettime
> +404 i386 clock_settime64 sys_clock_settime
> +405 i386 clock_adjtime64 sys_clock_adjtime
> +406 i386 clock_getres_time64 sys_clock_getres
> +407 i386 clock_nanosleep_time64 sys_clock_nanosleep
> +408 i386 timer_gettime64 sys_timer_gettime
> +409 i386 timer_settime64 sys_timer_settime
> +410 i386 timerfd_gettime64 sys_timerfd_gettime
> +411 i386 timerfd_settime64 sys_timerfd_settime
> +412 i386 utimensat_time64 sys_utimensat
> +413 i386 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
> +414 i386 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
> +416 i386 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
> +417 i386 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
> +418 i386 mq_timedsend_time64 sys_mq_timedsend
> +419 i386 mq_timedreceive_time64 sys_mq_timedreceive
> +420 i386 semtimedop_time64 sys_semtimedop
> +421 i386 rt_sigtimedwait_time64 sys_rt_sigtimedwait compat_sys_rt_sigtimedwait_time64
> +422 i386 futex_time64 sys_futex
> +423 i386 sched_rr_get_interval_time64 sys_sched_rr_get_interval
> +424 i386 pidfd_send_signal sys_pidfd_send_signal
> +425 i386 io_uring_setup sys_io_uring_setup
> +426 i386 io_uring_enter sys_io_uring_enter
> +427 i386 io_uring_register sys_io_uring_register
> +428 i386 open_tree sys_open_tree
> +429 i386 move_mount sys_move_mount
> +430 i386 fsopen sys_fsopen
> +431 i386 fsconfig sys_fsconfig
> +432 i386 fsmount sys_fsmount
> +433 i386 fspick sys_fspick
> +434 i386 pidfd_open sys_pidfd_open
> +435 i386 clone3 sys_clone3
> +436 i386 close_range sys_close_range
> +437 i386 openat2 sys_openat2
> +438 i386 pidfd_getfd sys_pidfd_getfd
> +439 i386 faccessat2 sys_faccessat2
> +440 i386 process_madvise sys_process_madvise
> +441 i386 epoll_pwait2 sys_epoll_pwait2 compat_sys_epoll_pwait2
> +442 i386 mount_setattr sys_mount_setattr
> +443 i386 quotactl_fd sys_quotactl_fd
> +444 i386 landlock_create_ruleset sys_landlock_create_ruleset
> +445 i386 landlock_add_rule sys_landlock_add_rule
> +446 i386 landlock_restrict_self sys_landlock_restrict_self
> +447 i386 memfd_secret sys_memfd_secret
> +448 i386 process_mrelease sys_process_mrelease
> +449 i386 futex_waitv sys_futex_waitv
> +450 i386 set_mempolicy_home_node sys_set_mempolicy_home_node
> +451 i386 cachestat sys_cachestat
> +452 i386 fchmodat2 sys_fchmodat2
> +453 i386 map_shadow_stack sys_map_shadow_stack
> +454 i386 futex_wake sys_futex_wake
> +455 i386 futex_wait sys_futex_wait
> +456 i386 futex_requeue sys_futex_requeue
> +457 i386 statmount sys_statmount
> +458 i386 listmount sys_listmount
> +459 i386 lsm_get_self_attr sys_lsm_get_self_attr
> +460 i386 lsm_set_self_attr sys_lsm_set_self_attr
> +461 i386 lsm_list_modules sys_lsm_list_modules
> +462 i386 mseal sys_mseal
> diff --git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh
> index 672421b858ac1a7f..714c78e5da07c163 100755
> --- a/tools/perf/check-headers.sh
> +++ b/tools/perf/check-headers.sh
> @@ -172,6 +172,7 @@ check lib/ctype.c '-I "^EXPORT_SYMBOL" -I "^#include <linux/export.h>" -B
> check lib/list_sort.c '-I "^#include <linux/bug.h>"'
>
> # diff non-symmetric files
> +check_2 tools/perf/arch/x86/entry/syscalls/syscall_32.tbl arch/x86/entry/syscalls/syscall_32.tbl
> check_2 tools/perf/arch/x86/entry/syscalls/syscall_64.tbl arch/x86/entry/syscalls/syscall_64.tbl
> check_2 tools/perf/arch/powerpc/entry/syscalls/syscall.tbl arch/powerpc/kernel/syscalls/syscall.tbl
> check_2 tools/perf/arch/s390/entry/syscalls/syscall.tbl arch/s390/kernel/syscalls/syscall.tbl
> diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
> index 0dd26b991b3fb513..7c15dec6900d8aaa 100644
> --- a/tools/perf/util/syscalltbl.c
> +++ b/tools/perf/util/syscalltbl.c
> @@ -18,6 +18,10 @@
> #include <asm/syscalls_64.c>
> const int syscalltbl_native_max_id = SYSCALLTBL_x86_64_MAX_ID;
> static const char *const *syscalltbl_native = syscalltbl_x86_64;
> +#elif defined(__i386__)
> +#include <asm/syscalls_32.c>
> +const int syscalltbl_native_max_id = SYSCALLTBL_x86_MAX_ID;
> +static const char *const *syscalltbl_native = syscalltbl_x86;
> #elif defined(__s390x__)
> #include <asm/syscalls_64.c>
> const int syscalltbl_native_max_id = SYSCALLTBL_S390_64_MAX_ID;
> --
> 2.46.0
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-08-31 0:35 ` Ian Rogers
@ 2024-09-02 18:53 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 38+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-09-02 18:53 UTC (permalink / raw)
To: Ian Rogers
Cc: Jiri Slaby, Howard Chu, Adrian Hunter, Jiri Olsa, Kan Liang,
Namhyung Kim, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On Fri, Aug 30, 2024 at 05:35:32PM -0700, Ian Rogers wrote:
> On Fri, Aug 30, 2024 at 4:30 PM Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > The script used to generate the 64-bit syscall table was already
> > parametrized to generate for both 64-bit and 32-bit, so just use it and
> > wire the generated table to the syscalltbl.c routines.
> > Reported-by: Jiri Slaby <jirislaby@kernel.org>
> > Suggested-by: Ian Rogers <irogers@google.com>
> This looks great!
> Reviewed-by: Ian Rogers <irogers@google.com>
> It seems strange to me that the 64-bit binary doesn't need a 32-bit
> syscall table given it could start a 32-bit binary, but that's a
> problem for another day.
Just one in a list of things TODO, how to get info about specific
binaries issuing syscalls and then use the right syscall table on a
system wide/CPU list/cgroup/whatever 'perf trace' session?
Yeah, a problem for another day, but at least now we have both syscall
tables (32 and 64 bit) available.
Thanks for reviewing it, added to the cset,
- Arnaldo
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-08-30 23:30 ` [PATCH/RFT] " Arnaldo Carvalho de Melo
2024-08-31 0:35 ` Ian Rogers
@ 2024-09-02 5:25 ` Jiri Slaby
2024-09-02 18:54 ` Arnaldo Carvalho de Melo
1 sibling, 1 reply; 38+ messages in thread
From: Jiri Slaby @ 2024-09-02 5:25 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa, Kan Liang,
Namhyung Kim, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On 31. 08. 24, 1:30, Arnaldo Carvalho de Melo wrote:
> From 174899051e54ecdab06c07652a3d04ad000ab301 Mon Sep 17 00:00:00 2001
> From: Arnaldo Carvalho de Melo <acme@redhat.com>
> Date: Fri, 30 Aug 2024 19:53:47 -0300
> Subject: [PATCH 1/1] perf tools: Build x86 32-bit syscall table from
> arch/x86/entry/syscalls/syscall_32.tbl
>
> To remove one more use of the audit libs and address a problem reported
> with a recent change where a function isn't available when using the
> audit libs method, that should really go away, this being one step in
> that direction.
>
> The script used to generate the 64-bit syscall table was already
> parametrized to generate for both 64-bit and 32-bit, so just use it and
> wire the generated table to the syscalltbl.c routines.
>
> Reported-by: Jiri Slaby <jirislaby@kernel.org>
> Suggested-by: Ian Rogers <irogers@google.com>
> Cc: Adrian Hunter <adrian.hunter@intel.com>
> Cc: Howard Chu <howardchu95@gmail.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: Kan Liang <kan.liang@linux.intel.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Link: https://lore.kernel.org/lkml/6fe63fa3-6c63-4b75-ac09-884d26f6fb95@kernel.org
> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Tested-by: Jiri Slaby <jirislaby@kernel.org>
thanks,
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-09-02 5:25 ` Jiri Slaby
@ 2024-09-02 18:54 ` Arnaldo Carvalho de Melo
2024-09-27 5:09 ` Jiri Slaby
0 siblings, 1 reply; 38+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-09-02 18:54 UTC (permalink / raw)
To: Jiri Slaby
Cc: Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa, Kan Liang,
Namhyung Kim, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On Mon, Sep 02, 2024 at 07:25:17AM +0200, Jiri Slaby wrote:
> On 31. 08. 24, 1:30, Arnaldo Carvalho de Melo wrote:
> > From 174899051e54ecdab06c07652a3d04ad000ab301 Mon Sep 17 00:00:00 2001
> > From: Arnaldo Carvalho de Melo <acme@redhat.com>
> > Date: Fri, 30 Aug 2024 19:53:47 -0300
> > Subject: [PATCH 1/1] perf tools: Build x86 32-bit syscall table from
> > arch/x86/entry/syscalls/syscall_32.tbl
> >
> > To remove one more use of the audit libs and address a problem reported
> > with a recent change where a function isn't available when using the
> > audit libs method, that should really go away, this being one step in
> > that direction.
> >
> > The script used to generate the 64-bit syscall table was already
> > parametrized to generate for both 64-bit and 32-bit, so just use it and
> > wire the generated table to the syscalltbl.c routines.
> >
> > Reported-by: Jiri Slaby <jirislaby@kernel.org>
> > Suggested-by: Ian Rogers <irogers@google.com>
> > Cc: Adrian Hunter <adrian.hunter@intel.com>
> > Cc: Howard Chu <howardchu95@gmail.com>
> > Cc: Jiri Olsa <jolsa@kernel.org>
> > Cc: Kan Liang <kan.liang@linux.intel.com>
> > Cc: Namhyung Kim <namhyung@kernel.org>
> > Link: https://lore.kernel.org/lkml/6fe63fa3-6c63-4b75-ac09-884d26f6fb95@kernel.org
> > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
>
> Tested-by: Jiri Slaby <jirislaby@kernel.org>
Thanks a lot! Added to the cset.
- Arnaldo
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-09-02 18:54 ` Arnaldo Carvalho de Melo
@ 2024-09-27 5:09 ` Jiri Slaby
2024-10-08 9:09 ` Jiri Slaby
0 siblings, 1 reply; 38+ messages in thread
From: Jiri Slaby @ 2024-09-27 5:09 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa, Kan Liang,
Namhyung Kim, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On 02. 09. 24, 20:54, Arnaldo Carvalho de Melo wrote:
> On Mon, Sep 02, 2024 at 07:25:17AM +0200, Jiri Slaby wrote:
>> On 31. 08. 24, 1:30, Arnaldo Carvalho de Melo wrote:
>>> From 174899051e54ecdab06c07652a3d04ad000ab301 Mon Sep 17 00:00:00 2001
>>> From: Arnaldo Carvalho de Melo <acme@redhat.com>
>>> Date: Fri, 30 Aug 2024 19:53:47 -0300
>>> Subject: [PATCH 1/1] perf tools: Build x86 32-bit syscall table from
>>> arch/x86/entry/syscalls/syscall_32.tbl
>>>
>>> To remove one more use of the audit libs and address a problem reported
>>> with a recent change where a function isn't available when using the
>>> audit libs method, that should really go away, this being one step in
>>> that direction.
>>>
>>> The script used to generate the 64-bit syscall table was already
>>> parametrized to generate for both 64-bit and 32-bit, so just use it and
>>> wire the generated table to the syscalltbl.c routines.
>>>
>>> Reported-by: Jiri Slaby <jirislaby@kernel.org>
>>> Suggested-by: Ian Rogers <irogers@google.com>
>>> Cc: Adrian Hunter <adrian.hunter@intel.com>
>>> Cc: Howard Chu <howardchu95@gmail.com>
>>> Cc: Jiri Olsa <jolsa@kernel.org>
>>> Cc: Kan Liang <kan.liang@linux.intel.com>
>>> Cc: Namhyung Kim <namhyung@kernel.org>
>>> Link: https://lore.kernel.org/lkml/6fe63fa3-6c63-4b75-ac09-884d26f6fb95@kernel.org
>>> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
>>
>> Tested-by: Jiri Slaby <jirislaby@kernel.org>
>
> Thanks a lot! Added to the cset.
Oh, 32bit arm still affected:
/usr/lib/gcc/armv7hl-suse-linux-gnueabi/14/../../../../armv7hl-suse-linux-gnueabi/bin/ld:
perf-in.o: in function `trace__init_syscalls_bpf_prog_array_maps':
tools/perf/builtin-trace.c:3461:(.text+0x899a0): undefined reference to
`syscalltbl__id_at_idx'
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-09-27 5:09 ` Jiri Slaby
@ 2024-10-08 9:09 ` Jiri Slaby
2024-10-09 5:57 ` Namhyung Kim
0 siblings, 1 reply; 38+ messages in thread
From: Jiri Slaby @ 2024-10-08 9:09 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa, Kan Liang,
Namhyung Kim, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On 27. 09. 24, 7:09, Jiri Slaby wrote:
> On 02. 09. 24, 20:54, Arnaldo Carvalho de Melo wrote:
>> On Mon, Sep 02, 2024 at 07:25:17AM +0200, Jiri Slaby wrote:
>>> On 31. 08. 24, 1:30, Arnaldo Carvalho de Melo wrote:
>>>> From 174899051e54ecdab06c07652a3d04ad000ab301 Mon Sep 17 00:00:00
>>>> 2001
>>>> From: Arnaldo Carvalho de Melo <acme@redhat.com>
>>>> Date: Fri, 30 Aug 2024 19:53:47 -0300
>>>> Subject: [PATCH 1/1] perf tools: Build x86 32-bit syscall table from
>>>> arch/x86/entry/syscalls/syscall_32.tbl
>>>>
>>>> To remove one more use of the audit libs and address a problem reported
>>>> with a recent change where a function isn't available when using the
>>>> audit libs method, that should really go away, this being one step in
>>>> that direction.
>>>>
>>>> The script used to generate the 64-bit syscall table was already
>>>> parametrized to generate for both 64-bit and 32-bit, so just use it and
>>>> wire the generated table to the syscalltbl.c routines.
>>>>
>>>> Reported-by: Jiri Slaby <jirislaby@kernel.org>
>>>> Suggested-by: Ian Rogers <irogers@google.com>
>>>> Cc: Adrian Hunter <adrian.hunter@intel.com>
>>>> Cc: Howard Chu <howardchu95@gmail.com>
>>>> Cc: Jiri Olsa <jolsa@kernel.org>
>>>> Cc: Kan Liang <kan.liang@linux.intel.com>
>>>> Cc: Namhyung Kim <namhyung@kernel.org>
>>>> Link:
>>>> https://lore.kernel.org/lkml/6fe63fa3-6c63-4b75-ac09-884d26f6fb95@kernel.org
>>>> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
>>>
>>> Tested-by: Jiri Slaby <jirislaby@kernel.org>
>>
>> Thanks a lot! Added to the cset.
>
> Oh, 32bit arm still affected:
> /usr/lib/gcc/armv7hl-suse-linux-gnueabi/14/../../../../armv7hl-suse-linux-gnueabi/bin/ld: perf-in.o: in function `trace__init_syscalls_bpf_prog_array_maps':
> tools/perf/builtin-trace.c:3461:(.text+0x899a0): undefined reference to
> `syscalltbl__id_at_idx'
Ping -- any input/fix for this?
thanks,
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-08 9:09 ` Jiri Slaby
@ 2024-10-09 5:57 ` Namhyung Kim
[not found] ` <CAH0uvoi622J7gZ9BoTik7niNH3axVJR0kPNovUQnMjUB6GWLNg@mail.gmail.com>
2024-10-10 8:11 ` Jiri Slaby
0 siblings, 2 replies; 38+ messages in thread
From: Namhyung Kim @ 2024-10-09 5:57 UTC (permalink / raw)
To: Jiri Slaby
Cc: Arnaldo Carvalho de Melo, Howard Chu, Adrian Hunter, Ian Rogers,
Jiri Olsa, Kan Liang, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
Hello,
On Tue, Oct 08, 2024 at 11:09:31AM +0200, Jiri Slaby wrote:
> On 27. 09. 24, 7:09, Jiri Slaby wrote:
> > On 02. 09. 24, 20:54, Arnaldo Carvalho de Melo wrote:
> > > On Mon, Sep 02, 2024 at 07:25:17AM +0200, Jiri Slaby wrote:
> > > > On 31. 08. 24, 1:30, Arnaldo Carvalho de Melo wrote:
> > > > > From 174899051e54ecdab06c07652a3d04ad000ab301 Mon Sep 17
> > > > > 00:00:00 2001
> > > > > From: Arnaldo Carvalho de Melo <acme@redhat.com>
> > > > > Date: Fri, 30 Aug 2024 19:53:47 -0300
> > > > > Subject: [PATCH 1/1] perf tools: Build x86 32-bit syscall table from
> > > > > arch/x86/entry/syscalls/syscall_32.tbl
> > > > >
> > > > > To remove one more use of the audit libs and address a problem reported
> > > > > with a recent change where a function isn't available when using the
> > > > > audit libs method, that should really go away, this being one step in
> > > > > that direction.
> > > > >
> > > > > The script used to generate the 64-bit syscall table was already
> > > > > parametrized to generate for both 64-bit and 32-bit, so just use it and
> > > > > wire the generated table to the syscalltbl.c routines.
> > > > >
> > > > > Reported-by: Jiri Slaby <jirislaby@kernel.org>
> > > > > Suggested-by: Ian Rogers <irogers@google.com>
> > > > > Cc: Adrian Hunter <adrian.hunter@intel.com>
> > > > > Cc: Howard Chu <howardchu95@gmail.com>
> > > > > Cc: Jiri Olsa <jolsa@kernel.org>
> > > > > Cc: Kan Liang <kan.liang@linux.intel.com>
> > > > > Cc: Namhyung Kim <namhyung@kernel.org>
> > > > > Link: https://lore.kernel.org/lkml/6fe63fa3-6c63-4b75-ac09-884d26f6fb95@kernel.org
> > > > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> > > >
> > > > Tested-by: Jiri Slaby <jirislaby@kernel.org>
> > >
> > > Thanks a lot! Added to the cset.
> >
> > Oh, 32bit arm still affected:
> > /usr/lib/gcc/armv7hl-suse-linux-gnueabi/14/../../../../armv7hl-suse-linux-gnueabi/bin/ld: perf-in.o: in function `trace__init_syscalls_bpf_prog_array_maps':
> > tools/perf/builtin-trace.c:3461:(.text+0x899a0): undefined reference to
> > `syscalltbl__id_at_idx'
>
> Ping -- any input/fix for this?
As a quick fix, we may add a dummy syscall table for other archs like
below. Can you please test this?
Thanks,
Namhyung
---8<---
diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
index 7c15dec6900d8aaa..b7465a879d8bf416 100644
--- a/tools/perf/util/syscalltbl.c
+++ b/tools/perf/util/syscalltbl.c
@@ -46,6 +46,11 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64;
#include <asm/syscalls.c>
const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
static const char *const *syscalltbl_native = syscalltbl_loongarch;
+#else
+const int syscalltbl_native_max_id = 1;
+static const char *const syscalltbl_native[] = {
+ [0] = "unknown",
+};
#endif
struct syscall {
^ permalink raw reply related [flat|nested] 38+ messages in thread
[parent not found: <CAH0uvoi622J7gZ9BoTik7niNH3axVJR0kPNovUQnMjUB6GWLNg@mail.gmail.com>]
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
[not found] ` <CAH0uvoi622J7gZ9BoTik7niNH3axVJR0kPNovUQnMjUB6GWLNg@mail.gmail.com>
@ 2024-10-09 6:58 ` Howard Chu
2024-10-10 8:22 ` Jiri Slaby
0 siblings, 1 reply; 38+ messages in thread
From: Howard Chu @ 2024-10-09 6:58 UTC (permalink / raw)
To: Namhyung Kim
Cc: Jiri Slaby, Arnaldo Carvalho de Melo, Adrian Hunter, Ian Rogers,
Jiri Olsa, Kan Liang, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
[Resending due to a mailing list error]
Hello Jiri,
If Namhyung's fix alone does not solve the problem please try this:
Thanks,
Howard
======
diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
index 7c15dec6900d..8dff317a3d79 100644
--- a/tools/perf/util/syscalltbl.c
+++ b/tools/perf/util/syscalltbl.c
@@ -46,6 +46,11 @@ static const char *const *syscalltbl_native =
syscalltbl_mips_n64;
#include <asm/syscalls.c>
const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
static const char *const *syscalltbl_native = syscalltbl_loongarch;
+#else
+const int syscalltbl_native_max_id = 1;
+static const char *const syscalltbl_native[] = {
+ [0] = "unknown",
+};
#endif
struct syscall {
@@ -182,6 +187,11 @@ int syscalltbl__id(struct syscalltbl *tbl, const
char *name)
return audit_name_to_syscall(name, tbl->audit_machine);
}
+int syscalltbl__id_at_idx(struct syscalltbl *tbl __maybe_unused, int idx)
+{
+ return idx;
+}
+
int syscalltbl__strglobmatch_next(struct syscalltbl *tbl __maybe_unused,
const char *syscall_glob
__maybe_unused, int *idx __maybe_unused)
{
On Tue, Oct 8, 2024 at 11:54 PM Howard Chu <howardchu95@gmail.com> wrote:
>
> Hello Jiri,
>
> If Namhyung's fix alone does not solve the problem please try this:
>
> Thanks,
> Howard
>
> ======
>
> diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
> index 7c15dec6900d..8dff317a3d79 100644
> --- a/tools/perf/util/syscalltbl.c
> +++ b/tools/perf/util/syscalltbl.c
> @@ -46,6 +46,11 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64;
> #include <asm/syscalls.c>
> const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
> static const char *const *syscalltbl_native = syscalltbl_loongarch;
> +#else
> +const int syscalltbl_native_max_id = 1;
> +static const char *const syscalltbl_native[] = {
> + [0] = "unknown",
> +};
> #endif
>
> struct syscall {
> @@ -182,6 +187,11 @@ int syscalltbl__id(struct syscalltbl *tbl, const char *name)
> return audit_name_to_syscall(name, tbl->audit_machine);
> }
>
> +int syscalltbl__id_at_idx(struct syscalltbl *tbl __maybe_unused, int idx)
> +{
> + return idx;
> +}
> +
> int syscalltbl__strglobmatch_next(struct syscalltbl *tbl __maybe_unused,
> const char *syscall_glob __maybe_unused, int *idx __maybe_unused)
> {
>
> On Tue, Oct 8, 2024 at 10:57 PM Namhyung Kim <namhyung@kernel.org> wrote:
>>
>> Hello,
>>
>> On Tue, Oct 08, 2024 at 11:09:31AM +0200, Jiri Slaby wrote:
>> > On 27. 09. 24, 7:09, Jiri Slaby wrote:
>> > > On 02. 09. 24, 20:54, Arnaldo Carvalho de Melo wrote:
>> > > > On Mon, Sep 02, 2024 at 07:25:17AM +0200, Jiri Slaby wrote:
>> > > > > On 31. 08. 24, 1:30, Arnaldo Carvalho de Melo wrote:
>> > > > > > From 174899051e54ecdab06c07652a3d04ad000ab301 Mon Sep 17
>> > > > > > 00:00:00 2001
>> > > > > > From: Arnaldo Carvalho de Melo <acme@redhat.com>
>> > > > > > Date: Fri, 30 Aug 2024 19:53:47 -0300
>> > > > > > Subject: [PATCH 1/1] perf tools: Build x86 32-bit syscall table from
>> > > > > > arch/x86/entry/syscalls/syscall_32.tbl
>> > > > > >
>> > > > > > To remove one more use of the audit libs and address a problem reported
>> > > > > > with a recent change where a function isn't available when using the
>> > > > > > audit libs method, that should really go away, this being one step in
>> > > > > > that direction.
>> > > > > >
>> > > > > > The script used to generate the 64-bit syscall table was already
>> > > > > > parametrized to generate for both 64-bit and 32-bit, so just use it and
>> > > > > > wire the generated table to the syscalltbl.c routines.
>> > > > > >
>> > > > > > Reported-by: Jiri Slaby <jirislaby@kernel.org>
>> > > > > > Suggested-by: Ian Rogers <irogers@google.com>
>> > > > > > Cc: Adrian Hunter <adrian.hunter@intel.com>
>> > > > > > Cc: Howard Chu <howardchu95@gmail.com>
>> > > > > > Cc: Jiri Olsa <jolsa@kernel.org>
>> > > > > > Cc: Kan Liang <kan.liang@linux.intel.com>
>> > > > > > Cc: Namhyung Kim <namhyung@kernel.org>
>> > > > > > Link: https://lore.kernel.org/lkml/6fe63fa3-6c63-4b75-ac09-884d26f6fb95@kernel.org
>> > > > > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
>> > > > >
>> > > > > Tested-by: Jiri Slaby <jirislaby@kernel.org>
>> > > >
>> > > > Thanks a lot! Added to the cset.
>> > >
>> > > Oh, 32bit arm still affected:
>> > > /usr/lib/gcc/armv7hl-suse-linux-gnueabi/14/../../../../armv7hl-suse-linux-gnueabi/bin/ld: perf-in.o: in function `trace__init_syscalls_bpf_prog_array_maps':
>> > > tools/perf/builtin-trace.c:3461:(.text+0x899a0): undefined reference to
>> > > `syscalltbl__id_at_idx'
>> >
>> > Ping -- any input/fix for this?
>>
>> As a quick fix, we may add a dummy syscall table for other archs like
>> below. Can you please test this?
>>
>> Thanks,
>> Namhyung
>>
>> ---8<---
>> diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
>> index 7c15dec6900d8aaa..b7465a879d8bf416 100644
>> --- a/tools/perf/util/syscalltbl.c
>> +++ b/tools/perf/util/syscalltbl.c
>> @@ -46,6 +46,11 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64;
>> #include <asm/syscalls.c>
>> const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
>> static const char *const *syscalltbl_native = syscalltbl_loongarch;
>> +#else
>> +const int syscalltbl_native_max_id = 1;
>> +static const char *const syscalltbl_native[] = {
>> + [0] = "unknown",
>> +};
>> #endif
>>
>> struct syscall {
>>
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-09 6:58 ` Howard Chu
@ 2024-10-10 8:22 ` Jiri Slaby
2024-10-10 16:29 ` Namhyung Kim
0 siblings, 1 reply; 38+ messages in thread
From: Jiri Slaby @ 2024-10-10 8:22 UTC (permalink / raw)
To: Howard Chu, Namhyung Kim
Cc: Arnaldo Carvalho de Melo, Adrian Hunter, Ian Rogers, Jiri Olsa,
Kan Liang, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
[-- Attachment #1: Type: text/plain, Size: 1289 bytes --]
On 09. 10. 24, 8:58, Howard Chu wrote:
> If Namhyung's fix alone does not solve the problem please try this:
Hi,
it obviously did not. But this one indeed does.
> --- a/tools/perf/util/syscalltbl.c
> +++ b/tools/perf/util/syscalltbl.c
> @@ -46,6 +46,11 @@ static const char *const *syscalltbl_native =
> syscalltbl_mips_n64;
> #include <asm/syscalls.c>
> const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
> static const char *const *syscalltbl_native = syscalltbl_loongarch;
> +#else
> +const int syscalltbl_native_max_id = 1;
This ^^^ should be 0 IMO. Look:
for (i = 0; i <= syscalltbl_native_max_id; ++i)
if (syscalltbl_native[i])
++nr_entries;
> +static const char *const syscalltbl_native[] = {
> + [0] = "unknown",
> +};
> #endif
>
> struct syscall {
> @@ -182,6 +187,11 @@ int syscalltbl__id(struct syscalltbl *tbl, const
> char *name)
> return audit_name_to_syscall(name, tbl->audit_machine);
> }
>
> +int syscalltbl__id_at_idx(struct syscalltbl *tbl __maybe_unused, int idx)
> +{
> + return idx;
> +}
This looks somewhat familiar :):
https://lore.kernel.org/all/739001a4-4df1-4dec-a141-926c78c5c07e@kernel.org/
I am attaching an updated patch.
thanks,
--
js
suse labs
[-- Attachment #2: 0001-perf-fix-non-listed-archs.patch --]
[-- Type: text/x-patch, Size: 1350 bytes --]
From 3d4f06d79c949a8f155c20652b4f685540899ad4 Mon Sep 17 00:00:00 2001
From: Jiri Slaby <jslaby@suse.cz>
Date: Thu, 10 Oct 2024 09:57:07 +0200
Subject: [PATCH] perf: fix non-listed archs
Suggested-by: Howard Chu <howardchu95@gmail.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
---
tools/perf/util/syscalltbl.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
index 7c15dec6900d..6c45ded922b6 100644
--- a/tools/perf/util/syscalltbl.c
+++ b/tools/perf/util/syscalltbl.c
@@ -46,6 +46,11 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64;
#include <asm/syscalls.c>
const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
static const char *const *syscalltbl_native = syscalltbl_loongarch;
+#else
+const int syscalltbl_native_max_id = 0;
+static const char *const syscalltbl_native[] = {
+ [0] = "unknown",
+};
#endif
struct syscall {
@@ -182,6 +187,11 @@ int syscalltbl__id(struct syscalltbl *tbl, const char *name)
return audit_name_to_syscall(name, tbl->audit_machine);
}
+int syscalltbl__id_at_idx(struct syscalltbl *tbl __maybe_unused, int idx)
+{
+ return idx;
+}
+
int syscalltbl__strglobmatch_next(struct syscalltbl *tbl __maybe_unused,
const char *syscall_glob __maybe_unused, int *idx __maybe_unused)
{
--
2.46.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-10 8:22 ` Jiri Slaby
@ 2024-10-10 16:29 ` Namhyung Kim
2024-10-10 16:31 ` Namhyung Kim
0 siblings, 1 reply; 38+ messages in thread
From: Namhyung Kim @ 2024-10-10 16:29 UTC (permalink / raw)
To: Jiri Slaby, Arnaldo Carvalho de Melo
Cc: Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa, Kan Liang,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
On Thu, Oct 10, 2024 at 10:22:12AM +0200, Jiri Slaby wrote:
> On 09. 10. 24, 8:58, Howard Chu wrote:
> > If Namhyung's fix alone does not solve the problem please try this:
>
> Hi,
>
> it obviously did not. But this one indeed does.
>
> > --- a/tools/perf/util/syscalltbl.c
> > +++ b/tools/perf/util/syscalltbl.c
> > @@ -46,6 +46,11 @@ static const char *const *syscalltbl_native =
> > syscalltbl_mips_n64;
> > #include <asm/syscalls.c>
> > const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
> > static const char *const *syscalltbl_native = syscalltbl_loongarch;
> > +#else
> > +const int syscalltbl_native_max_id = 1;
>
> This ^^^ should be 0 IMO. Look:
> for (i = 0; i <= syscalltbl_native_max_id; ++i)
> if (syscalltbl_native[i])
> ++nr_entries;
Right.
>
> > +static const char *const syscalltbl_native[] = {
> > + [0] = "unknown",
> > +};
> > #endif
> >
> > struct syscall {
> > @@ -182,6 +187,11 @@ int syscalltbl__id(struct syscalltbl *tbl, const
> > char *name)
> > return audit_name_to_syscall(name, tbl->audit_machine);
> > }
> >
> > +int syscalltbl__id_at_idx(struct syscalltbl *tbl __maybe_unused, int idx)
> > +{
> > + return idx;
> > +}
>
> This looks somewhat familiar :):
> https://lore.kernel.org/all/739001a4-4df1-4dec-a141-926c78c5c07e@kernel.org/
>
> I am attaching an updated patch.
>
> thanks,
> --
> js
> suse labs
> From 3d4f06d79c949a8f155c20652b4f685540899ad4 Mon Sep 17 00:00:00 2001
> From: Jiri Slaby <jslaby@suse.cz>
> Date: Thu, 10 Oct 2024 09:57:07 +0200
> Subject: [PATCH] perf: fix non-listed archs
>
> Suggested-by: Howard Chu <howardchu95@gmail.com>
> Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Arnaldo, can you please pick this up for v6.12?
Thanks,
Namhyung
> ---
> tools/perf/util/syscalltbl.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
> index 7c15dec6900d..6c45ded922b6 100644
> --- a/tools/perf/util/syscalltbl.c
> +++ b/tools/perf/util/syscalltbl.c
> @@ -46,6 +46,11 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64;
> #include <asm/syscalls.c>
> const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
> static const char *const *syscalltbl_native = syscalltbl_loongarch;
> +#else
> +const int syscalltbl_native_max_id = 0;
> +static const char *const syscalltbl_native[] = {
> + [0] = "unknown",
> +};
> #endif
>
> struct syscall {
> @@ -182,6 +187,11 @@ int syscalltbl__id(struct syscalltbl *tbl, const char *name)
> return audit_name_to_syscall(name, tbl->audit_machine);
> }
>
> +int syscalltbl__id_at_idx(struct syscalltbl *tbl __maybe_unused, int idx)
> +{
> + return idx;
> +}
> +
> int syscalltbl__strglobmatch_next(struct syscalltbl *tbl __maybe_unused,
> const char *syscall_glob __maybe_unused, int *idx __maybe_unused)
> {
> --
> 2.46.1
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-10 16:29 ` Namhyung Kim
@ 2024-10-10 16:31 ` Namhyung Kim
2024-10-10 21:02 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 38+ messages in thread
From: Namhyung Kim @ 2024-10-10 16:31 UTC (permalink / raw)
To: Jiri Slaby, Arnaldo Carvalho de Melo
Cc: Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa, Kan Liang,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
On Thu, Oct 10, 2024 at 09:29:01AM -0700, Namhyung Kim wrote:
> On Thu, Oct 10, 2024 at 10:22:12AM +0200, Jiri Slaby wrote:
> > From 3d4f06d79c949a8f155c20652b4f685540899ad4 Mon Sep 17 00:00:00 2001
> > From: Jiri Slaby <jslaby@suse.cz>
> > Date: Thu, 10 Oct 2024 09:57:07 +0200
> > Subject: [PATCH] perf: fix non-listed archs
> >
> > Suggested-by: Howard Chu <howardchu95@gmail.com>
> > Signed-off-by: Jiri Slaby <jslaby@suse.cz>
>
> Acked-by: Namhyung Kim <namhyung@kernel.org>
Also with,
Fixes: 7a2fb5619cc1fb53 ("perf trace: Fix iteration of syscall ids in syscalltbl->entries")
>
> Arnaldo, can you please pick this up for v6.12?
>
> Thanks,
> Namhyung
>
> > ---
> > tools/perf/util/syscalltbl.c | 10 ++++++++++
> > 1 file changed, 10 insertions(+)
> >
> > diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
> > index 7c15dec6900d..6c45ded922b6 100644
> > --- a/tools/perf/util/syscalltbl.c
> > +++ b/tools/perf/util/syscalltbl.c
> > @@ -46,6 +46,11 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64;
> > #include <asm/syscalls.c>
> > const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
> > static const char *const *syscalltbl_native = syscalltbl_loongarch;
> > +#else
> > +const int syscalltbl_native_max_id = 0;
> > +static const char *const syscalltbl_native[] = {
> > + [0] = "unknown",
> > +};
> > #endif
> >
> > struct syscall {
> > @@ -182,6 +187,11 @@ int syscalltbl__id(struct syscalltbl *tbl, const char *name)
> > return audit_name_to_syscall(name, tbl->audit_machine);
> > }
> >
> > +int syscalltbl__id_at_idx(struct syscalltbl *tbl __maybe_unused, int idx)
> > +{
> > + return idx;
> > +}
> > +
> > int syscalltbl__strglobmatch_next(struct syscalltbl *tbl __maybe_unused,
> > const char *syscall_glob __maybe_unused, int *idx __maybe_unused)
> > {
> > --
> > 2.46.1
> >
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-10 16:31 ` Namhyung Kim
@ 2024-10-10 21:02 ` Arnaldo Carvalho de Melo
2024-10-14 12:19 ` Jiri Slaby
0 siblings, 1 reply; 38+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-10-10 21:02 UTC (permalink / raw)
To: Namhyung Kim
Cc: Jiri Slaby, Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa,
Kan Liang, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On Thu, Oct 10, 2024 at 09:31:54AM -0700, Namhyung Kim wrote:
> On Thu, Oct 10, 2024 at 09:29:01AM -0700, Namhyung Kim wrote:
> > On Thu, Oct 10, 2024 at 10:22:12AM +0200, Jiri Slaby wrote:
> > > From 3d4f06d79c949a8f155c20652b4f685540899ad4 Mon Sep 17 00:00:00 2001
> > > From: Jiri Slaby <jslaby@suse.cz>
> > > Date: Thu, 10 Oct 2024 09:57:07 +0200
> > > Subject: [PATCH] perf: fix non-listed archs
> > > Suggested-by: Howard Chu <howardchu95@gmail.com>
> > > Signed-off-by: Jiri Slaby <jslaby@suse.cz>
> > Acked-by: Namhyung Kim <namhyung@kernel.org>
> Also with,
> Fixes: 7a2fb5619cc1fb53 ("perf trace: Fix iteration of syscall ids in syscalltbl->entries")
> > Arnaldo, can you please pick this up for v6.12?
Sure, probably the safest bet now, but just in case, Jiri, can you test
the following?
- Arnaldo
From a93dff5b66fb319d700c968de1906a0868a505dc Mon Sep 17 00:00:00 2001
From: Arnaldo Carvalho de Melo <acme@redhat.com>
Date: Thu, 10 Oct 2024 17:52:19 -0300
Subject: [PATCH 1/1] perf tools arm: Generate syscalltbl.c from arm's
syscall.tbl
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Just like powerpc that in turn used s390 as its starting point.
With it:
⬢[acme@toolbox perf-tools-next]$ tools/perf/arch/arm/entry/syscalls/mksyscalltbl tools/perf/arch/arm/entry/syscalls/syscall.tbl > /tmp/syscall.c
⬢[acme@toolbox perf-tools-next]$ cd /tmp
⬢[acme@toolbox tmp]$ gcc -g -c syscall.c -o syscall.o
⬢[acme@toolbox tmp]$ head syscall.c
static const char *const syscalltbl_arm[] = {
[0] = "restart_syscall",
[1] = "exit",
[2] = "fork",
[3] = "read",
[4] = "write",
[5] = "open",
[6] = "close",
[8] = "creat",
[9] = "link",
⬢[acme@toolbox tmp]$ tail syscall.c
[455] = "futex_wait",
[456] = "futex_requeue",
[457] = "statmount",
[458] = "listmount",
[459] = "lsm_get_self_attr",
[460] = "lsm_set_self_attr",
[461] = "lsm_list_modules",
[462] = "mseal",
};
#define SYSCALLTBL_ARM_MAX_ID 462
⬢[acme@toolbox tmp]$
⬢[acme@toolbox tmp]$ readelf -wi syscall.o
Contents of the .debug_info section:
Compilation Unit @ offset 0:
Length: 0x65 (32-bit)
Version: 5
Unit Type: DW_UT_compile (1)
Abbrev Offset: 0
Pointer Size: 8
<0><c>: Abbrev Number: 3 (DW_TAG_compile_unit)
<d> DW_AT_producer : (indirect string, offset: 0): GNU C17 14.2.1 20240801 (Red Hat 14.2.1-1) -mtune=generic -march=x86-64 -g
<11> DW_AT_language : 29 (C11)
<12> DW_AT_name : (indirect line string, offset: 0): syscall.c
<16> DW_AT_comp_dir : (indirect line string, offset: 0xa): /tmp
<1a> DW_AT_stmt_list : 0
<1><1e>: Abbrev Number: 4 (DW_TAG_array_type)
<1f> DW_AT_type : <0x41>
<23> DW_AT_sibling : <0x2f>
<2><27>: Abbrev Number: 5 (DW_TAG_subrange_type)
<28> DW_AT_type : <0x34>
<2c> DW_AT_upper_bound : 462
<2><2e>: Abbrev Number: 0
<1><2f>: Abbrev Number: 1 (DW_TAG_const_type)
<30> DW_AT_type : <0x1e>
<1><34>: Abbrev Number: 2 (DW_TAG_base_type)
<35> DW_AT_byte_size : 8
<36> DW_AT_encoding : 7 (unsigned)
<37> DW_AT_name : (indirect string, offset: 0x4b): long unsigned int
<1><3b>: Abbrev Number: 6 (DW_TAG_pointer_type)
<3c> DW_AT_byte_size : 8
<3d> DW_AT_type : <0x4d>
<1><41>: Abbrev Number: 1 (DW_TAG_const_type)
<42> DW_AT_type : <0x3b>
<1><46>: Abbrev Number: 2 (DW_TAG_base_type)
<47> DW_AT_byte_size : 1
<48> DW_AT_encoding : 6 (signed char)
<49> DW_AT_name : (indirect string, offset: 0x6c): char
<1><4d>: Abbrev Number: 1 (DW_TAG_const_type)
<4e> DW_AT_type : <0x46>
<1><52>: Abbrev Number: 7 (DW_TAG_variable)
<53> DW_AT_name : (indirect string, offset: 0x5d): syscalltbl_arm
<57> DW_AT_decl_file : 1
<58> DW_AT_decl_line : 1
<59> DW_AT_decl_column : 26
<5a> DW_AT_type : <0x2f>
<5e> DW_AT_location : 9 byte block: 3 20 11 0 0 0 0 0 0 (DW_OP_addr: 1120)
<1><68>: Abbrev Number: 0
⬢[acme@toolbox tmp]$
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/arch/arm/Makefile | 21 +
.../perf/arch/arm/entry/syscalls/mksyscalltbl | 39 ++
.../perf/arch/arm/entry/syscalls/syscall.tbl | 479 ++++++++++++++++++
| 1 +
tools/perf/util/syscalltbl.c | 4 +
5 files changed, 544 insertions(+)
create mode 100755 tools/perf/arch/arm/entry/syscalls/mksyscalltbl
create mode 100644 tools/perf/arch/arm/entry/syscalls/syscall.tbl
diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile
index 1d88fdab13bf8f68..7821584340ed48ce 100644
--- a/tools/perf/arch/arm/Makefile
+++ b/tools/perf/arch/arm/Makefile
@@ -3,3 +3,24 @@ ifndef NO_DWARF
PERF_HAVE_DWARF_REGS := 1
endif
PERF_HAVE_JITDUMP := 1
+
+#
+# Syscall table generation for perf
+#
+
+out := $(OUTPUT)arch/arm/include/generated/asm
+header32 := $(out)/syscalls_32.c
+sysprf := $(srctree)/tools/perf/arch/arm/entry/syscalls
+sysdef := $(sysprf)/syscall.tbl
+systbl := $(sysprf)/mksyscalltbl
+
+# Create output directory if not already present
+$(shell [ -d '$(out)' ] || mkdir -p '$(out)')
+
+$(header32): $(sysdef) $(systbl)
+ $(Q)$(SHELL) '$(systbl)' $(sysdef) > $@
+
+clean::
+ $(call QUIET_CLEAN, arm) $(RM) $(header32)
+
+archheaders: $(header32)
diff --git a/tools/perf/arch/arm/entry/syscalls/mksyscalltbl b/tools/perf/arch/arm/entry/syscalls/mksyscalltbl
new file mode 100755
index 0000000000000000..4489343df0d4d065
--- /dev/null
+++ b/tools/perf/arch/arm/entry/syscalls/mksyscalltbl
@@ -0,0 +1,39 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+#
+# Generate syscall table for perf for arm 32-bit, derived from:
+#
+# Generate system call table for perf. Derived from
+# s390 script.
+#
+# Copyright IBM Corp. 2017
+# Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
+# Changed by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
+
+SYSCALL_TBL=$1
+
+if ! test -r $SYSCALL_TBL; then
+ echo "Could not read input file" >&2
+ exit 1
+fi
+
+create_table()
+{
+ local max_nr nr abi sc discard
+ max_nr=-1
+ nr=0
+
+ echo "static const char *const syscalltbl_arm[] = {"
+ while read nr abi sc discard; do
+ if [ "$max_nr" -lt "$nr" ]; then
+ printf '\t[%d] = "%s",\n' $nr $sc
+ max_nr=$nr
+ fi
+ done
+ echo '};'
+ echo "#define SYSCALLTBL_ARM_MAX_ID $max_nr"
+}
+
+grep -E "^[[:digit:]]+[[:space:]]+(common|spu|nospu)" $SYSCALL_TBL \
+ |sort -k1 -n \
+ |create_table
diff --git a/tools/perf/arch/arm/entry/syscalls/syscall.tbl b/tools/perf/arch/arm/entry/syscalls/syscall.tbl
new file mode 100644
index 0000000000000000..23c98203c40fe6b7
--- /dev/null
+++ b/tools/perf/arch/arm/entry/syscalls/syscall.tbl
@@ -0,0 +1,479 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# Linux system call numbers and entry vectors
+#
+# The format is:
+# <num> <abi> <name> [<entry point> [<oabi compat entry point>]]
+#
+# Where abi is:
+# common - for system calls shared between oabi and eabi (may have compat)
+# oabi - for oabi-only system calls (may have compat)
+# eabi - for eabi-only system calls
+#
+# For each syscall number, "common" is mutually exclusive with oabi and eabi
+#
+0 common restart_syscall sys_restart_syscall
+1 common exit sys_exit
+2 common fork sys_fork
+3 common read sys_read
+4 common write sys_write
+5 common open sys_open
+6 common close sys_close
+# 7 was sys_waitpid
+8 common creat sys_creat
+9 common link sys_link
+10 common unlink sys_unlink
+11 common execve sys_execve
+12 common chdir sys_chdir
+13 oabi time sys_time32
+14 common mknod sys_mknod
+15 common chmod sys_chmod
+16 common lchown sys_lchown16
+# 17 was sys_break
+# 18 was sys_stat
+19 common lseek sys_lseek
+20 common getpid sys_getpid
+21 common mount sys_mount
+22 oabi umount sys_oldumount
+23 common setuid sys_setuid16
+24 common getuid sys_getuid16
+25 oabi stime sys_stime32
+26 common ptrace sys_ptrace
+27 oabi alarm sys_alarm
+# 28 was sys_fstat
+29 common pause sys_pause
+30 oabi utime sys_utime32
+# 31 was sys_stty
+# 32 was sys_gtty
+33 common access sys_access
+34 common nice sys_nice
+# 35 was sys_ftime
+36 common sync sys_sync
+37 common kill sys_kill
+38 common rename sys_rename
+39 common mkdir sys_mkdir
+40 common rmdir sys_rmdir
+41 common dup sys_dup
+42 common pipe sys_pipe
+43 common times sys_times
+# 44 was sys_prof
+45 common brk sys_brk
+46 common setgid sys_setgid16
+47 common getgid sys_getgid16
+# 48 was sys_signal
+49 common geteuid sys_geteuid16
+50 common getegid sys_getegid16
+51 common acct sys_acct
+52 common umount2 sys_umount
+# 53 was sys_lock
+54 common ioctl sys_ioctl
+55 common fcntl sys_fcntl
+# 56 was sys_mpx
+57 common setpgid sys_setpgid
+# 58 was sys_ulimit
+# 59 was sys_olduname
+60 common umask sys_umask
+61 common chroot sys_chroot
+62 common ustat sys_ustat
+63 common dup2 sys_dup2
+64 common getppid sys_getppid
+65 common getpgrp sys_getpgrp
+66 common setsid sys_setsid
+67 common sigaction sys_sigaction
+# 68 was sys_sgetmask
+# 69 was sys_ssetmask
+70 common setreuid sys_setreuid16
+71 common setregid sys_setregid16
+72 common sigsuspend sys_sigsuspend
+73 common sigpending sys_sigpending
+74 common sethostname sys_sethostname
+75 common setrlimit sys_setrlimit
+# Back compat 2GB limited rlimit
+76 oabi getrlimit sys_old_getrlimit
+77 common getrusage sys_getrusage
+78 common gettimeofday sys_gettimeofday
+79 common settimeofday sys_settimeofday
+80 common getgroups sys_getgroups16
+81 common setgroups sys_setgroups16
+82 oabi select sys_old_select
+83 common symlink sys_symlink
+# 84 was sys_lstat
+85 common readlink sys_readlink
+86 common uselib sys_uselib
+87 common swapon sys_swapon
+88 common reboot sys_reboot
+89 oabi readdir sys_old_readdir
+90 oabi mmap sys_old_mmap
+91 common munmap sys_munmap
+92 common truncate sys_truncate
+93 common ftruncate sys_ftruncate
+94 common fchmod sys_fchmod
+95 common fchown sys_fchown16
+96 common getpriority sys_getpriority
+97 common setpriority sys_setpriority
+# 98 was sys_profil
+99 common statfs sys_statfs
+100 common fstatfs sys_fstatfs
+# 101 was sys_ioperm
+102 oabi socketcall sys_socketcall sys_oabi_socketcall
+103 common syslog sys_syslog
+104 common setitimer sys_setitimer
+105 common getitimer sys_getitimer
+106 common stat sys_newstat
+107 common lstat sys_newlstat
+108 common fstat sys_newfstat
+# 109 was sys_uname
+# 110 was sys_iopl
+111 common vhangup sys_vhangup
+# 112 was sys_idle
+# syscall to call a syscall!
+113 oabi syscall sys_syscall
+114 common wait4 sys_wait4
+115 common swapoff sys_swapoff
+116 common sysinfo sys_sysinfo
+117 oabi ipc sys_ipc sys_oabi_ipc
+118 common fsync sys_fsync
+119 common sigreturn sys_sigreturn_wrapper
+120 common clone sys_clone
+121 common setdomainname sys_setdomainname
+122 common uname sys_newuname
+# 123 was sys_modify_ldt
+124 common adjtimex sys_adjtimex_time32
+125 common mprotect sys_mprotect
+126 common sigprocmask sys_sigprocmask
+# 127 was sys_create_module
+128 common init_module sys_init_module
+129 common delete_module sys_delete_module
+# 130 was sys_get_kernel_syms
+131 common quotactl sys_quotactl
+132 common getpgid sys_getpgid
+133 common fchdir sys_fchdir
+134 common bdflush sys_ni_syscall
+135 common sysfs sys_sysfs
+136 common personality sys_personality
+# 137 was sys_afs_syscall
+138 common setfsuid sys_setfsuid16
+139 common setfsgid sys_setfsgid16
+140 common _llseek sys_llseek
+141 common getdents sys_getdents
+142 common _newselect sys_select
+143 common flock sys_flock
+144 common msync sys_msync
+145 common readv sys_readv
+146 common writev sys_writev
+147 common getsid sys_getsid
+148 common fdatasync sys_fdatasync
+149 common _sysctl sys_ni_syscall
+150 common mlock sys_mlock
+151 common munlock sys_munlock
+152 common mlockall sys_mlockall
+153 common munlockall sys_munlockall
+154 common sched_setparam sys_sched_setparam
+155 common sched_getparam sys_sched_getparam
+156 common sched_setscheduler sys_sched_setscheduler
+157 common sched_getscheduler sys_sched_getscheduler
+158 common sched_yield sys_sched_yield
+159 common sched_get_priority_max sys_sched_get_priority_max
+160 common sched_get_priority_min sys_sched_get_priority_min
+161 common sched_rr_get_interval sys_sched_rr_get_interval_time32
+162 common nanosleep sys_nanosleep_time32
+163 common mremap sys_mremap
+164 common setresuid sys_setresuid16
+165 common getresuid sys_getresuid16
+# 166 was sys_vm86
+# 167 was sys_query_module
+168 common poll sys_poll
+169 common nfsservctl
+170 common setresgid sys_setresgid16
+171 common getresgid sys_getresgid16
+172 common prctl sys_prctl
+173 common rt_sigreturn sys_rt_sigreturn_wrapper
+174 common rt_sigaction sys_rt_sigaction
+175 common rt_sigprocmask sys_rt_sigprocmask
+176 common rt_sigpending sys_rt_sigpending
+177 common rt_sigtimedwait sys_rt_sigtimedwait_time32
+178 common rt_sigqueueinfo sys_rt_sigqueueinfo
+179 common rt_sigsuspend sys_rt_sigsuspend
+180 common pread64 sys_pread64 sys_oabi_pread64
+181 common pwrite64 sys_pwrite64 sys_oabi_pwrite64
+182 common chown sys_chown16
+183 common getcwd sys_getcwd
+184 common capget sys_capget
+185 common capset sys_capset
+186 common sigaltstack sys_sigaltstack
+187 common sendfile sys_sendfile
+# 188 reserved
+# 189 reserved
+190 common vfork sys_vfork
+# SuS compliant getrlimit
+191 common ugetrlimit sys_getrlimit
+192 common mmap2 sys_mmap2
+193 common truncate64 sys_truncate64 sys_oabi_truncate64
+194 common ftruncate64 sys_ftruncate64 sys_oabi_ftruncate64
+195 common stat64 sys_stat64 sys_oabi_stat64
+196 common lstat64 sys_lstat64 sys_oabi_lstat64
+197 common fstat64 sys_fstat64 sys_oabi_fstat64
+198 common lchown32 sys_lchown
+199 common getuid32 sys_getuid
+200 common getgid32 sys_getgid
+201 common geteuid32 sys_geteuid
+202 common getegid32 sys_getegid
+203 common setreuid32 sys_setreuid
+204 common setregid32 sys_setregid
+205 common getgroups32 sys_getgroups
+206 common setgroups32 sys_setgroups
+207 common fchown32 sys_fchown
+208 common setresuid32 sys_setresuid
+209 common getresuid32 sys_getresuid
+210 common setresgid32 sys_setresgid
+211 common getresgid32 sys_getresgid
+212 common chown32 sys_chown
+213 common setuid32 sys_setuid
+214 common setgid32 sys_setgid
+215 common setfsuid32 sys_setfsuid
+216 common setfsgid32 sys_setfsgid
+217 common getdents64 sys_getdents64
+218 common pivot_root sys_pivot_root
+219 common mincore sys_mincore
+220 common madvise sys_madvise
+221 common fcntl64 sys_fcntl64 sys_oabi_fcntl64
+# 222 for tux
+# 223 is unused
+224 common gettid sys_gettid
+225 common readahead sys_readahead sys_oabi_readahead
+226 common setxattr sys_setxattr
+227 common lsetxattr sys_lsetxattr
+228 common fsetxattr sys_fsetxattr
+229 common getxattr sys_getxattr
+230 common lgetxattr sys_lgetxattr
+231 common fgetxattr sys_fgetxattr
+232 common listxattr sys_listxattr
+233 common llistxattr sys_llistxattr
+234 common flistxattr sys_flistxattr
+235 common removexattr sys_removexattr
+236 common lremovexattr sys_lremovexattr
+237 common fremovexattr sys_fremovexattr
+238 common tkill sys_tkill
+239 common sendfile64 sys_sendfile64
+240 common futex sys_futex_time32
+241 common sched_setaffinity sys_sched_setaffinity
+242 common sched_getaffinity sys_sched_getaffinity
+243 common io_setup sys_io_setup
+244 common io_destroy sys_io_destroy
+245 common io_getevents sys_io_getevents_time32
+246 common io_submit sys_io_submit
+247 common io_cancel sys_io_cancel
+248 common exit_group sys_exit_group
+249 common lookup_dcookie sys_ni_syscall
+250 common epoll_create sys_epoll_create
+251 common epoll_ctl sys_epoll_ctl sys_oabi_epoll_ctl
+252 common epoll_wait sys_epoll_wait
+253 common remap_file_pages sys_remap_file_pages
+# 254 for set_thread_area
+# 255 for get_thread_area
+256 common set_tid_address sys_set_tid_address
+257 common timer_create sys_timer_create
+258 common timer_settime sys_timer_settime32
+259 common timer_gettime sys_timer_gettime32
+260 common timer_getoverrun sys_timer_getoverrun
+261 common timer_delete sys_timer_delete
+262 common clock_settime sys_clock_settime32
+263 common clock_gettime sys_clock_gettime32
+264 common clock_getres sys_clock_getres_time32
+265 common clock_nanosleep sys_clock_nanosleep_time32
+266 common statfs64 sys_statfs64_wrapper
+267 common fstatfs64 sys_fstatfs64_wrapper
+268 common tgkill sys_tgkill
+269 common utimes sys_utimes_time32
+270 common arm_fadvise64_64 sys_arm_fadvise64_64
+271 common pciconfig_iobase sys_pciconfig_iobase
+272 common pciconfig_read sys_pciconfig_read
+273 common pciconfig_write sys_pciconfig_write
+274 common mq_open sys_mq_open
+275 common mq_unlink sys_mq_unlink
+276 common mq_timedsend sys_mq_timedsend_time32
+277 common mq_timedreceive sys_mq_timedreceive_time32
+278 common mq_notify sys_mq_notify
+279 common mq_getsetattr sys_mq_getsetattr
+280 common waitid sys_waitid
+281 common socket sys_socket
+282 common bind sys_bind sys_oabi_bind
+283 common connect sys_connect sys_oabi_connect
+284 common listen sys_listen
+285 common accept sys_accept
+286 common getsockname sys_getsockname
+287 common getpeername sys_getpeername
+288 common socketpair sys_socketpair
+289 common send sys_send
+290 common sendto sys_sendto sys_oabi_sendto
+291 common recv sys_recv
+292 common recvfrom sys_recvfrom
+293 common shutdown sys_shutdown
+294 common setsockopt sys_setsockopt
+295 common getsockopt sys_getsockopt
+296 common sendmsg sys_sendmsg sys_oabi_sendmsg
+297 common recvmsg sys_recvmsg
+298 common semop sys_semop sys_oabi_semop
+299 common semget sys_semget
+300 common semctl sys_old_semctl
+301 common msgsnd sys_msgsnd
+302 common msgrcv sys_msgrcv
+303 common msgget sys_msgget
+304 common msgctl sys_old_msgctl
+305 common shmat sys_shmat
+306 common shmdt sys_shmdt
+307 common shmget sys_shmget
+308 common shmctl sys_old_shmctl
+309 common add_key sys_add_key
+310 common request_key sys_request_key
+311 common keyctl sys_keyctl
+312 common semtimedop sys_semtimedop_time32 sys_oabi_semtimedop
+313 common vserver
+314 common ioprio_set sys_ioprio_set
+315 common ioprio_get sys_ioprio_get
+316 common inotify_init sys_inotify_init
+317 common inotify_add_watch sys_inotify_add_watch
+318 common inotify_rm_watch sys_inotify_rm_watch
+319 common mbind sys_mbind
+320 common get_mempolicy sys_get_mempolicy
+321 common set_mempolicy sys_set_mempolicy
+322 common openat sys_openat
+323 common mkdirat sys_mkdirat
+324 common mknodat sys_mknodat
+325 common fchownat sys_fchownat
+326 common futimesat sys_futimesat_time32
+327 common fstatat64 sys_fstatat64 sys_oabi_fstatat64
+328 common unlinkat sys_unlinkat
+329 common renameat sys_renameat
+330 common linkat sys_linkat
+331 common symlinkat sys_symlinkat
+332 common readlinkat sys_readlinkat
+333 common fchmodat sys_fchmodat
+334 common faccessat sys_faccessat
+335 common pselect6 sys_pselect6_time32
+336 common ppoll sys_ppoll_time32
+337 common unshare sys_unshare
+338 common set_robust_list sys_set_robust_list
+339 common get_robust_list sys_get_robust_list
+340 common splice sys_splice
+341 common arm_sync_file_range sys_sync_file_range2
+342 common tee sys_tee
+343 common vmsplice sys_vmsplice
+344 common move_pages sys_move_pages
+345 common getcpu sys_getcpu
+346 common epoll_pwait sys_epoll_pwait
+347 common kexec_load sys_kexec_load
+348 common utimensat sys_utimensat_time32
+349 common signalfd sys_signalfd
+350 common timerfd_create sys_timerfd_create
+351 common eventfd sys_eventfd
+352 common fallocate sys_fallocate
+353 common timerfd_settime sys_timerfd_settime32
+354 common timerfd_gettime sys_timerfd_gettime32
+355 common signalfd4 sys_signalfd4
+356 common eventfd2 sys_eventfd2
+357 common epoll_create1 sys_epoll_create1
+358 common dup3 sys_dup3
+359 common pipe2 sys_pipe2
+360 common inotify_init1 sys_inotify_init1
+361 common preadv sys_preadv
+362 common pwritev sys_pwritev
+363 common rt_tgsigqueueinfo sys_rt_tgsigqueueinfo
+364 common perf_event_open sys_perf_event_open
+365 common recvmmsg sys_recvmmsg_time32
+366 common accept4 sys_accept4
+367 common fanotify_init sys_fanotify_init
+368 common fanotify_mark sys_fanotify_mark
+369 common prlimit64 sys_prlimit64
+370 common name_to_handle_at sys_name_to_handle_at
+371 common open_by_handle_at sys_open_by_handle_at
+372 common clock_adjtime sys_clock_adjtime32
+373 common syncfs sys_syncfs
+374 common sendmmsg sys_sendmmsg
+375 common setns sys_setns
+376 common process_vm_readv sys_process_vm_readv
+377 common process_vm_writev sys_process_vm_writev
+378 common kcmp sys_kcmp
+379 common finit_module sys_finit_module
+380 common sched_setattr sys_sched_setattr
+381 common sched_getattr sys_sched_getattr
+382 common renameat2 sys_renameat2
+383 common seccomp sys_seccomp
+384 common getrandom sys_getrandom
+385 common memfd_create sys_memfd_create
+386 common bpf sys_bpf
+387 common execveat sys_execveat
+388 common userfaultfd sys_userfaultfd
+389 common membarrier sys_membarrier
+390 common mlock2 sys_mlock2
+391 common copy_file_range sys_copy_file_range
+392 common preadv2 sys_preadv2
+393 common pwritev2 sys_pwritev2
+394 common pkey_mprotect sys_pkey_mprotect
+395 common pkey_alloc sys_pkey_alloc
+396 common pkey_free sys_pkey_free
+397 common statx sys_statx
+398 common rseq sys_rseq
+399 common io_pgetevents sys_io_pgetevents_time32
+400 common migrate_pages sys_migrate_pages
+401 common kexec_file_load sys_kexec_file_load
+# 402 is unused
+403 common clock_gettime64 sys_clock_gettime
+404 common clock_settime64 sys_clock_settime
+405 common clock_adjtime64 sys_clock_adjtime
+406 common clock_getres_time64 sys_clock_getres
+407 common clock_nanosleep_time64 sys_clock_nanosleep
+408 common timer_gettime64 sys_timer_gettime
+409 common timer_settime64 sys_timer_settime
+410 common timerfd_gettime64 sys_timerfd_gettime
+411 common timerfd_settime64 sys_timerfd_settime
+412 common utimensat_time64 sys_utimensat
+413 common pselect6_time64 sys_pselect6
+414 common ppoll_time64 sys_ppoll
+416 common io_pgetevents_time64 sys_io_pgetevents
+417 common recvmmsg_time64 sys_recvmmsg
+418 common mq_timedsend_time64 sys_mq_timedsend
+419 common mq_timedreceive_time64 sys_mq_timedreceive
+420 common semtimedop_time64 sys_semtimedop
+421 common rt_sigtimedwait_time64 sys_rt_sigtimedwait
+422 common futex_time64 sys_futex
+423 common sched_rr_get_interval_time64 sys_sched_rr_get_interval
+424 common pidfd_send_signal sys_pidfd_send_signal
+425 common io_uring_setup sys_io_uring_setup
+426 common io_uring_enter sys_io_uring_enter
+427 common io_uring_register sys_io_uring_register
+428 common open_tree sys_open_tree
+429 common move_mount sys_move_mount
+430 common fsopen sys_fsopen
+431 common fsconfig sys_fsconfig
+432 common fsmount sys_fsmount
+433 common fspick sys_fspick
+434 common pidfd_open sys_pidfd_open
+435 common clone3 sys_clone3
+436 common close_range sys_close_range
+437 common openat2 sys_openat2
+438 common pidfd_getfd sys_pidfd_getfd
+439 common faccessat2 sys_faccessat2
+440 common process_madvise sys_process_madvise
+441 common epoll_pwait2 sys_epoll_pwait2
+442 common mount_setattr sys_mount_setattr
+443 common quotactl_fd sys_quotactl_fd
+444 common landlock_create_ruleset sys_landlock_create_ruleset
+445 common landlock_add_rule sys_landlock_add_rule
+446 common landlock_restrict_self sys_landlock_restrict_self
+# 447 reserved for memfd_secret
+448 common process_mrelease sys_process_mrelease
+449 common futex_waitv sys_futex_waitv
+450 common set_mempolicy_home_node sys_set_mempolicy_home_node
+451 common cachestat sys_cachestat
+452 common fchmodat2 sys_fchmodat2
+453 common map_shadow_stack sys_map_shadow_stack
+454 common futex_wake sys_futex_wake
+455 common futex_wait sys_futex_wait
+456 common futex_requeue sys_futex_requeue
+457 common statmount sys_statmount
+458 common listmount sys_listmount
+459 common lsm_get_self_attr sys_lsm_get_self_attr
+460 common lsm_set_self_attr sys_lsm_set_self_attr
+461 common lsm_list_modules sys_lsm_list_modules
+462 common mseal sys_mseal
--git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh
index 714c78e5da07c163..d894f4389a8fc697 100755
--- a/tools/perf/check-headers.sh
+++ b/tools/perf/check-headers.sh
@@ -172,6 +172,7 @@ check lib/ctype.c '-I "^EXPORT_SYMBOL" -I "^#include <linux/export.h>" -B
check lib/list_sort.c '-I "^#include <linux/bug.h>"'
# diff non-symmetric files
+check_2 tools/perf/arch/arm/entry/syscalls/syscall.tbl arch/arm/tools/syscall.tbl
check_2 tools/perf/arch/x86/entry/syscalls/syscall_32.tbl arch/x86/entry/syscalls/syscall_32.tbl
check_2 tools/perf/arch/x86/entry/syscalls/syscall_64.tbl arch/x86/entry/syscalls/syscall_64.tbl
check_2 tools/perf/arch/powerpc/entry/syscalls/syscall.tbl arch/powerpc/kernel/syscalls/syscall.tbl
diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
index 7c15dec6900d8aaa..737544525c47b894 100644
--- a/tools/perf/util/syscalltbl.c
+++ b/tools/perf/util/syscalltbl.c
@@ -38,6 +38,10 @@ static const char *const *syscalltbl_native = syscalltbl_powerpc_32;
#include <asm/syscalls.c>
const int syscalltbl_native_max_id = SYSCALLTBL_ARM64_MAX_ID;
static const char *const *syscalltbl_native = syscalltbl_arm64;
+#elif defined(__arm__)
+#include <asm/syscalls.c>
+const int syscalltbl_native_max_id = SYSCALLTBL_ARM_MAX_ID;
+static const char *const *syscalltbl_native = syscalltbl_arm;
#elif defined(__mips__)
#include <asm/syscalls_n64.c>
const int syscalltbl_native_max_id = SYSCALLTBL_MIPS_N64_MAX_ID;
--
2.46.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-10 21:02 ` Arnaldo Carvalho de Melo
@ 2024-10-14 12:19 ` Jiri Slaby
[not found] ` <CA+JHD937angqu=48-kPC7LvtMMQPgUGp+2x5b+JKVNoFa3+9HQ@mail.gmail.com>
2024-10-18 22:16 ` Arnaldo Carvalho de Melo
0 siblings, 2 replies; 38+ messages in thread
From: Jiri Slaby @ 2024-10-14 12:19 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Namhyung Kim
Cc: Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa, Kan Liang,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
On 10. 10. 24, 23:02, Arnaldo Carvalho de Melo wrote:
> On Thu, Oct 10, 2024 at 09:31:54AM -0700, Namhyung Kim wrote:
>> On Thu, Oct 10, 2024 at 09:29:01AM -0700, Namhyung Kim wrote:
>>> On Thu, Oct 10, 2024 at 10:22:12AM +0200, Jiri Slaby wrote:
>>>> From 3d4f06d79c949a8f155c20652b4f685540899ad4 Mon Sep 17 00:00:00 2001
>>>> From: Jiri Slaby <jslaby@suse.cz>
>>>> Date: Thu, 10 Oct 2024 09:57:07 +0200
>>>> Subject: [PATCH] perf: fix non-listed archs
>
>>>> Suggested-by: Howard Chu <howardchu95@gmail.com>
>>>> Signed-off-by: Jiri Slaby <jslaby@suse.cz>
>
>>> Acked-by: Namhyung Kim <namhyung@kernel.org>
>
>> Also with,
>
>> Fixes: 7a2fb5619cc1fb53 ("perf trace: Fix iteration of syscall ids in syscalltbl->entries")
>
>>> Arnaldo, can you please pick this up for v6.12?
>
> Sure, probably the safest bet now, but just in case, Jiri, can you test
> the following?
>
> - Arnaldo
>
> From a93dff5b66fb319d700c968de1906a0868a505dc Mon Sep 17 00:00:00 2001
> From: Arnaldo Carvalho de Melo <acme@redhat.com>
> Date: Thu, 10 Oct 2024 17:52:19 -0300
> Subject: [PATCH 1/1] perf tools arm: Generate syscalltbl.c from arm's
> syscall.tbl
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
With this:
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -31,7 +31,7 @@ $(call detected_var,SRCARCH)
ifneq ($(NO_SYSCALL_TABLE),1)
NO_SYSCALL_TABLE := 1
- ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm64 s390 mips
loongarch))
+ ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 powerpc arm arm64 s390 mips
loongarch))
NO_SYSCALL_TABLE := 0
endif
and this:
--- a/tools/perf/util/syscalltbl.c
+++ b/tools/perf/util/syscalltbl.c
@@ -39,7 +39,7 @@ static const char *const *syscalltbl_native =
syscalltbl_powerpc_32;
const int syscalltbl_native_max_id = SYSCALLTBL_ARM64_MAX_ID;
static const char *const *syscalltbl_native = syscalltbl_arm64;
#elif defined(__arm__)
-#include <asm/syscalls.c>
+#include <asm/syscalls_32.c>
const int syscalltbl_native_max_id = SYSCALLTBL_ARM_MAX_ID;
static const char *const *syscalltbl_native = syscalltbl_arm;
#elif defined(__mips__)
and this:
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -61,6 +61,7 @@ ifeq ($(SRCARCH),x86)
endif
ifeq ($(SRCARCH),arm)
+ CFLAGS += -I$(OUTPUT)arch/arm/include/generated
LIBUNWIND_LIBS = -lunwind -lunwind-arm
endif
it builds ;).
thanks,
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
[parent not found: <CA+JHD937angqu=48-kPC7LvtMMQPgUGp+2x5b+JKVNoFa3+9HQ@mail.gmail.com>]
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
[not found] ` <CA+JHD937angqu=48-kPC7LvtMMQPgUGp+2x5b+JKVNoFa3+9HQ@mail.gmail.com>
@ 2024-10-14 13:04 ` Jiri Slaby
2024-10-14 13:06 ` Jiri Slaby
2024-10-14 13:12 ` Jiri Slaby
0 siblings, 2 replies; 38+ messages in thread
From: Jiri Slaby @ 2024-10-14 13:04 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Howard Chu, Adrian Hunter,
Ian Rogers, Jiri Olsa, Kan Liang, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On 14. 10. 24, 14:43, Arnaldo Carvalho de Melo wrote:
> And works? :-)
I cannot tell :P.
> I need to get access to a 32-bit arm distro that I can use with qemu or
> with one of the libre computer arm64 boards I have, can you point me to
> one? :-)
The former might be openSUSE. I have just booted:
https://download.opensuse.org/ports/armv7hl/tumbleweed/appliances/openSUSE-Tumbleweed-ARM-JeOS-efi.armv7l.raw.xz
with (when unpacked and aavmf-aarch32-vars.bin copied to /tmp/arm.bin):
qemu-system-arm -cpu cortex-a15 -M virt -hda
/tmp/openSUSE-Tumbleweed-ARM-JeOS-efi.armv7l.raw -nographic -drive
if=pflash,format=raw,unit=0,readonly=on,file=/usr/share/qemu/aavmf-aarch32-code.bin
-drive if=pflash,format=raw,unit=1,file=/tmp/arm.bin -m 2000
thanks,
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-14 13:04 ` Jiri Slaby
@ 2024-10-14 13:06 ` Jiri Slaby
2024-10-14 13:12 ` Jiri Slaby
1 sibling, 0 replies; 38+ messages in thread
From: Jiri Slaby @ 2024-10-14 13:06 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Howard Chu, Adrian Hunter,
Ian Rogers, Jiri Olsa, Kan Liang, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On 14. 10. 24, 15:04, Jiri Slaby wrote:
> On 14. 10. 24, 14:43, Arnaldo Carvalho de Melo wrote:
>> And works? :-)
>
> I cannot tell :P.
>
>> I need to get access to a 32-bit arm distro that I can use with qemu
>> or with one of the libre computer arm64 boards I have, can you point
>> me to one? :-)
>
> The former might be openSUSE. I have just booted:
> https://download.opensuse.org/ports/armv7hl/tumbleweed/appliances/openSUSE-Tumbleweed-ARM-JeOS-efi.armv7l.raw.xz
>
> with (when unpacked and aavmf-aarch32-vars.bin copied to /tmp/arm.bin):
> qemu-system-arm -cpu cortex-a15 -M virt -hda
> /tmp/openSUSE-Tumbleweed-ARM-JeOS-efi.armv7l.raw -nographic -drive
> if=pflash,format=raw,unit=0,readonly=on,file=/usr/share/qemu/aavmf-aarch32-code.bin -drive if=pflash,format=raw,unit=1,file=/tmp/arm.bin -m 2000
FWIW
login: root
pass: linux
in all openSUSE images.
> thanks,--
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-14 13:04 ` Jiri Slaby
2024-10-14 13:06 ` Jiri Slaby
@ 2024-10-14 13:12 ` Jiri Slaby
1 sibling, 0 replies; 38+ messages in thread
From: Jiri Slaby @ 2024-10-14 13:12 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Howard Chu, Adrian Hunter,
Ian Rogers, Jiri Olsa, Kan Liang, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On 14. 10. 24, 15:04, Jiri Slaby wrote:
> On 14. 10. 24, 14:43, Arnaldo Carvalho de Melo wrote:
>> And works? :-)
>
> I cannot tell :P.
>
>> I need to get access to a 32-bit arm distro that I can use with qemu
>> or with one of the libre computer arm64 boards I have, can you point
>> me to one? :-)
>
> The former might be openSUSE. I have just booted:
> https://download.opensuse.org/ports/armv7hl/tumbleweed/appliances/openSUSE-Tumbleweed-ARM-JeOS-efi.armv7l.raw.xz
>
> with (when unpacked and aavmf-aarch32-vars.bin copied to /tmp/arm.bin):
> qemu-system-arm -cpu cortex-a15 -M virt -hda
> /tmp/openSUSE-Tumbleweed-ARM-JeOS-efi.armv7l.raw -nographic -drive
> if=pflash,format=raw,unit=0,readonly=on,file=/usr/share/qemu/aavmf-aarch32-code.bin -drive if=pflash,format=raw,unit=1,file=/tmp/arm.bin -m 2000
Ok, so I installed the new perf and perf record+report and perf top seem
to do the right thing. But I have no proof.
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-14 12:19 ` Jiri Slaby
[not found] ` <CA+JHD937angqu=48-kPC7LvtMMQPgUGp+2x5b+JKVNoFa3+9HQ@mail.gmail.com>
@ 2024-10-18 22:16 ` Arnaldo Carvalho de Melo
2024-10-18 22:26 ` Arnaldo Carvalho de Melo
1 sibling, 1 reply; 38+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-10-18 22:16 UTC (permalink / raw)
To: Jiri Slaby
Cc: Namhyung Kim, Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa,
Kan Liang, linux-perf-users, linux-kernel, Song Liu,
Yonghong Song, Arnaldo Carvalho de Melo
On Mon, Oct 14, 2024 at 02:19:58PM +0200, Jiri Slaby wrote:
> On 10. 10. 24, 23:02, Arnaldo Carvalho de Melo wrote:
> > On Thu, Oct 10, 2024 at 09:31:54AM -0700, Namhyung Kim wrote:
> > > On Thu, Oct 10, 2024 at 09:29:01AM -0700, Namhyung Kim wrote:
> > > > On Thu, Oct 10, 2024 at 10:22:12AM +0200, Jiri Slaby wrote:
> > > > > Subject: [PATCH] perf: fix non-listed archs
> > > > > Suggested-by: Howard Chu <howardchu95@gmail.com>
> > > > > Signed-off-by: Jiri Slaby <jslaby@suse.cz>
> > > > Acked-by: Namhyung Kim <namhyung@kernel.org>
> > > Also with,
> > > Fixes: 7a2fb5619cc1fb53 ("perf trace: Fix iteration of syscall ids in syscalltbl->entries")
> > > > Arnaldo, can you please pick this up for v6.12?
> > Sure, probably the safest bet now, but just in case, Jiri, can you test
> > the following?
> > From: Arnaldo Carvalho de Melo <acme@redhat.com>
> > Subject: [PATCH 1/1] perf tools arm: Generate syscalltbl.c from arm's syscall.tbl
>
> With this:
> +++ b/tools/perf/Makefile.config
> @@ -31,7 +31,7 @@ $(call detected_var,SRCARCH)
> ifneq ($(NO_SYSCALL_TABLE),1)
So after merging your changes (thanks) and finding an arm 32-bit system
(ressurecting a raspberry pi 3), I can build it, with bpf skels, etc but
then...
; } else if (size > 0 && size <= value_size) { /* struct */
83: (bf) r1 = r9
84: (07) r1 += -1
85: (67) r1 <<= 32
86: (77) r1 >>= 32
87: (25) if r1 > 0xfff goto pc+23
R0_w=map_value(id=0,off=0,ks=4,vs=24688,imm=0) R1_w=inv(id=0,umax_value=4095,var_off=(0x0; 0xfff)) R2_w=map_value(id=0,off=16,ks=4,vs=8272,imm=0) R3_w=inv(id=0) R6_w=map_value(id=0,off=20,ks=4,vs=24,imm=0) R7_w=map_value(id=0,off=56,ks=4,vs=8272,imm=0) R8_w=invP6 R9_w=inv(id=27,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R10=fp0 fp-8=mmmmmmmm fp-16_w=map_value fp-24=map_value fp-32_w=invP40 fp-40=ctx fp-48=map_value fp-56_w=inv1 fp-64_w=map_value fp-72=map_value fp-80=map_value
; if (!bpf_probe_read_user(((struct augmented_arg *)payload_offset)->value, size, arg))
88: (79) r1 = *(u64 *)(r10 -16)
89: (bf) r2 = r9
90: (85) call bpf_probe_read_user#112
R0_w=map_value(id=0,off=0,ks=4,vs=24688,imm=0) R1_w=map_value(id=0,off=112,ks=4,vs=24688,imm=0) R2_w=inv(id=27,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R3_w=inv(id=0) R6_w=map_value(id=0,off=20,ks=4,vs=24,imm=0) R7_w=map_value(id=0,off=56,ks=4,vs=8272,imm=0) R8_w=invP6 R9_w=inv(id=27,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R10=fp0 fp-8=mmmmmmmm fp-16_w=map_value fp-24=map_value fp-32_w=invP40 fp-40=ctx fp-48=map_value fp-56_w=inv1 fp-64_w=map_value fp-72=map_value fp-80=map_value
R2 unbounded memory access, use 'var &= const' or 'if (var < const)'
processed 497 insns (limit 1000000) max_states_per_insn 2 total_states 23 peak_states 23 mark_read 15
-- END PROG LOAD LOG --
libbpf: prog 'sys_enter': failed to load: -13
libbpf: failed to load object 'augmented_raw_syscalls_bpf'
libbpf: failed to load BPF skeleton 'augmented_raw_syscalls_bpf': -13
Back at playing games with the BPF verifier:
root@aquarius:~# uname -a
Linux aquarius 5.10.103-v7+ #1529 SMP Tue Mar 8 12:21:37 GMT 2022 armv7l GNU/Linux
root@aquarius:~# clang-13 --version
Raspbian clang version 13.0.1-6~deb10u4+rpi1 (172.17.3.10:/build/git/l/llvm-toolchain-13 5bdfde6d6808bed4396414f7000db3d958040453)
Target: arm-unknown-linux-gnueabihf
Thread model: posix
InstalledDir: /usr/bin
root@aquarius:~#
Will continue chasing windmills tomorrow...
- Arnaldo
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-18 22:16 ` Arnaldo Carvalho de Melo
@ 2024-10-18 22:26 ` Arnaldo Carvalho de Melo
2024-10-21 5:43 ` Jiri Slaby
0 siblings, 1 reply; 38+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-10-18 22:26 UTC (permalink / raw)
To: Jiri Slaby
Cc: Namhyung Kim, Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa,
Kan Liang, linux-perf-users, linux-kernel, Song Liu,
Yonghong Song, Arnaldo Carvalho de Melo
On Fri, Oct 18, 2024 at 07:16:49PM -0300, Arnaldo Carvalho de Melo wrote:
> On Mon, Oct 14, 2024 at 02:19:58PM +0200, Jiri Slaby wrote:
> > On 10. 10. 24, 23:02, Arnaldo Carvalho de Melo wrote:
> > > On Thu, Oct 10, 2024 at 09:31:54AM -0700, Namhyung Kim wrote:
> > > > On Thu, Oct 10, 2024 at 09:29:01AM -0700, Namhyung Kim wrote:
> > > > > On Thu, Oct 10, 2024 at 10:22:12AM +0200, Jiri Slaby wrote:
> > > > > > Subject: [PATCH] perf: fix non-listed archs
>
> > > > > > Suggested-by: Howard Chu <howardchu95@gmail.com>
> > > > > > Signed-off-by: Jiri Slaby <jslaby@suse.cz>
>
> > > > > Acked-by: Namhyung Kim <namhyung@kernel.org>
> > > > Also with,
> > > > Fixes: 7a2fb5619cc1fb53 ("perf trace: Fix iteration of syscall ids in syscalltbl->entries")
> > > > > Arnaldo, can you please pick this up for v6.12?
>
> > > Sure, probably the safest bet now, but just in case, Jiri, can you test
> > > the following?
>
> > > From: Arnaldo Carvalho de Melo <acme@redhat.com>
> > > Subject: [PATCH 1/1] perf tools arm: Generate syscalltbl.c from arm's syscall.tbl
> >
> > With this:
> > +++ b/tools/perf/Makefile.config
> > @@ -31,7 +31,7 @@ $(call detected_var,SRCARCH)
> > ifneq ($(NO_SYSCALL_TABLE),1)
>
> So after merging your changes (thanks) and finding an arm 32-bit system
> (ressurecting a raspberry pi 3), I can build it, with bpf skels, etc but
> then...
But if I uninstall clang and build without BPF skels, i.e. no BPF based
'perf trace' collection of syscall pointer args, I stumble in some other
problem on this debian (raspbian) system:
root@aquarius:~# ls -la /sys/kernel/debug/tracing/events/syscalls
ls: cannot access '/sys/kernel/debug/tracing/events/syscalls': No such file or directory
root@aquarius:~#
Unsure where to find the config used to build this kernel:
root@aquarius:~# uname -a
Linux aquarius 5.10.103-v7+ #1529 SMP Tue Mar 8 12:21:37 GMT 2022 armv7l GNU/Linux
root@aquarius:~#
normally is in /boot/ but I'm no debian user, ideas?
But at least it builds, would that be enough? I don't think so, I'd like
to see this working...
- Arnaldo
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-18 22:26 ` Arnaldo Carvalho de Melo
@ 2024-10-21 5:43 ` Jiri Slaby
2024-10-22 15:18 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 38+ messages in thread
From: Jiri Slaby @ 2024-10-21 5:43 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Namhyung Kim, Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa,
Kan Liang, linux-perf-users, linux-kernel, Song Liu,
Yonghong Song, Arnaldo Carvalho de Melo
On 19. 10. 24, 0:26, Arnaldo Carvalho de Melo wrote:
> root@aquarius:~# ls -la /sys/kernel/debug/tracing/events/syscalls
> ls: cannot access '/sys/kernel/debug/tracing/events/syscalls': No such file or directory
Doesn't 5.10 have /sys/kernel/tracing/events/syscalls yet?
Alternatively, isn't debugfs mounted elsewhere on debian? (Or mounted at
all?)
> Unsure where to find the config used to build this kernel:
>
> root@aquarius:~# uname -a
> Linux aquarius 5.10.103-v7+ #1529 SMP Tue Mar 8 12:21:37 GMT 2022 armv7l GNU/Linux
> root@aquarius:~#
>
> normally is in /boot/ but I'm no debian user, ideas?
Won't something dpkg -L linux-image tell you (I haven't used deb for years)?
Looking into:
https://ftp.debian.org/debian/pool/main/l/linux/linux-image-5.10.0-0.deb10.16-armmp_5.10.127-2~bpo10+1_armhf.deb
the config should really live in /boot.
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-21 5:43 ` Jiri Slaby
@ 2024-10-22 15:18 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 38+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-10-22 15:18 UTC (permalink / raw)
To: Jiri Slaby
Cc: Namhyung Kim, Howard Chu, Adrian Hunter, Ian Rogers, Jiri Olsa,
Kan Liang, linux-perf-users, linux-kernel, Song Liu,
Yonghong Song, Arnaldo Carvalho de Melo
On Mon, Oct 21, 2024 at 07:43:50AM +0200, Jiri Slaby wrote:
> On 19. 10. 24, 0:26, Arnaldo Carvalho de Melo wrote:
> > root@aquarius:~# ls -la /sys/kernel/debug/tracing/events/syscalls
> > ls: cannot access '/sys/kernel/debug/tracing/events/syscalls': No such file or directory
>
> Doesn't 5.10 have /sys/kernel/tracing/events/syscalls yet?
The config for rpi doesn't have, I had to install bookworm, 6.6 based
kernel, then rebuild it after enabling DWARF, BTF,
CONFIG_FTRACE_SYSCALLS and then it works, I was able to do some initial
testing of my patch:
root@raspberrypi:~# ~acme/bin/perf trace -e write,read cat /etc/passwd |& tail
saned:x:109:120::/var/lib/saned:/usr/sbin/nologin
vnc:x:992:992:vnc:/nonexistent:/usr/sbin/nologin
colord:x:110:121:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
hplip:x:111:7:HPLIP system user,,,:/run/hplip:/bin/false
acme:x:1000:1000:,,,:/home/acme:/bin/bash
0.000 ( 0.035 ms): read(fd: 3, buf: 0x7efde570, count: 512) = 512
0.256 ( 0.011 ms): read(fd: 3, buf: 0x7efde108, count: 512) = 512
1.153 ( 0.019 ms): read(fd: 3, buf: 0x76939000, count: 131072) = 1851
1.179 ( 0.043 ms): write(fd: 1, buf: , count: 1851) = 1851
1.227 ( 0.006 ms): read(fd: 3, buf: 0x76939000, count: 131072) = 0
root@raspberrypi:~#
root@raspberrypi:~# ~acme/bin/perf --version
perf version 6.12.rc3.g0f709a2d7be1
root@raspberrypi:~# ls -la /sys/kernel/tracing/events/syscalls/
Display all 760 possibilities? (y or n)^C
root@raspberrypi:~# uname -a
Linux raspberrypi 6.6.57-v7+ #1 SMP Mon Oct 21 20:55:20 -03 2024 armv7l GNU/Linux
root@raspberrypi:~# head /etc/debian_version
12.7
root@raspberrypi:~#
Now I'm back dabbling with the BPF verifier in various kernels,
including this 6.6 arm7 32-bit one:
root@raspberrypi:~# clang --version
Raspbian clang version 14.0.6
Target: arm-unknown-linux-gnueabihf
Thread model: posix
InstalledDir: /usr/bin
root@raspberrypi:~#
root@raspberrypi:~# ~acme/bin/perf trace -e clock_nanosleep,nanosleep sleep 1.23456 |& tail -20
83: (bf) r1 = r9 ; R1_w=scalar(id=13,umax=4294967295,var_off=(0x0; 0xffffffff)) R9_w=scalar(id=13,umax=4294967295,var_off=(0x0; 0xffffffff))
84: (07) r1 += -1 ; R1_w=scalar(smin=-1,smax=4294967294)
85: (67) r1 <<= 32 ; R1_w=scalar(smax=9223372032559808512,umax=18446744069414584320,var_off=(0x0; 0xffffffff00000000),s32_min=0,s32_max=0,u32_max=0)
86: (77) r1 >>= 32 ; R1=scalar(umax=4294967295,var_off=(0x0; 0xffffffff))
87: (25) if r1 > 0xfff goto pc+23 ; R1=scalar(umax=4095,var_off=(0x0; 0xfff))
; if (!bpf_probe_read_user(((struct augmented_arg *)payload_offset)->value, size, arg))
88: (79) r1 = *(u64 *)(r10 -16) ; R1_w=map_value(off=112,ks=4,vs=24688,imm=0) R10=fp0 fp-16=map_value
89: (bf) r2 = r9 ; R2_w=scalar(id=13,umax=4294967295,var_off=(0x0; 0xffffffff)) R9=scalar(id=13,umax=4294967295,var_off=(0x0; 0xffffffff))
90: (85) call bpf_probe_read_user#112
R2 unbounded memory access, use 'var &= const' or 'if (var < const)'
processed 490 insns (limit 1000000) max_states_per_insn 2 total_states 23 peak_states 23 mark_read 15
-- END PROG LOAD LOG --
libbpf: prog 'sys_enter': failed to load: -13
libbpf: failed to load object 'augmented_raw_syscalls_bpf'
libbpf: failed to load BPF skeleton 'augmented_raw_syscalls_bpf': -13
libbpf: map '__augmented_syscalls__': can't use BPF map without FD (was it created?)
libbpf: map '__augmented_syscalls__': can't use BPF map without FD (was it created?)
libbpf: map '__augmented_syscalls__': can't use BPF map without FD (was it created?)
libbpf: map '__augmented_syscalls__': can't use BPF map without FD (was it created?)
0.000 (1234.739 ms): clock_nanosleep(rqtp: 0x7ea35adc, rmtp: 0x7ea35ad4) = 0
root@raspberrypi:~#
So the original problem, that you reported, i.e. not being able to build
on 32-bit arm seems to be mostly gone, I need to do some more tests with
globbing, i.e.:
root@raspberrypi:~# ~acme/bin/perf trace -e *anosleep sleep 1.23456 |& tail
processed 490 insns (limit 1000000) max_states_per_insn 2 total_states 23 peak_states 23 mark_read 15
-- END PROG LOAD LOG --
libbpf: prog 'sys_enter': failed to load: -13
libbpf: failed to load object 'augmented_raw_syscalls_bpf'
libbpf: failed to load BPF skeleton 'augmented_raw_syscalls_bpf': -13
libbpf: map '__augmented_syscalls__': can't use BPF map without FD (was it created?)
libbpf: map '__augmented_syscalls__': can't use BPF map without FD (was it created?)
libbpf: map '__augmented_syscalls__': can't use BPF map without FD (was it created?)
libbpf: map '__augmented_syscalls__': can't use BPF map without FD (was it created?)
0.000 (1234.730 ms): clock_nanosleep(rqtp: 0x7ef0cadc, rmtp: 0x7ef0cad4) = 0
root@raspberrypi:~#
Ah, it is working, lets try something else:
root@raspberrypi:~# ~acme/bin/perf trace -e open*
<BIG SNIP>
6245.506 ( 0.018 ms): (udev-worker)/14286 openat(dfd: 13, filename: 0xd6bac0, flags: RDONLY|CLOEXEC|LARGEFILE|PATH|0x20000) = 6
6245.570 ( 0.018 ms): (udev-worker)/14286 openat(dfd: 6, filename: 0xd6bac0, flags: RDONLY|CLOEXEC|LARGEFILE|PATH|0x20000) = 13
6245.713 ( 0.017 ms): (udev-worker)/14286 openat(dfd: CWD, filename: 0x5097c0, flags: RDONLY|CLOEXEC|DIRECTORY|PATH|0x20000) = 6
6245.755 ( 0.016 ms): (udev-worker)/14286 openat(dfd: 6, filename: 0xceb5d8, flags: RDONLY|CLOEXEC|LARGEFILE|PATH|0x20000) = 13
6245.815 ( 0.018 ms): (udev-worker)/14286 openat(dfd: 13, filename: 0xceb5d8, flags: RDONLY|CLOEXEC|LARGEFILE|PATH|0x20000) = 6
6246.269 ( 0.049 ms): (udev-worker)/14286 openat(dfd: CWD, filename: 0x7eb10620, flags: RDONLY|CLOEXEC|NOCTTY|0x20000) = 6
6246.466 ( 0.032 ms): (udev-worker)/14286 openat(dfd: CWD, filename: 0x7eb10630, flags: RDONLY|CLOEXEC|0x20000) = 6
^Croot@raspberrypi:~#
Yeah, works.
So to summarize: the patch I sent and you filled in the missing bits,
that is in perf-tools/tmp.perf-tools was tested on arm v7, 32-bit, on a
Raspberry PI 3 and it builds and then when tested, works:
acme@raspberrypi:~/git/linux $ git log --oneline torvalds/master..
0f709a2d7be1 (HEAD -> perf-tools, perf-tools/perf-tools) perf trace arm32: Fix iteration of syscall ids in syscalltbl->entries
2c881b312117 perf trace augmented_raw_syscalls: Add more checks to pass the verifier
6a6c689b7540 perf trace augmented_raw_syscalls: Add extra array index bounds checking to satisfy some BPF verifiers
44c1d54d4d26 perf build: Change the clang check back to 12.0.1
39c6a356201e perf trace: The return from 'write' isn't a pid
ab8aaab874c4 tools headers UAPI: Sync linux/const.h with the kernel headers
acme@raspberrypi:~/git/linux $
Now I need to go back to the augmented_raw_syscall.bpf.o problems here
and there, probably will just push what I have (listed above) and leave
it soak in linux-next so that I can send to Linus, as it improves the
current situation.
- Arnaldo
> Alternatively, isn't debugfs mounted elsewhere on debian? (Or mounted at
> all?)
>
> > Unsure where to find the config used to build this kernel:
> >
> > root@aquarius:~# uname -a
> > Linux aquarius 5.10.103-v7+ #1529 SMP Tue Mar 8 12:21:37 GMT 2022 armv7l GNU/Linux
> > root@aquarius:~#
> >
> > normally is in /boot/ but I'm no debian user, ideas?
>
> Won't something dpkg -L linux-image tell you (I haven't used deb for years)?
>
> Looking into:
> https://ftp.debian.org/debian/pool/main/l/linux/linux-image-5.10.0-0.deb10.16-armmp_5.10.127-2~bpo10+1_armhf.deb
>
> the config should really live in /boot.
>
> --
> js
> suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-09 5:57 ` Namhyung Kim
[not found] ` <CAH0uvoi622J7gZ9BoTik7niNH3axVJR0kPNovUQnMjUB6GWLNg@mail.gmail.com>
@ 2024-10-10 8:11 ` Jiri Slaby
2024-10-10 16:19 ` Namhyung Kim
1 sibling, 1 reply; 38+ messages in thread
From: Jiri Slaby @ 2024-10-10 8:11 UTC (permalink / raw)
To: Namhyung Kim
Cc: Arnaldo Carvalho de Melo, Howard Chu, Adrian Hunter, Ian Rogers,
Jiri Olsa, Kan Liang, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On 09. 10. 24, 7:57, Namhyung Kim wrote:
> diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
> index 7c15dec6900d8aaa..b7465a879d8bf416 100644
> --- a/tools/perf/util/syscalltbl.c
> +++ b/tools/perf/util/syscalltbl.c
> @@ -46,6 +46,11 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64;
> #include <asm/syscalls.c>
> const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
> static const char *const *syscalltbl_native = syscalltbl_loongarch;
> +#else
> +const int syscalltbl_native_max_id = 1;
> +static const char *const syscalltbl_native[] = {
> + [0] = "unknown",
> +};
Hi,
provided the error was:
undefined reference to `syscalltbl__id_at_idx'
this cannot help on its own, obviously.
Checking with the other diff.
thanks,
--
js
suse labs
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH/RFT] Re: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries
2024-10-10 8:11 ` Jiri Slaby
@ 2024-10-10 16:19 ` Namhyung Kim
0 siblings, 0 replies; 38+ messages in thread
From: Namhyung Kim @ 2024-10-10 16:19 UTC (permalink / raw)
To: Jiri Slaby
Cc: Arnaldo Carvalho de Melo, Howard Chu, Adrian Hunter, Ian Rogers,
Jiri Olsa, Kan Liang, linux-perf-users, linux-kernel,
Arnaldo Carvalho de Melo
On Thu, Oct 10, 2024 at 10:11:47AM +0200, Jiri Slaby wrote:
> On 09. 10. 24, 7:57, Namhyung Kim wrote:
> > diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
> > index 7c15dec6900d8aaa..b7465a879d8bf416 100644
> > --- a/tools/perf/util/syscalltbl.c
> > +++ b/tools/perf/util/syscalltbl.c
> > @@ -46,6 +46,11 @@ static const char *const *syscalltbl_native = syscalltbl_mips_n64;
> > #include <asm/syscalls.c>
> > const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
> > static const char *const *syscalltbl_native = syscalltbl_loongarch;
> > +#else
> > +const int syscalltbl_native_max_id = 1;
> > +static const char *const syscalltbl_native[] = {
> > + [0] = "unknown",
> > +};
>
> Hi,
>
> provided the error was:
> undefined reference to `syscalltbl__id_at_idx'
>
> this cannot help on its own, obviously.
Oops, I was looking at a different one for some reason.
Thanks,
Namhyung
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v5 2/8] perf trace: BTF-based enum pretty printing for syscall args
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
2024-07-05 13:20 ` [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries Howard Chu
@ 2024-07-05 13:20 ` Howard Chu
2024-07-05 13:20 ` [PATCH v5 3/8] perf trace: Augment non-syscall tracepoints with enum arguments with BTF Howard Chu
` (7 subsequent siblings)
9 siblings, 0 replies; 38+ messages in thread
From: Howard Chu @ 2024-07-05 13:20 UTC (permalink / raw)
To: acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo,
Alexander Shishkin, Günther Noack, Ingo Molnar, Mark Rutland,
Mickaël Salaün, Peter Zijlstra
In this patch, BTF is used to turn enum value to the corresponding
name. There is only one system call that uses enum value as its
argument, that is `landlock_add_rule()`.
The vmlinux btf is loaded lazily, when user decided to trace the
`landlock_add_rule` syscall. But if one decide to run `perf trace`
without any arguments, the behaviour is to trace `landlock_add_rule`,
so vmlinux btf will be loaded by default.
The laziest behaviour is to load vmlinux btf when a
`landlock_add_rule` syscall hits. But I think you could lose some
samples when loading vmlinux btf at run time, for it can delay the
handling of other samples. I might need your precious opinions on
this...
before:
```
perf $ ./perf trace -e landlock_add_rule
0.000 ( 0.008 ms): ldlck-test/438194 landlock_add_rule(rule_type: 2) = -1 EBADFD (File descriptor in bad state)
0.010 ( 0.001 ms): ldlck-test/438194 landlock_add_rule(rule_type: 1) = -1 EBADFD (File descriptor in bad state)
```
after:
```
perf $ ./perf trace -e landlock_add_rule
0.000 ( 0.029 ms): ldlck-test/438194 landlock_add_rule(rule_type: LANDLOCK_RULE_NET_PORT) = -1 EBADFD (File descriptor in bad state)
0.036 ( 0.004 ms): ldlck-test/438194 landlock_add_rule(rule_type: LANDLOCK_RULE_PATH_BENEATH) = -1 EBADFD (File descriptor in bad state)
```
Committer notes:
Made it build with NO_LIBBPF=1, simplified btf_enum_fprintf(), see [1]
for the discussion.
Signed-off-by: Howard Chu <howardchu95@gmail.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Günther Noack <gnoack@google.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mickaël Salaün <mic@digikod.net>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/lkml/20240613022757.3589783-1-howardchu95@gmail.com
Link: https://lore.kernel.org/lkml/ZnXAhFflUl_LV1QY@x1 # [1]
Link: https://lore.kernel.org/r/20240624181345.124764-3-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-trace.c | 110 +++++++++++++++++++++++++++++++++++--
1 file changed, 106 insertions(+), 4 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 8449f2beb54d..1391564911d9 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -19,6 +19,7 @@
#ifdef HAVE_LIBBPF_SUPPORT
#include <bpf/bpf.h>
#include <bpf/libbpf.h>
+#include <bpf/btf.h>
#ifdef HAVE_BPF_SKEL
#include "bpf_skel/augmented_raw_syscalls.skel.h"
#endif
@@ -110,6 +111,10 @@ struct syscall_arg_fmt {
const char *name;
u16 nr_entries; // for arrays
bool show_zero;
+ bool is_enum;
+#ifdef HAVE_LIBBPF_SUPPORT
+ const struct btf_type *type;
+#endif
};
struct syscall_fmt {
@@ -139,6 +144,9 @@ struct trace {
} syscalls;
#ifdef HAVE_BPF_SKEL
struct augmented_raw_syscalls_bpf *skel;
+#endif
+#ifdef HAVE_LIBBPF_SUPPORT
+ struct btf *btf;
#endif
struct record_opts opts;
struct evlist *evlist;
@@ -204,6 +212,20 @@ struct trace {
} oe;
};
+static void trace__load_vmlinux_btf(struct trace *trace __maybe_unused)
+{
+#ifdef HAVE_LIBBPF_SUPPORT
+ if (trace->btf != NULL)
+ return;
+
+ trace->btf = btf__load_vmlinux_btf();
+ if (verbose > 0) {
+ fprintf(trace->output, trace->btf ? "vmlinux BTF loaded\n" :
+ "Failed to load vmlinux BTF\n");
+ }
+#endif
+}
+
struct tp_field {
int offset;
union {
@@ -887,6 +909,64 @@ static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size,
#define SCA_GETRANDOM_FLAGS syscall_arg__scnprintf_getrandom_flags
+#ifdef HAVE_LIBBPF_SUPPORT
+static int syscall_arg_fmt__cache_btf_enum(struct syscall_arg_fmt *arg_fmt, struct btf *btf, char *type)
+{
+ int id;
+
+ // Already cached?
+ if (arg_fmt->type != NULL)
+ return 0;
+
+ type = strstr(type, "enum ");
+ if (type == NULL)
+ return -1;
+
+ type += 5; // skip "enum " to get the enumeration name
+
+ id = btf__find_by_name(btf, type);
+ if (id < 0)
+ return -1;
+
+ arg_fmt->type = btf__type_by_id(btf, id);
+ return arg_fmt->type == NULL ? -1 : 0;
+}
+
+static size_t btf_enum_scnprintf(const struct btf_type *type, struct btf *btf, char *bf, size_t size, int val)
+{
+ struct btf_enum *be = btf_enum(type);
+ const int nr_entries = btf_vlen(type);
+
+ for (int i = 0; i < nr_entries; ++i, ++be) {
+ if (be->val == val) {
+ return scnprintf(bf, size, "%s",
+ btf__name_by_offset(btf, be->name_off));
+ }
+ }
+
+ return 0;
+}
+
+static size_t trace__btf_enum_scnprintf(struct trace *trace, struct syscall_arg_fmt *arg_fmt, char *bf,
+ size_t size, int val, char *type)
+{
+ if (trace->btf == NULL)
+ return 0;
+
+ if (syscall_arg_fmt__cache_btf_enum(arg_fmt, trace->btf, type) < 0)
+ return 0;
+
+ return btf_enum_scnprintf(arg_fmt->type, trace->btf, bf, size, val);
+}
+#else // HAVE_LIBBPF_SUPPORT
+static size_t trace__btf_enum_scnprintf(struct trace *trace __maybe_unused, struct syscall_arg_fmt *arg_fmt __maybe_unused,
+ char *bf __maybe_unused, size_t size __maybe_unused, int val __maybe_unused,
+ char *type __maybe_unused)
+{
+ return 0;
+}
+#endif // HAVE_LIBBPF_SUPPORT
+
#define STRARRAY(name, array) \
{ .scnprintf = SCA_STRARRAY, \
.strtoul = STUL_STRARRAY, \
@@ -1238,6 +1318,7 @@ struct syscall {
bool is_exit;
bool is_open;
bool nonexistent;
+ bool use_btf;
struct tep_format_field *args;
const char *name;
const struct syscall_fmt *fmt;
@@ -1744,7 +1825,8 @@ static const struct syscall_arg_fmt *syscall_arg_fmt__find_by_name(const char *n
}
static struct tep_format_field *
-syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field *field)
+syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field *field,
+ bool *use_btf)
{
struct tep_format_field *last_field = NULL;
int len;
@@ -1756,6 +1838,7 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
continue;
len = strlen(field->name);
+ arg->is_enum = false;
if (strcmp(field->type, "const char *") == 0 &&
((len >= 4 && strcmp(field->name + len - 4, "name") == 0) ||
@@ -1782,6 +1865,8 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
* 7 unsigned long
*/
arg->scnprintf = SCA_FD;
+ } else if (strstr(field->type, "enum") && use_btf != NULL) {
+ *use_btf = arg->is_enum = true;
} else {
const struct syscall_arg_fmt *fmt =
syscall_arg_fmt__find_by_name(field->name);
@@ -1798,7 +1883,8 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
static int syscall__set_arg_fmts(struct syscall *sc)
{
- struct tep_format_field *last_field = syscall_arg_fmt__init_array(sc->arg_fmt, sc->args);
+ struct tep_format_field *last_field = syscall_arg_fmt__init_array(sc->arg_fmt, sc->args,
+ &sc->use_btf);
if (last_field)
sc->args_size = last_field->offset + last_field->size;
@@ -1811,6 +1897,7 @@ static int trace__read_syscall_info(struct trace *trace, int id)
char tp_name[128];
struct syscall *sc;
const char *name = syscalltbl__name(trace->sctbl, id);
+ int err;
#ifdef HAVE_SYSCALL_TABLE_SUPPORT
if (trace->syscalls.table == NULL) {
@@ -1883,7 +1970,13 @@ static int trace__read_syscall_info(struct trace *trace, int id)
sc->is_exit = !strcmp(name, "exit_group") || !strcmp(name, "exit");
sc->is_open = !strcmp(name, "open") || !strcmp(name, "openat");
- return syscall__set_arg_fmts(sc);
+ err = syscall__set_arg_fmts(sc);
+
+ /* after calling syscall__set_arg_fmts() we'll know whether use_btf is true */
+ if (sc->use_btf)
+ trace__load_vmlinux_btf(trace);
+
+ return err;
}
static int evsel__init_tp_arg_scnprintf(struct evsel *evsel)
@@ -1891,7 +1984,7 @@ static int evsel__init_tp_arg_scnprintf(struct evsel *evsel)
struct syscall_arg_fmt *fmt = evsel__syscall_arg_fmt(evsel);
if (fmt != NULL) {
- syscall_arg_fmt__init_array(fmt, evsel->tp_format->format.fields);
+ syscall_arg_fmt__init_array(fmt, evsel->tp_format->format.fields, NULL);
return 0;
}
@@ -2103,6 +2196,15 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
if (trace->show_arg_names)
printed += scnprintf(bf + printed, size - printed, "%s: ", field->name);
+ if (sc->arg_fmt[arg.idx].is_enum) {
+ size_t p = trace__btf_enum_scnprintf(trace, &sc->arg_fmt[arg.idx], bf + printed,
+ size - printed, val, field->type);
+ if (p) {
+ printed += p;
+ continue;
+ }
+ }
+
printed += syscall_arg_fmt__scnprintf_val(&sc->arg_fmt[arg.idx],
bf + printed, size - printed, &arg, val);
}
--
2.45.2
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v5 3/8] perf trace: Augment non-syscall tracepoints with enum arguments with BTF
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
2024-07-05 13:20 ` [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries Howard Chu
2024-07-05 13:20 ` [PATCH v5 2/8] perf trace: BTF-based enum pretty printing for syscall args Howard Chu
@ 2024-07-05 13:20 ` Howard Chu
2024-07-05 13:20 ` [PATCH v5 4/8] perf trace: Filter enum arguments with enum names Howard Chu
` (6 subsequent siblings)
9 siblings, 0 replies; 38+ messages in thread
From: Howard Chu @ 2024-07-05 13:20 UTC (permalink / raw)
To: acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Alexander Shishkin, Ingo Molnar,
Mark Rutland, Peter Zijlstra, Arnaldo Carvalho de Melo
Before:
perf $ ./perf trace -e timer:hrtimer_start --max-events=1
0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff974466c25f18, function: 0xffffffff89da5be0, expires: 377432432256753, softexpires: 377432432256753, mode: 10)
After:
perf $ ./perf trace -e timer:hrtimer_start --max-events=1
0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: 0xffffffffa77a5be0, expires: 4382442895089, softexpires: 4382442895089, mode: HRTIMER_MODE_ABS_PINNED_HARD)
in which HRTIMER_MODE_ABS_PINNED_HARD is:
perf $ pahole hrtimer_mode
enum hrtimer_mode {
HRTIMER_MODE_ABS = 0,
HRTIMER_MODE_REL = 1,
HRTIMER_MODE_PINNED = 2,
HRTIMER_MODE_SOFT = 4,
HRTIMER_MODE_HARD = 8,
HRTIMER_MODE_ABS_PINNED = 2,
HRTIMER_MODE_REL_PINNED = 3,
HRTIMER_MODE_ABS_SOFT = 4,
HRTIMER_MODE_REL_SOFT = 5,
HRTIMER_MODE_ABS_PINNED_SOFT = 6,
HRTIMER_MODE_REL_PINNED_SOFT = 7,
HRTIMER_MODE_ABS_HARD = 8,
HRTIMER_MODE_REL_HARD = 9,
HRTIMER_MODE_ABS_PINNED_HARD = 10,
HRTIMER_MODE_REL_PINNED_HARD = 11,
};
Can also be tested by
./perf trace -e pagemap:mm_lru_insertion,timer:hrtimer_start,timer:hrtimer_init,skb:kfree_skb --max-events=10
(Chose these 4 events because they happen quite frequently.)
However some enum arguments may not be contained in vmlinux BTF. To see
what enum arguments are supported, use:
vmlinux_dir $ bpftool btf dump file /sys/kernel/btf/vmlinux > vmlinux
vmlinux_dir $ while read l; do grep "ENUM '$l'" vmlinux; done < <(grep field:enum /sys/kernel/tracing/events/*/*/format | awk '{print $3}' | sort | uniq) | awk '{print $3}' | sed "s/'\(.*\)'/\1/g"
dev_pm_qos_req_type
error_detector
hrtimer_mode
i2c_slave_event
ieee80211_bss_type
lru_list
migrate_mode
nl80211_auth_type
nl80211_band
nl80211_iftype
numa_vmaskip_reason
pm_qos_req_action
pwm_polarity
skb_drop_reason
thermal_trip_type
xen_lazy_mode
xen_mc_extend_args
xen_mc_flush_reason
zone_type
And what tracepoints have these enum types as their arguments:
vmlinux_dir $ while read l; do grep "ENUM '$l'" vmlinux; done < <(grep field:enum /sys/kernel/tracing/events/*/*/format | awk '{print $3}' | sort | uniq) | awk '{print $3}' | sed "s/'\(.*\)'/\1/g" > good_enums
vmlinux_dir $ cat good_enums
dev_pm_qos_req_type
error_detector
hrtimer_mode
i2c_slave_event
ieee80211_bss_type
lru_list
migrate_mode
nl80211_auth_type
nl80211_band
nl80211_iftype
numa_vmaskip_reason
pm_qos_req_action
pwm_polarity
skb_drop_reason
thermal_trip_type
xen_lazy_mode
xen_mc_extend_args
xen_mc_flush_reason
zone_type
vmlinux_dir $ grep -f good_enums -l /sys/kernel/tracing/events/*/*/format
/sys/kernel/tracing/events/cfg80211/cfg80211_chandef_dfs_required/format
/sys/kernel/tracing/events/cfg80211/cfg80211_ch_switch_notify/format
/sys/kernel/tracing/events/cfg80211/cfg80211_ch_switch_started_notify/format
/sys/kernel/tracing/events/cfg80211/cfg80211_get_bss/format
/sys/kernel/tracing/events/cfg80211/cfg80211_ibss_joined/format
/sys/kernel/tracing/events/cfg80211/cfg80211_inform_bss_frame/format
/sys/kernel/tracing/events/cfg80211/cfg80211_radar_event/format
/sys/kernel/tracing/events/cfg80211/cfg80211_ready_on_channel_expired/format
/sys/kernel/tracing/events/cfg80211/cfg80211_ready_on_channel/format
/sys/kernel/tracing/events/cfg80211/cfg80211_reg_can_beacon/format
/sys/kernel/tracing/events/cfg80211/cfg80211_return_bss/format
/sys/kernel/tracing/events/cfg80211/cfg80211_tx_mgmt_expired/format
/sys/kernel/tracing/events/cfg80211/rdev_add_virtual_intf/format
/sys/kernel/tracing/events/cfg80211/rdev_auth/format
/sys/kernel/tracing/events/cfg80211/rdev_change_virtual_intf/format
/sys/kernel/tracing/events/cfg80211/rdev_channel_switch/format
/sys/kernel/tracing/events/cfg80211/rdev_connect/format
/sys/kernel/tracing/events/cfg80211/rdev_inform_bss/format
/sys/kernel/tracing/events/cfg80211/rdev_libertas_set_mesh_channel/format
/sys/kernel/tracing/events/cfg80211/rdev_mgmt_tx/format
/sys/kernel/tracing/events/cfg80211/rdev_remain_on_channel/format
/sys/kernel/tracing/events/cfg80211/rdev_return_chandef/format
/sys/kernel/tracing/events/cfg80211/rdev_return_int_survey_info/format
/sys/kernel/tracing/events/cfg80211/rdev_set_ap_chanwidth/format
/sys/kernel/tracing/events/cfg80211/rdev_set_monitor_channel/format
/sys/kernel/tracing/events/cfg80211/rdev_set_radar_background/format
/sys/kernel/tracing/events/cfg80211/rdev_start_ap/format
/sys/kernel/tracing/events/cfg80211/rdev_start_radar_detection/format
/sys/kernel/tracing/events/cfg80211/rdev_tdls_channel_switch/format
/sys/kernel/tracing/events/compaction/mm_compaction_defer_compaction/format
/sys/kernel/tracing/events/compaction/mm_compaction_deferred/format
/sys/kernel/tracing/events/compaction/mm_compaction_defer_reset/format
/sys/kernel/tracing/events/compaction/mm_compaction_finished/format
/sys/kernel/tracing/events/compaction/mm_compaction_kcompactd_wake/format
/sys/kernel/tracing/events/compaction/mm_compaction_suitable/format
/sys/kernel/tracing/events/compaction/mm_compaction_wakeup_kcompactd/format
/sys/kernel/tracing/events/error_report/error_report_end/format
/sys/kernel/tracing/events/i2c_slave/i2c_slave/format
/sys/kernel/tracing/events/migrate/mm_migrate_pages/format
/sys/kernel/tracing/events/migrate/mm_migrate_pages_start/format
/sys/kernel/tracing/events/pagemap/mm_lru_insertion/format
/sys/kernel/tracing/events/power/dev_pm_qos_add_request/format
/sys/kernel/tracing/events/power/dev_pm_qos_remove_request/format
/sys/kernel/tracing/events/power/dev_pm_qos_update_request/format
/sys/kernel/tracing/events/power/pm_qos_update_flags/format
/sys/kernel/tracing/events/power/pm_qos_update_target/format
/sys/kernel/tracing/events/pwm/pwm_apply/format
/sys/kernel/tracing/events/pwm/pwm_get/format
/sys/kernel/tracing/events/sched/sched_skip_vma_numa/format
/sys/kernel/tracing/events/skb/kfree_skb/format
/sys/kernel/tracing/events/thermal/thermal_zone_trip/format
/sys/kernel/tracing/events/timer/hrtimer_init/format
/sys/kernel/tracing/events/timer/hrtimer_start/format
/sys/kernel/tracing/events/xen/xen_mc_batch/format
/sys/kernel/tracing/events/xen/xen_mc_extend_args/format
/sys/kernel/tracing/events/xen/xen_mc_flush_reason/format
/sys/kernel/tracing/events/xen/xen_mc_issue/format
Committer testing:
root@x1:~# perf trace -e timer:hrtimer_start --max-events=2
0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff225050, function: 0xffffffff9e22ddd0, expires: 241152380000000, softexpires: 241152380000000, mode: HRTIMER_MODE_ABS)
0.028 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff225050, function: 0xffffffff9e22ddd0, expires: 241153654000000, softexpires: 241153654000000, mode: HRTIMER_MODE_ABS_PINNED_HARD)
root@x1:~#
Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Reviewed-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Signed-off-by: Howard Chu <howardchu95@gmail.com>
Tested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/lkml/20240615032743.112750-1-howardchu95@gmail.com
Link: https://lore.kernel.org/r/20240624181345.124764-4-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-trace.c | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 1391564911d9..5618feb7d01a 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -1979,12 +1979,12 @@ static int trace__read_syscall_info(struct trace *trace, int id)
return err;
}
-static int evsel__init_tp_arg_scnprintf(struct evsel *evsel)
+static int evsel__init_tp_arg_scnprintf(struct evsel *evsel, bool *use_btf)
{
struct syscall_arg_fmt *fmt = evsel__syscall_arg_fmt(evsel);
if (fmt != NULL) {
- syscall_arg_fmt__init_array(fmt, evsel->tp_format->format.fields, NULL);
+ syscall_arg_fmt__init_array(fmt, evsel->tp_format->format.fields, use_btf);
return 0;
}
@@ -2188,7 +2188,8 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
* property isn't set.
*/
if (val == 0 && !trace->show_zeros &&
- !(sc->arg_fmt && sc->arg_fmt[arg.idx].show_zero))
+ !(sc->arg_fmt && sc->arg_fmt[arg.idx].show_zero) &&
+ !(sc->arg_fmt && sc->arg_fmt[arg.idx].is_enum))
continue;
printed += scnprintf(bf + printed, size - printed, "%s", printed ? ", " : "");
@@ -2893,7 +2894,7 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
val = syscall_arg_fmt__mask_val(arg, &syscall_arg, val);
/* Suppress this argument if its value is zero and show_zero property isn't set. */
- if (val == 0 && !trace->show_zeros && !arg->show_zero)
+ if (val == 0 && !trace->show_zeros && !arg->show_zero && !arg->is_enum)
continue;
printed += scnprintf(bf + printed, size - printed, "%s", printed ? ", " : "");
@@ -2901,6 +2902,15 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
if (trace->show_arg_names)
printed += scnprintf(bf + printed, size - printed, "%s: ", field->name);
+ if (arg->is_enum) {
+ size_t p = trace__btf_enum_scnprintf(trace, arg, bf + printed,
+ size - printed, val, field->type);
+ if (p) {
+ printed += p;
+ continue;
+ }
+ }
+
printed += syscall_arg_fmt__scnprintf_val(arg, bf + printed, size - printed, &syscall_arg, val);
}
@@ -4553,7 +4563,7 @@ static void evsel__set_syscall_arg_fmt(struct evsel *evsel, const char *name)
}
}
-static int evlist__set_syscall_tp_fields(struct evlist *evlist)
+static int evlist__set_syscall_tp_fields(struct evlist *evlist, bool *use_btf)
{
struct evsel *evsel;
@@ -4562,7 +4572,7 @@ static int evlist__set_syscall_tp_fields(struct evlist *evlist)
continue;
if (strcmp(evsel->tp_format->system, "syscalls")) {
- evsel__init_tp_arg_scnprintf(evsel);
+ evsel__init_tp_arg_scnprintf(evsel, use_btf);
continue;
}
@@ -5040,11 +5050,16 @@ int cmd_trace(int argc, const char **argv)
}
if (trace.evlist->core.nr_entries > 0) {
+ bool use_btf = false;
+
evlist__set_default_evsel_handler(trace.evlist, trace__event_handler);
- if (evlist__set_syscall_tp_fields(trace.evlist)) {
+ if (evlist__set_syscall_tp_fields(trace.evlist, &use_btf)) {
perror("failed to set syscalls:* tracepoint fields");
goto out;
}
+
+ if (use_btf)
+ trace__load_vmlinux_btf(&trace);
}
if (trace.sort_events) {
--
2.45.2
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v5 4/8] perf trace: Filter enum arguments with enum names
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
` (2 preceding siblings ...)
2024-07-05 13:20 ` [PATCH v5 3/8] perf trace: Augment non-syscall tracepoints with enum arguments with BTF Howard Chu
@ 2024-07-05 13:20 ` Howard Chu
2024-07-05 13:20 ` [PATCH v5 5/8] perf test: Add landlock workload Howard Chu
` (5 subsequent siblings)
9 siblings, 0 replies; 38+ messages in thread
From: Howard Chu @ 2024-07-05 13:20 UTC (permalink / raw)
To: acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo,
Alexander Shishkin, Ingo Molnar, Mark Rutland, Peter Zijlstra
Before:
perf $ ./perf trace -e timer:hrtimer_start --filter='mode!=HRTIMER_MODE_ABS_PINNED_HARD' --max-events=1
No resolver (strtoul) for "mode" in "timer:hrtimer_start", can't set filter "(mode!=HRTIMER_MODE_ABS_PINNED_HARD) && (common_pid != 281988)"
After:
perf $ ./perf trace -e timer:hrtimer_start --filter='mode!=HRTIMER_MODE_ABS_PINNED_HARD' --max-events=1
0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: 0xffffffffa77a5be0, expires: 12351248764875, softexpires: 12351248764875, mode: HRTIMER_MODE_ABS)
&& and ||:
perf $ ./perf trace -e timer:hrtimer_start --filter='mode != HRTIMER_MODE_ABS_PINNED_HARD && mode != HRTIMER_MODE_ABS' --max-events=1
0.000 Hyprland/534 timer:hrtimer_start(hrtimer: 0xffff9497801a84d0, function: 0xffffffffc04cdbe0, expires: 12639434638458, softexpires: 12639433638458, mode: HRTIMER_MODE_REL)
perf $ ./perf trace -e timer:hrtimer_start --filter='mode == HRTIMER_MODE_REL || mode == HRTIMER_MODE_PINNED' --max-events=1
0.000 ldlck-test/60639 timer:hrtimer_start(hrtimer: 0xffffb16404ee7bf8, function: 0xffffffffa7790420, expires: 12772614418016, softexpires: 12772614368016, mode: HRTIMER_MODE_REL)
Switching it up, using both enum name and integer value(--filter='mode == HRTIMER_MODE_ABS_PINNED_HARD || mode == 0'):
perf $ ./perf trace -e timer:hrtimer_start --filter='mode == HRTIMER_MODE_ABS_PINNED_HARD || mode == 0' --max-events=3
0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: 0xffffffffa77a5be0, expires: 12601748739825, softexpires: 12601748739825, mode: HRTIMER_MODE_ABS_PINNED_HARD)
0.036 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: 0xffffffffa77a5be0, expires: 12518758748124, softexpires: 12518758748124, mode: HRTIMER_MODE_ABS_PINNED_HARD)
0.172 tmux: server/41881 timer:hrtimer_start(hrtimer: 0xffffb164081e7838, function: 0xffffffffa7790420, expires: 12518768255836, softexpires: 12518768205836, mode: HRTIMER_MODE_ABS)
P.S.
perf $ pahole hrtimer_mode
enum hrtimer_mode {
HRTIMER_MODE_ABS = 0,
HRTIMER_MODE_REL = 1,
HRTIMER_MODE_PINNED = 2,
HRTIMER_MODE_SOFT = 4,
HRTIMER_MODE_HARD = 8,
HRTIMER_MODE_ABS_PINNED = 2,
HRTIMER_MODE_REL_PINNED = 3,
HRTIMER_MODE_ABS_SOFT = 4,
HRTIMER_MODE_REL_SOFT = 5,
HRTIMER_MODE_ABS_PINNED_SOFT = 6,
HRTIMER_MODE_REL_PINNED_SOFT = 7,
HRTIMER_MODE_ABS_HARD = 8,
HRTIMER_MODE_REL_HARD = 9,
HRTIMER_MODE_ABS_PINNED_HARD = 10,
HRTIMER_MODE_REL_PINNED_HARD = 11,
};
Committer testing:
root@x1:~# perf trace -e timer:hrtimer_start --filter='mode != HRTIMER_MODE_ABS' --max-events=2
0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff2a5050, function: 0xffffffff9e22ddd0, expires: 241502326000000, softexpires: 241502326000000, mode: HRTIMER_MODE_ABS_PINNED_HARD)
18446744073709.488 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff425050, function: 0xffffffff9e22ddd0, expires: 241501814000000, softexpires: 241501814000000, mode: HRTIMER_MODE_ABS_PINNED_HARD)
root@x1:~# perf trace -e timer:hrtimer_start --filter='mode != HRTIMER_MODE_ABS && mode != HRTIMER_MODE_ABS_PINNED_HARD' --max-events=2
0.000 podman/510644 timer:hrtimer_start(hrtimer: 0xffffa2024f5f7dd0, function: 0xffffffff9e2170c0, expires: 241530497418194, softexpires: 241530497368194, mode: HRTIMER_MODE_REL)
40.251 gnome-shell/2484 timer:hrtimer_start(hrtimer: 0xffff8d48bda17650, function: 0xffffffffc0661550, expires: 241550528619247, softexpires: 241550527619247, mode: HRTIMER_MODE_REL)
root@x1:~# perf trace -v -e timer:hrtimer_start --filter='mode != HRTIMER_MODE_ABS && mode != HRTIMER_MODE_ABS_PINNED_HARD && mode != HRTIMER_MODE_REL' --max-events=2
Using CPUID GenuineIntel-6-BA-3
vmlinux BTF loaded
<SNIP>
0
0xa
0x1
New filter for timer:hrtimer_start: (mode != 0 && mode != 0xa && mode != 0x1) && (common_pid != 524049 && common_pid != 4041)
mmap size 528384B
^Croot@x1:~#
Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Signed-off-by: Howard Chu <howardchu95@gmail.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/lkml/ZnCcliuecJABD5FN@x1
Link: https://lore.kernel.org/r/20240624181345.124764-5-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-trace.c | 62 ++++++++++++++++++++++++++++++++++----
1 file changed, 56 insertions(+), 6 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 5618feb7d01a..e664001d5ed7 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -932,6 +932,37 @@ static int syscall_arg_fmt__cache_btf_enum(struct syscall_arg_fmt *arg_fmt, stru
return arg_fmt->type == NULL ? -1 : 0;
}
+static bool syscall_arg__strtoul_btf_enum(char *bf, size_t size, struct syscall_arg *arg, u64 *val)
+{
+ const struct btf_type *bt;
+ char *type = arg->parm;
+ struct btf_enum *be;
+ struct btf *btf;
+
+ trace__load_vmlinux_btf(arg->trace);
+
+ btf = arg->trace->btf;
+ if (btf == NULL)
+ return false;
+
+ if (syscall_arg_fmt__cache_btf_enum(arg->fmt, btf, type) < 0)
+ return false;
+
+ bt = arg->fmt->type;
+ be = btf_enum(bt);
+ for (int i = 0; i < btf_vlen(bt); ++i, ++be) {
+ const char *name = btf__name_by_offset(btf, be->name_off);
+ int max_len = max(size, strlen(name));
+
+ if (strncmp(name, bf, max_len) == 0) {
+ *val = be->val;
+ return true;
+ }
+ }
+
+ return false;
+}
+
static size_t btf_enum_scnprintf(const struct btf_type *type, struct btf *btf, char *bf, size_t size, int val)
{
struct btf_enum *be = btf_enum(type);
@@ -965,8 +996,16 @@ static size_t trace__btf_enum_scnprintf(struct trace *trace __maybe_unused, stru
{
return 0;
}
+
+static bool syscall_arg__strtoul_btf_enum(char *bf __maybe_unused, size_t size __maybe_unused,
+ struct syscall_arg *arg __maybe_unused, u64 *val __maybe_unused)
+{
+ return false;
+}
#endif // HAVE_LIBBPF_SUPPORT
+#define STUL_BTF_ENUM syscall_arg__strtoul_btf_enum
+
#define STRARRAY(name, array) \
{ .scnprintf = SCA_STRARRAY, \
.strtoul = STUL_STRARRAY, \
@@ -1867,6 +1906,7 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
arg->scnprintf = SCA_FD;
} else if (strstr(field->type, "enum") && use_btf != NULL) {
*use_btf = arg->is_enum = true;
+ arg->strtoul = STUL_BTF_ENUM;
} else {
const struct syscall_arg_fmt *fmt =
syscall_arg_fmt__find_by_name(field->name);
@@ -3792,7 +3832,8 @@ static int ordered_events__deliver_event(struct ordered_events *oe,
return __trace__deliver_event(trace, event->event);
}
-static struct syscall_arg_fmt *evsel__find_syscall_arg_fmt_by_name(struct evsel *evsel, char *arg)
+static struct syscall_arg_fmt *evsel__find_syscall_arg_fmt_by_name(struct evsel *evsel, char *arg,
+ char **type)
{
struct tep_format_field *field;
struct syscall_arg_fmt *fmt = __evsel__syscall_arg_fmt(evsel);
@@ -3801,13 +3842,15 @@ static struct syscall_arg_fmt *evsel__find_syscall_arg_fmt_by_name(struct evsel
return NULL;
for (field = evsel->tp_format->format.fields; field; field = field->next, ++fmt)
- if (strcmp(field->name, arg) == 0)
+ if (strcmp(field->name, arg) == 0) {
+ *type = field->type;
return fmt;
+ }
return NULL;
}
-static int trace__expand_filter(struct trace *trace __maybe_unused, struct evsel *evsel)
+static int trace__expand_filter(struct trace *trace, struct evsel *evsel)
{
char *tok, *left = evsel->filter, *new_filter = evsel->filter;
@@ -3840,14 +3883,14 @@ static int trace__expand_filter(struct trace *trace __maybe_unused, struct evsel
struct syscall_arg_fmt *fmt;
int left_size = tok - left,
right_size = right_end - right;
- char arg[128];
+ char arg[128], *type;
while (isspace(left[left_size - 1]))
--left_size;
scnprintf(arg, sizeof(arg), "%.*s", left_size, left);
- fmt = evsel__find_syscall_arg_fmt_by_name(evsel, arg);
+ fmt = evsel__find_syscall_arg_fmt_by_name(evsel, arg, &type);
if (fmt == NULL) {
pr_err("\"%s\" not found in \"%s\", can't set filter \"%s\"\n",
arg, evsel->name, evsel->filter);
@@ -3860,9 +3903,16 @@ static int trace__expand_filter(struct trace *trace __maybe_unused, struct evsel
if (fmt->strtoul) {
u64 val;
struct syscall_arg syscall_arg = {
- .parm = fmt->parm,
+ .trace = trace,
+ .fmt = fmt,
};
+ if (fmt->is_enum) {
+ syscall_arg.parm = type;
+ } else {
+ syscall_arg.parm = fmt->parm;
+ }
+
if (fmt->strtoul(right, right_size, &syscall_arg, &val)) {
char *n, expansion[19];
int expansion_lenght = scnprintf(expansion, sizeof(expansion), "%#" PRIx64, val);
--
2.45.2
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v5 5/8] perf test: Add landlock workload
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
` (3 preceding siblings ...)
2024-07-05 13:20 ` [PATCH v5 4/8] perf trace: Filter enum arguments with enum names Howard Chu
@ 2024-07-05 13:20 ` Howard Chu
2024-07-05 13:20 ` [PATCH v5 6/8] perf test trace_btf_enum: Add regression test for the BTF augmentation of enums in 'perf trace' Howard Chu
` (4 subsequent siblings)
9 siblings, 0 replies; 38+ messages in thread
From: Howard Chu @ 2024-07-05 13:20 UTC (permalink / raw)
To: acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
We'll use it to add a regression test for the BTF augmentation of enum
arguments for tracepoints in 'perf trace':
root@x1:~# perf trace -e landlock_add_rule perf test -w landlock
0.000 ( 0.009 ms): perf/747160 landlock_add_rule(ruleset_fd: 11, rule_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd8e258594, flags: 45) = -1 EINVAL (Invalid argument)
0.011 ( 0.002 ms): perf/747160 landlock_add_rule(ruleset_fd: 11, rule_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd8e2585a0, flags: 45) = -1 EINVAL (Invalid argument)
root@x1:~#
Committer notes:
It was agreed on the discussion (see Link below) to shorten then name of
the workload from 'landlock_add_rule' to 'landlock', and I moved it to a
separate patch.
Also, to address a build failure from Namhyung, I stopped loading
linux/landlock.h and instead added the used defines, enums and types to
make this build in older systems. All we want is to emit the syscall and
intercept it.
We also need to add a "CFLAGS_landlock.o = -Wno-attributes" line
to cope with those landlock struct packed structs when building on
32-bit architectures.
Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Signed-off-by: Howard Chu <howardchu95@gmail.com>
Tested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/lkml/CAH0uvohaypdTV6Z7O5QSK+va_qnhZ6BP6oSJ89s1c1E0CjgxDA@mail.gmail.com
Link: https://lore.kernel.org/r/20240624181345.124764-1-howardchu95@gmail.com
Link: https://lore.kernel.org/r/20240624181345.124764-6-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/tests/builtin-test.c | 1 +
tools/perf/tests/tests.h | 1 +
tools/perf/tests/workloads/Build | 2 +
tools/perf/tests/workloads/landlock.c | 66 +++++++++++++++++++++++++++
4 files changed, 70 insertions(+)
create mode 100644 tools/perf/tests/workloads/landlock.c
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index c3d84b67ca8e..470a9709427d 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -152,6 +152,7 @@ static struct test_workload *workloads[] = {
&workload__sqrtloop,
&workload__brstack,
&workload__datasym,
+ &workload__landlock,
};
static int num_subtests(const struct test_suite *t)
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index 3aa7701ee0e9..6ea2be86b7bf 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -205,6 +205,7 @@ DECLARE_WORKLOAD(leafloop);
DECLARE_WORKLOAD(sqrtloop);
DECLARE_WORKLOAD(brstack);
DECLARE_WORKLOAD(datasym);
+DECLARE_WORKLOAD(landlock);
extern const char *dso_to_test;
extern const char *test_objdump_path;
diff --git a/tools/perf/tests/workloads/Build b/tools/perf/tests/workloads/Build
index 48bf0d3b0f3d..3fe97e68d105 100644
--- a/tools/perf/tests/workloads/Build
+++ b/tools/perf/tests/workloads/Build
@@ -6,8 +6,10 @@ perf-test-y += leafloop.o
perf-test-y += sqrtloop.o
perf-test-y += brstack.o
perf-test-y += datasym.o
+perf-test-y += landlock.o
CFLAGS_sqrtloop.o = -g -O0 -fno-inline -U_FORTIFY_SOURCE
CFLAGS_leafloop.o = -g -O0 -fno-inline -fno-omit-frame-pointer -U_FORTIFY_SOURCE
CFLAGS_brstack.o = -g -O0 -fno-inline -U_FORTIFY_SOURCE
CFLAGS_datasym.o = -g -O0 -fno-inline -U_FORTIFY_SOURCE
+CFLAGS_landlock.o = -Wno-attributes
diff --git a/tools/perf/tests/workloads/landlock.c b/tools/perf/tests/workloads/landlock.c
new file mode 100644
index 000000000000..0c2bcdaf2263
--- /dev/null
+++ b/tools/perf/tests/workloads/landlock.c
@@ -0,0 +1,66 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#include <linux/compiler.h>
+#include <linux/types.h>
+#include <unistd.h>
+#include "../tests.h"
+
+/* This workload was initially added to test enum augmentation with BTF in perf
+ * trace because its the only syscall that has an enum argument. Since it is
+ * a recent addition to the Linux kernel (at the time of the introduction of this
+ * 'perf test' workload) we just add the required types and defines here instead
+ * of including linux/landlock, that isn't available in older systems.
+ *
+ * We are not interested in the the result of the syscall, just in intercepting
+ * its arguments.
+ */
+
+#ifndef __NR_landlock_add_rule
+#define __NR_landlock_add_rule 445
+#endif
+
+#ifndef LANDLOCK_ACCESS_FS_READ_FILE
+#define LANDLOCK_ACCESS_FS_READ_FILE (1ULL << 2)
+
+#define LANDLOCK_RULE_PATH_BENEATH 1
+
+struct landlock_path_beneath_attr {
+ __u64 allowed_access;
+ __s32 parent_fd;
+} __attribute__((packed));
+#endif
+
+#ifndef LANDLOCK_ACCESS_NET_CONNECT_TCP
+#define LANDLOCK_ACCESS_NET_CONNECT_TCP (1ULL << 1)
+
+#define LANDLOCK_RULE_NET_PORT 2
+
+struct landlock_net_port_attr {
+ __u64 allowed_access;
+ __u64 port;
+};
+#endif
+
+static int landlock(int argc __maybe_unused, const char **argv __maybe_unused)
+{
+ int fd = 11, flags = 45;
+
+ struct landlock_path_beneath_attr path_beneath_attr = {
+ .allowed_access = LANDLOCK_ACCESS_FS_READ_FILE,
+ .parent_fd = 14,
+ };
+
+ struct landlock_net_port_attr net_port_attr = {
+ .port = 19,
+ .allowed_access = LANDLOCK_ACCESS_NET_CONNECT_TCP,
+ };
+
+ syscall(__NR_landlock_add_rule, fd, LANDLOCK_RULE_PATH_BENEATH,
+ &path_beneath_attr, flags);
+
+ syscall(__NR_landlock_add_rule, fd, LANDLOCK_RULE_NET_PORT,
+ &net_port_attr, flags);
+
+ return 0;
+}
+
+DEFINE_WORKLOAD(landlock);
--
2.45.2
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v5 6/8] perf test trace_btf_enum: Add regression test for the BTF augmentation of enums in 'perf trace'
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
` (4 preceding siblings ...)
2024-07-05 13:20 ` [PATCH v5 5/8] perf test: Add landlock workload Howard Chu
@ 2024-07-05 13:20 ` Howard Chu
2024-07-05 13:20 ` [PATCH v5 7/8] perf trace: Introduce trace__btf_scnprintf() Howard Chu
` (3 subsequent siblings)
9 siblings, 0 replies; 38+ messages in thread
From: Howard Chu @ 2024-07-05 13:20 UTC (permalink / raw)
To: acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
Trace landlock_add_rule syscall to see if the output is desirable.
Trace the non-syscall tracepoint 'timer:hrtimer_init' and
'timer:hrtimer_start', see if the 'mode' argument is augmented,
the 'mode' enum argument has the prefix of 'HRTIMER_MODE_'
in its name.
Committer testing:
root@x1:~# perf test enum
124: perf trace enum augmentation tests : Ok
root@x1:~# perf test -v enum
124: perf trace enum augmentation tests : Ok
root@x1:~# perf trace -e landlock_add_rule perf test -v enum
0.000 ( 0.010 ms): perf/749827 landlock_add_rule(ruleset_fd: 11, rule_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd324171d4, flags: 45) = -1 EINVAL (Invalid argument)
0.012 ( 0.002 ms): perf/749827 landlock_add_rule(ruleset_fd: 11, rule_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd324171e0, flags: 45) = -1 EINVAL (Invalid argument)
457.821 ( 0.007 ms): perf/749830 landlock_add_rule(ruleset_fd: 11, rule_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd4acd31e4, flags: 45) = -1 EINVAL (Invalid argument)
457.832 ( 0.003 ms): perf/749830 landlock_add_rule(ruleset_fd: 11, rule_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd4acd31f0, flags: 45) = -1 EINVAL (Invalid argument)
124: perf trace enum augmentation tests : Ok
root@x1:~#
Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Signed-off-by: Howard Chu <howardchu95@gmail.com>
Tested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/lkml/20240619082042.4173621-6-howardchu95@gmail.com
Link: https://lore.kernel.org/r/20240624181345.124764-7-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/tests/shell/trace_btf_enum.sh | 61 ++++++++++++++++++++++++
1 file changed, 61 insertions(+)
create mode 100755 tools/perf/tests/shell/trace_btf_enum.sh
diff --git a/tools/perf/tests/shell/trace_btf_enum.sh b/tools/perf/tests/shell/trace_btf_enum.sh
new file mode 100755
index 000000000000..7d407b52bea5
--- /dev/null
+++ b/tools/perf/tests/shell/trace_btf_enum.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+# perf trace enum augmentation tests
+# SPDX-License-Identifier: GPL-2.0
+
+err=0
+set -e
+
+syscall="landlock_add_rule"
+non_syscall="timer:hrtimer_init,timer:hrtimer_start"
+
+TESTPROG="perf test -w landlock"
+
+. "$(dirname $0)"/lib/probe.sh
+skip_if_no_perf_trace || exit 2
+
+check_vmlinux() {
+ echo "Checking if vmlinux exists"
+ if ! ls /sys/kernel/btf/vmlinux 1>/dev/null 2>&1
+ then
+ echo "trace+enum test [Skipped missing vmlinux BTF support]"
+ err=2
+ fi
+}
+
+trace_landlock() {
+ echo "Tracing syscall ${syscall}"
+
+ # test flight just to see if landlock_add_rule and libbpf are available
+ $TESTPROG
+
+ if perf trace -e $syscall $TESTPROG 2>&1 | \
+ grep -q -E ".*landlock_add_rule\(ruleset_fd: 11, rule_type: (LANDLOCK_RULE_PATH_BENEATH|LANDLOCK_RULE_NET_PORT), rule_attr: 0x[a-f0-9]+, flags: 45\) = -1.*"
+ then
+ err=0
+ else
+ err=1
+ fi
+}
+
+trace_non_syscall() {
+ echo "Tracing non-syscall tracepoint ${non-syscall}"
+ if perf trace -e $non_syscall --max-events=1 2>&1 | \
+ grep -q -E '.*timer:hrtimer_.*\(.*mode: HRTIMER_MODE_.*\)$'
+ then
+ err=0
+ else
+ err=1
+ fi
+}
+
+check_vmlinux
+
+if [ $err = 0 ]; then
+ trace_landlock
+fi
+
+if [ $err = 0 ]; then
+ trace_non_syscall
+fi
+
+exit $err
--
2.45.2
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v5 7/8] perf trace: Introduce trace__btf_scnprintf()
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
` (5 preceding siblings ...)
2024-07-05 13:20 ` [PATCH v5 6/8] perf test trace_btf_enum: Add regression test for the BTF augmentation of enums in 'perf trace' Howard Chu
@ 2024-07-05 13:20 ` Howard Chu
2024-07-05 13:20 ` [PATCH v5 8/8] perf trace: Remove arg_fmt->is_enum, we can get that from the BTF type Howard Chu
` (2 subsequent siblings)
9 siblings, 0 replies; 38+ messages in thread
From: Howard Chu @ 2024-07-05 13:20 UTC (permalink / raw)
To: acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
From: Arnaldo Carvalho de Melo <acme@redhat.com>
To have a central place that will look at the BTF type and call the
right scnprintf routine or return zero, meaning BTF pretty printing
isn't available or not implemented for a specific type.
Signed-off-by: Howard Chu <howardchu95@gmail.com>
Tested-by: Howard Chu <howardchu95@gmail.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240624181345.124764-8-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-trace.c | 49 +++++++++++++++++++++-----------------
1 file changed, 27 insertions(+), 22 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index e664001d5ed7..d9104fc4f61f 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -981,18 +981,28 @@ static size_t btf_enum_scnprintf(const struct btf_type *type, struct btf *btf, c
static size_t trace__btf_enum_scnprintf(struct trace *trace, struct syscall_arg_fmt *arg_fmt, char *bf,
size_t size, int val, char *type)
{
- if (trace->btf == NULL)
- return 0;
-
if (syscall_arg_fmt__cache_btf_enum(arg_fmt, trace->btf, type) < 0)
return 0;
return btf_enum_scnprintf(arg_fmt->type, trace->btf, bf, size, val);
}
+
+static size_t trace__btf_scnprintf(struct trace *trace, struct syscall_arg_fmt *arg_fmt, char *bf,
+ size_t size, int val, char *type)
+{
+ if (trace->btf == NULL)
+ return 0;
+
+ if (arg_fmt->is_enum)
+ return trace__btf_enum_scnprintf(trace, arg_fmt, bf, size, val, type);
+
+ return 0;
+}
+
#else // HAVE_LIBBPF_SUPPORT
-static size_t trace__btf_enum_scnprintf(struct trace *trace __maybe_unused, struct syscall_arg_fmt *arg_fmt __maybe_unused,
- char *bf __maybe_unused, size_t size __maybe_unused, int val __maybe_unused,
- char *type __maybe_unused)
+static size_t trace__btf_scnprintf(struct trace *trace __maybe_unused, struct syscall_arg_fmt *arg_fmt __maybe_unused,
+ char *bf __maybe_unused, size_t size __maybe_unused, int val __maybe_unused,
+ char *type __maybe_unused)
{
return 0;
}
@@ -2183,7 +2193,7 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
unsigned char *args, void *augmented_args, int augmented_args_size,
struct trace *trace, struct thread *thread)
{
- size_t printed = 0;
+ size_t printed = 0, btf_printed;
unsigned long val;
u8 bit = 1;
struct syscall_arg arg = {
@@ -2237,13 +2247,11 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
if (trace->show_arg_names)
printed += scnprintf(bf + printed, size - printed, "%s: ", field->name);
- if (sc->arg_fmt[arg.idx].is_enum) {
- size_t p = trace__btf_enum_scnprintf(trace, &sc->arg_fmt[arg.idx], bf + printed,
- size - printed, val, field->type);
- if (p) {
- printed += p;
- continue;
- }
+ btf_printed = trace__btf_scnprintf(trace, &sc->arg_fmt[arg.idx], bf + printed,
+ size - printed, val, field->type);
+ if (btf_printed) {
+ printed += btf_printed;
+ continue;
}
printed += syscall_arg_fmt__scnprintf_val(&sc->arg_fmt[arg.idx],
@@ -2892,7 +2900,7 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
size_t size = sizeof(bf);
struct tep_format_field *field = evsel->tp_format->format.fields;
struct syscall_arg_fmt *arg = __evsel__syscall_arg_fmt(evsel);
- size_t printed = 0;
+ size_t printed = 0, btf_printed;
unsigned long val;
u8 bit = 1;
struct syscall_arg syscall_arg = {
@@ -2942,13 +2950,10 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
if (trace->show_arg_names)
printed += scnprintf(bf + printed, size - printed, "%s: ", field->name);
- if (arg->is_enum) {
- size_t p = trace__btf_enum_scnprintf(trace, arg, bf + printed,
- size - printed, val, field->type);
- if (p) {
- printed += p;
- continue;
- }
+ btf_printed = trace__btf_scnprintf(trace, arg, bf + printed, size - printed, val, field->type);
+ if (btf_printed) {
+ printed += btf_printed;
+ continue;
}
printed += syscall_arg_fmt__scnprintf_val(arg, bf + printed, size - printed, &syscall_arg, val);
--
2.45.2
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v5 8/8] perf trace: Remove arg_fmt->is_enum, we can get that from the BTF type
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
` (6 preceding siblings ...)
2024-07-05 13:20 ` [PATCH v5 7/8] perf trace: Introduce trace__btf_scnprintf() Howard Chu
@ 2024-07-05 13:20 ` Howard Chu
2024-07-10 18:02 ` [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Ian Rogers
2024-07-13 15:06 ` Namhyung Kim
9 siblings, 0 replies; 38+ messages in thread
From: Howard Chu @ 2024-07-05 13:20 UTC (permalink / raw)
To: acme
Cc: adrian.hunter, irogers, jolsa, kan.liang, namhyung,
linux-perf-users, linux-kernel, Arnaldo Carvalho de Melo
From: Arnaldo Carvalho de Melo <acme@redhat.com>
This is to pave the way for other BTF types, i.e. we try to find BTF
type then use things like btf_is_enum(btf_type) that we cached to find
the right strtoul and scnprintf routines.
For now only enum is supported, all the other types simple return zero
for scnprintf which makes it have the same behaviour as when BTF isn't
available, i.e. fallback to no pretty printing. Ditto for strtoul.
root@x1:~# perf test -v enum
124: perf trace enum augmentation tests : Ok
root@x1:~# perf test -v enum
124: perf trace enum augmentation tests : Ok
root@x1:~# perf test -v enum
124: perf trace enum augmentation tests : Ok
root@x1:~# perf test -v enum
124: perf trace enum augmentation tests : Ok
root@x1:~# perf test -v enum
124: perf trace enum augmentation tests : Ok
root@x1:~#
Signed-off-by: Howard Chu <howardchu95@gmail.com>
Tested-by: Howard Chu <howardchu95@gmail.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240624181345.124764-9-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-trace.c | 101 +++++++++++++++++--------------
tools/perf/trace/beauty/beauty.h | 1 +
2 files changed, 56 insertions(+), 46 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index d9104fc4f61f..488c2cedc110 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -111,7 +111,6 @@ struct syscall_arg_fmt {
const char *name;
u16 nr_entries; // for arrays
bool show_zero;
- bool is_enum;
#ifdef HAVE_LIBBPF_SUPPORT
const struct btf_type *type;
#endif
@@ -910,33 +909,46 @@ static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size,
#define SCA_GETRANDOM_FLAGS syscall_arg__scnprintf_getrandom_flags
#ifdef HAVE_LIBBPF_SUPPORT
-static int syscall_arg_fmt__cache_btf_enum(struct syscall_arg_fmt *arg_fmt, struct btf *btf, char *type)
+static void syscall_arg_fmt__cache_btf_enum(struct syscall_arg_fmt *arg_fmt, struct btf *btf, char *type)
{
int id;
- // Already cached?
- if (arg_fmt->type != NULL)
- return 0;
-
type = strstr(type, "enum ");
if (type == NULL)
- return -1;
+ return;
type += 5; // skip "enum " to get the enumeration name
id = btf__find_by_name(btf, type);
if (id < 0)
- return -1;
+ return;
arg_fmt->type = btf__type_by_id(btf, id);
- return arg_fmt->type == NULL ? -1 : 0;
}
static bool syscall_arg__strtoul_btf_enum(char *bf, size_t size, struct syscall_arg *arg, u64 *val)
+{
+ const struct btf_type *bt = arg->fmt->type;
+ struct btf *btf = arg->trace->btf;
+ struct btf_enum *be = btf_enum(bt);
+
+ for (int i = 0; i < btf_vlen(bt); ++i, ++be) {
+ const char *name = btf__name_by_offset(btf, be->name_off);
+ int max_len = max(size, strlen(name));
+
+ if (strncmp(name, bf, max_len) == 0) {
+ *val = be->val;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static bool syscall_arg__strtoul_btf_type(char *bf, size_t size, struct syscall_arg *arg, u64 *val)
{
const struct btf_type *bt;
- char *type = arg->parm;
- struct btf_enum *be;
+ char *type = arg->type_name;
struct btf *btf;
trace__load_vmlinux_btf(arg->trace);
@@ -945,20 +957,19 @@ static bool syscall_arg__strtoul_btf_enum(char *bf, size_t size, struct syscall_
if (btf == NULL)
return false;
- if (syscall_arg_fmt__cache_btf_enum(arg->fmt, btf, type) < 0)
- return false;
+ if (arg->fmt->type == NULL) {
+ // See if this is an enum
+ syscall_arg_fmt__cache_btf_enum(arg->fmt, btf, type);
+ }
+ // Now let's see if we have a BTF type resolved
bt = arg->fmt->type;
- be = btf_enum(bt);
- for (int i = 0; i < btf_vlen(bt); ++i, ++be) {
- const char *name = btf__name_by_offset(btf, be->name_off);
- int max_len = max(size, strlen(name));
+ if (bt == NULL)
+ return false;
- if (strncmp(name, bf, max_len) == 0) {
- *val = be->val;
- return true;
- }
- }
+ // If it is an enum:
+ if (btf_is_enum(arg->fmt->type))
+ return syscall_arg__strtoul_btf_enum(bf, size, arg, val);
return false;
}
@@ -978,23 +989,23 @@ static size_t btf_enum_scnprintf(const struct btf_type *type, struct btf *btf, c
return 0;
}
-static size_t trace__btf_enum_scnprintf(struct trace *trace, struct syscall_arg_fmt *arg_fmt, char *bf,
- size_t size, int val, char *type)
-{
- if (syscall_arg_fmt__cache_btf_enum(arg_fmt, trace->btf, type) < 0)
- return 0;
-
- return btf_enum_scnprintf(arg_fmt->type, trace->btf, bf, size, val);
-}
-
static size_t trace__btf_scnprintf(struct trace *trace, struct syscall_arg_fmt *arg_fmt, char *bf,
size_t size, int val, char *type)
{
if (trace->btf == NULL)
return 0;
- if (arg_fmt->is_enum)
- return trace__btf_enum_scnprintf(trace, arg_fmt, bf, size, val, type);
+ if (arg_fmt->type == NULL) {
+ // Check if this is an enum and if we have the BTF type for it.
+ syscall_arg_fmt__cache_btf_enum(arg_fmt, trace->btf, type);
+ }
+
+ // Did we manage to find a BTF type for the syscall/tracepoint argument?
+ if (arg_fmt->type == NULL)
+ return 0;
+
+ if (btf_is_enum(arg_fmt->type))
+ return btf_enum_scnprintf(arg_fmt->type, trace->btf, bf, size, val);
return 0;
}
@@ -1007,14 +1018,14 @@ static size_t trace__btf_scnprintf(struct trace *trace __maybe_unused, struct sy
return 0;
}
-static bool syscall_arg__strtoul_btf_enum(char *bf __maybe_unused, size_t size __maybe_unused,
+static bool syscall_arg__strtoul_btf_type(char *bf __maybe_unused, size_t size __maybe_unused,
struct syscall_arg *arg __maybe_unused, u64 *val __maybe_unused)
{
return false;
}
#endif // HAVE_LIBBPF_SUPPORT
-#define STUL_BTF_ENUM syscall_arg__strtoul_btf_enum
+#define STUL_BTF_TYPE syscall_arg__strtoul_btf_type
#define STRARRAY(name, array) \
{ .scnprintf = SCA_STRARRAY, \
@@ -1887,7 +1898,6 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
continue;
len = strlen(field->name);
- arg->is_enum = false;
if (strcmp(field->type, "const char *") == 0 &&
((len >= 4 && strcmp(field->name + len - 4, "name") == 0) ||
@@ -1915,8 +1925,8 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
*/
arg->scnprintf = SCA_FD;
} else if (strstr(field->type, "enum") && use_btf != NULL) {
- *use_btf = arg->is_enum = true;
- arg->strtoul = STUL_BTF_ENUM;
+ *use_btf = true;
+ arg->strtoul = STUL_BTF_TYPE;
} else {
const struct syscall_arg_fmt *fmt =
syscall_arg_fmt__find_by_name(field->name);
@@ -2236,10 +2246,13 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
/*
* Suppress this argument if its value is zero and show_zero
* property isn't set.
+ *
+ * If it has a BTF type, then override the zero suppression knob
+ * as the common case is for zero in an enum to have an associated entry.
*/
if (val == 0 && !trace->show_zeros &&
!(sc->arg_fmt && sc->arg_fmt[arg.idx].show_zero) &&
- !(sc->arg_fmt && sc->arg_fmt[arg.idx].is_enum))
+ !(sc->arg_fmt && sc->arg_fmt[arg.idx].strtoul == STUL_BTF_TYPE))
continue;
printed += scnprintf(bf + printed, size - printed, "%s", printed ? ", " : "");
@@ -2942,7 +2955,7 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
val = syscall_arg_fmt__mask_val(arg, &syscall_arg, val);
/* Suppress this argument if its value is zero and show_zero property isn't set. */
- if (val == 0 && !trace->show_zeros && !arg->show_zero && !arg->is_enum)
+ if (val == 0 && !trace->show_zeros && !arg->show_zero && arg->strtoul != STUL_BTF_TYPE)
continue;
printed += scnprintf(bf + printed, size - printed, "%s", printed ? ", " : "");
@@ -3910,14 +3923,10 @@ static int trace__expand_filter(struct trace *trace, struct evsel *evsel)
struct syscall_arg syscall_arg = {
.trace = trace,
.fmt = fmt,
+ .type_name = type,
+ .parm = fmt->parm,
};
- if (fmt->is_enum) {
- syscall_arg.parm = type;
- } else {
- syscall_arg.parm = fmt->parm;
- }
-
if (fmt->strtoul(right, right_size, &syscall_arg, &val)) {
char *n, expansion[19];
int expansion_lenght = scnprintf(expansion, sizeof(expansion), "%#" PRIx64, val);
diff --git a/tools/perf/trace/beauty/beauty.h b/tools/perf/trace/beauty/beauty.h
index 78d10d92d351..3ed11e18ee2d 100644
--- a/tools/perf/trace/beauty/beauty.h
+++ b/tools/perf/trace/beauty/beauty.h
@@ -113,6 +113,7 @@ struct syscall_arg {
struct thread *thread;
struct trace *trace;
void *parm;
+ char *type_name;
u16 len;
u8 idx;
u8 mask;
--
2.45.2
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v5 0/8] perf trace: Augment enum arguments with BTF
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
` (7 preceding siblings ...)
2024-07-05 13:20 ` [PATCH v5 8/8] perf trace: Remove arg_fmt->is_enum, we can get that from the BTF type Howard Chu
@ 2024-07-10 18:02 ` Ian Rogers
2024-07-13 15:06 ` Namhyung Kim
9 siblings, 0 replies; 38+ messages in thread
From: Ian Rogers @ 2024-07-10 18:02 UTC (permalink / raw)
To: Howard Chu
Cc: acme, adrian.hunter, jolsa, kan.liang, namhyung, linux-perf-users,
linux-kernel
On Fri, Jul 5, 2024 at 6:20 AM Howard Chu <howardchu95@gmail.com> wrote:
>
> Changes in v5:
>
> - Use hardcoded landlock structs and macros for landlock.c workload to
> make this build in older systems.
A few nits but otherwise:
Reviewed-by: Ian Rogers <irogers@google.com>
Thanks,
Ian
> Changes in v4:
>
> - Fix landlock workload's build error.
>
> Changes in v3:
>
> - Add trace__btf_scnprintf() helper function
> - Remove is_enum memeber in struct syscall_arg_fmt, replace it with
> btf_is_enum()
> - Add syscall_arg_fmt__cache_btf_enum() to cache btf_type only
> - Resolve NO_LIBBPF=1 build error
> - Skip BTF augmentation test if landlock_add_rule syscall and LIBBPF are not
> available
> - Rename landlock.c workload, add a comment to landlock.c workload
> - Change the way of skipping 'enum ' prefix
> - Add type_name member to struct syscall_arg
>
> Changes in v2:
>
> - Add trace_btf_enum regression test, and landlock workload
>
> v1:
>
> In this patch, BTF is used to turn enum value to the corresponding
> enum variable name. There is only one system call that uses enum value
> as its argument, that is `landlock_add_rule()`.
>
> Enum arguments of non-syscall tracepoints can also be augmented, for
> instance timer:hrtimer_start and timer:hrtimer_init's 'mode' argument.
>
>
> Arnaldo Carvalho de Melo (2):
> perf trace: Introduce trace__btf_scnprintf()
> perf trace: Remove arg_fmt->is_enum, we can get that from the BTF type
>
> Howard Chu (6):
> perf trace: Fix iteration of syscall ids in syscalltbl->entries
> perf trace: BTF-based enum pretty printing for syscall args
> perf trace: Augment non-syscall tracepoints with enum arguments with
> BTF
> perf trace: Filter enum arguments with enum names
> perf test: Add landlock workload
> perf test trace_btf_enum: Add regression test for the BTF augmentation
> of enums in 'perf trace'
>
> tools/perf/builtin-trace.c | 229 ++++++++++++++++++++---
> tools/perf/tests/builtin-test.c | 1 +
> tools/perf/tests/shell/trace_btf_enum.sh | 61 ++++++
> tools/perf/tests/tests.h | 1 +
> tools/perf/tests/workloads/Build | 2 +
> tools/perf/tests/workloads/landlock.c | 66 +++++++
> tools/perf/trace/beauty/beauty.h | 1 +
> tools/perf/util/syscalltbl.c | 7 +
> tools/perf/util/syscalltbl.h | 1 +
> 9 files changed, 345 insertions(+), 24 deletions(-)
> create mode 100755 tools/perf/tests/shell/trace_btf_enum.sh
> create mode 100644 tools/perf/tests/workloads/landlock.c
>
> --
> 2.45.2
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v5 0/8] perf trace: Augment enum arguments with BTF
2024-07-05 13:20 [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Howard Chu
` (8 preceding siblings ...)
2024-07-10 18:02 ` [PATCH v5 0/8] perf trace: Augment enum arguments with BTF Ian Rogers
@ 2024-07-13 15:06 ` Namhyung Kim
9 siblings, 0 replies; 38+ messages in thread
From: Namhyung Kim @ 2024-07-13 15:06 UTC (permalink / raw)
To: acme, Howard Chu
Cc: adrian.hunter, irogers, jolsa, kan.liang, linux-perf-users,
linux-kernel
On Fri, 05 Jul 2024 21:20:50 +0800, Howard Chu wrote:
> Changes in v5:
>
> - Use hardcoded landlock structs and macros for landlock.c workload to
> make this build in older systems.
>
> Changes in v4:
>
> [...]
Applied the patch 1/8 to perf-tools-next, thanks!
Best regards,
Namhyung
^ permalink raw reply [flat|nested] 38+ messages in thread