From nobody Wed Feb 11 22:54:49 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B3561224D4; Wed, 19 Jun 2024 08:19:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785193; cv=none; b=jJoG3RngPNTMb2FiFLPdrqqqUU/LFJWaq3bodXiw/xJLj3lOto07Y+7eV1ZV7tWoVxB0q48CgimTpp/s/qMYIA8/+8QX5UBr0K86CSFQIdoU0Vpho9VvnpYuyhjLw8f/9dAgQx2Z2jJ6PkttRGftGJBV67WyUWp47bsIRTs2QkQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785193; c=relaxed/simple; bh=GPYYtacLEM3yqElaCBzMe4/DGGia7xVwg4cZbV/pbSE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tyyw/5rYJOP4vk8CDCoXjJFarNVraVh3Dy/AaUjd5v5uqPQqDmcTJer7NLqb5DHfQwMwnknU3SFQfFX0pTAA+Wec8nTErs3lXLR6zexwCyMrOMN8irdhvagdJ/pMseSSUlVWSto/uKf4/oGntbB4J1Q7SWQ/OBllbWlZAK7OdpE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=V5MWUqqP; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="V5MWUqqP" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-1f4a0050b9aso54050845ad.2; Wed, 19 Jun 2024 01:19:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718785191; x=1719389991; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=r0Vd/De1J9Bo8JQWZ7RX5Hl6z5NNgyu4XF00AImPHKw=; b=V5MWUqqPGG0FbVXv4W6suSoW2GQTd63sSOdwHxN7o2EI9oeHav3Pb7t4l/ZTzWiMyk seRtfkOH/g3LEHdNZGb7AKtMEm2Q34z3eqS9qgZNsW3BaI+fbCVCIqJkxDlGwWbAop/C jWQiIpmD5CzCq/e2qujtbhGjOy1hHwNtYQ0LsferKrjKSvUW+TqLB77JS/pebaz7CykD LoOPoYZNAzWbSlU714ekTHpYSc7CKH+EEnWTdKivfWanughnovV6MRHjB9CdyF2OsWyO HfHh43+ybS3EobfyHGmlKCKHJChYc2FK+N3mSX0htiDMSxUz2zFQz0FPSmKOkdwiy/fy uSZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718785191; x=1719389991; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=r0Vd/De1J9Bo8JQWZ7RX5Hl6z5NNgyu4XF00AImPHKw=; b=ZuYvk7xkXqFQKZqvgpaq6tBp4Ha/S5uT75HtQA3aPE9/ejHQs/d4NrMrMCZg4kMi6z 1IX3m4Lj93mwj3pLdf3jDTMbZnGRpF+/+MdRngJYXb6U5wvkRoZJpPAPHC9PHtWuMdnD +ormiGm0gF1ohMak+/4zsXMG/Mpd+fKYKzJnvqcHNQwii0B0FuTiTZ0af2BoNr205ghd 7nv6hKwxLqZBcFkYbJg9Pf558QHGREg7yYdGxKayZ1jUrslIFF+rs6x0Lj1UiKnpI6NN /cLI9uaJ09mzZeJbFVyKvVRk0HM/1f98aFfkDcnoZEMEYEFNUMfDg2PSQZqcYcCseFQQ f8jA== X-Forwarded-Encrypted: i=1; AJvYcCVdG04zHNZg3pUf7x1FMeS4FlLhbKzau/UtOuiliqoj1FgWB/xwI47buTxGBLVpY3Vx7l1PKg5XKT0sdRPQ+MtmINJEaW0oN8FdsXMTGcb5oV1398S7hENpXm3dT2oNegZRFF0NGolSyLR7PkRe1g== X-Gm-Message-State: AOJu0YxzZUUmG6TtbP7nUKPOGT71TP5P52+Rrd905VpjvAQrgCi4rXwg tOWrSQtQQkkOxgigM1e73SBT+BPeCbcw3hc0HSq20Qfy7+CrBsFP X-Google-Smtp-Source: AGHT+IGD4BQhFODiVeZLIuPO9+WTm/370XG9d9cPfig9XpNmI6SN4ROH2JkArIlY54Lf3CSeD/RJXg== X-Received: by 2002:a17:902:c401:b0:1f7:1b97:e911 with SMTP id d9443c01a7336-1f9aa3aef56mr19255605ad.2.1718785190815; Wed, 19 Jun 2024 01:19:50 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.95]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f855f1decfsm110368105ad.250.2024.06.19.01.19.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Jun 2024 01:19:50 -0700 (PDT) From: Howard Chu To: Arnaldo Carvalho de Melo Cc: Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Kan Liang , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v2 1/5] perf trace: Fix iteration of syscall ids in syscalltbl->entries Date: Wed, 19 Jun 2024 16:20:38 +0800 Message-ID: <20240619082042.4173621-2-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240619082042.4173621-1-howardchu95@gmail.com> References: <20240619082042.4173621-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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 =3D 0; key < trace->sctbl->syscalls.nr_entries; ++key) { struct syscall *sc =3D 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 =3D 0; i <=3D syscalltbl_native_max_id; ++i) if (syscalltbl_native[i]) ++nr_entries; entries =3D tbl->syscalls.entries =3D malloc(sizeof(struct syscall) * nr_en= tries); ... for (i =3D 0, j =3D 0; i <=3D syscalltbl_native_max_id; ++i) { if (syscalltbl_native[i]) { entries[j].name =3D syscalltbl_native[i]; entries[j].id =3D 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] =3D "rseq", [424] =3D "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=3D1 |& 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=3D1 |& 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=3D1 [no output] after perf $ ./perf trace -e faccessat2 --max-events=3D1 0.000 ( 0.037 ms): waybar/958 faccessat2(dfd: 40, filename: "uevent") = =3D 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': =E2=AC=A2[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 sur= e sizeof(augmented_arg->value) is a power of two. 262b54b6c9396823 perf bpf augmented_raw_syscalls: Add an assert to make sur= e sizeof(saddr) is a power of two. 1836480429d173c0 perf bpf_skel augmented_raw_syscalls: Cap the socklen para= meter using &=3D sizeof(saddr) cd2cece61ac5f900 perf trace: Tidy comments related to BPF + syscall augment= ation 5e6da6be3082f77b perf trace: Migrate BPF augmentation to use a skeleton =E2=AC=A2[acme@toolbox perf-tools-next]$ =E2=AC=A2[acme@toolbox perf-tools-next]$ git show --oneline --pretty=3Drefe= rence 5e6da6be3082f77b | head -1 5e6da6be3082f77b (perf trace: Migrate BPF augmentation to use a skeleton, 2= 023-08-10) =E2=AC=A2[acme@toolbox perf-tools-next]$ I.e. from August, 2023. One had as well to ask for BUILD_BPF_SKEL=3D1, 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); Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/lkml/ZmhlAxbVcAKoPTg8@x1 Signed-off-by: Howard Chu --- 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 c42bc608954e..c4fa8191253d 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_pro= g_entry(struct trace *trace return NULL; =20 try_to_find_pair: - for (id =3D 0; id < trace->sctbl->syscalls.nr_entries; ++id) { + for (int i =3D 0; i < trace->sctbl->syscalls.nr_entries; ++i) { + int id =3D syscalltbl__id_at_idx(trace->sctbl, i); struct syscall *pair =3D trace__syscall_info(trace, NULL, id); struct bpf_program *pair_prog; bool is_candidate =3D false; @@ -3456,10 +3455,10 @@ static int trace__init_syscalls_bpf_prog_array_maps= (struct trace *trace) { int map_enter_fd =3D bpf_map__fd(trace->skel->maps.syscalls_sys_enter); int map_exit_fd =3D bpf_map__fd(trace->skel->maps.syscalls_sys_exit); - int err =3D 0, key; + int err =3D 0; =20 - for (key =3D 0; key < trace->sctbl->syscalls.nr_entries; ++key) { - int prog_fd; + for (int i =3D 0; i < trace->sctbl->syscalls.nr_entries; ++i) { + int prog_fd, key =3D syscalltbl__id_at_idx(trace->sctbl, i); =20 if (!trace__syscall_enabled(trace, key)) continue; @@ -3505,7 +3504,8 @@ static int trace__init_syscalls_bpf_prog_array_maps(s= truct 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 =3D 0; key < trace->sctbl->syscalls.nr_entries; ++key) { + for (int i =3D 0; i < trace->sctbl->syscalls.nr_entries; ++i) { + int key =3D syscalltbl__id_at_idx(trace->sctbl, i); struct syscall *sc =3D 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; } =20 +int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx) +{ + struct syscall *syscalls =3D tbl->syscalls.entries; + + return idx < tbl->syscalls.nr_entries ? syscalls[idx].id : -1; +} + int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *sysc= all_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); =20 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); =20 int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *sys= call_glob, int *idx); int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *sysc= all_glob, int *idx); --=20 2.45.2 From nobody Wed Feb 11 22:54:49 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C1FA07C6C1; Wed, 19 Jun 2024 08:19:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785197; cv=none; b=Pe+fQx0veoJ8pV77+TKNhl6FLzhOyAtfkAetvlBSTKui36vnKsKWvzQ/IibF/K02+jURAueDHUffHhuT8RAyebnj9wSG9PLwTyHq/bgHXVWiQtxsmw6PdjYUAwoThQDunELH3+HAZHz5Mijtj/r7EMWFowtlZMvA/xh5Ggg5AY4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785197; c=relaxed/simple; bh=qdaNtK9EB4Ck/5vp1XqOAD1xTtT9Qv/aF1nnKk6JNwI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ltMuCnmEuSb87+cx1fZbcYrYdNZ2JJSP4ry34lez0SS2ZTttzuLKEnVgHm1QYOPbJ2kz2SgGAq9jv8Fwq2w0RXAYZ3FtFI6bvzS8+yJ+MmV6xVKQySAcepBMASozUr0UIFCdZH/6oGA+rVbYPwdWj5HzNRURa0a93qqJpRkIbTI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=X1UWidPT; arc=none smtp.client-ip=209.85.214.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="X1UWidPT" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-1f47f07acd3so55778225ad.0; Wed, 19 Jun 2024 01:19:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718785195; x=1719389995; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=E6Qt0EHXAUTtq4/0TMQZ2s1bx5CcrwV1JbUBnKEe+5k=; b=X1UWidPTbZc5XYldL19YCl/7tswzDCuZMu8nm5e3CSG2q43kMj6wpBXZYosXoucHPH 3HsNUXjKjPW+jqJBf1xnJ9aVZ4hjHPSj4dPMyeOrQ5Z/bkpUDIh8rogXxHx7v4p0nyxi wL+cEyAEArZAsqOJNpP4O0yCAHGCr2W4qbuHDqt3oJ1ewMucNSlewzQw3s5HI9CnVW28 tzL0yJgwt28aYRL8/PZxyOPSU79jSJXlx9Xhb/HuSOBP4sVleesHmJPtmztZdqHQ4bNR rVIKYbKL/DQ5FPT94my+IABm3yQH42xhzyvENvexCrDCbnE1vkCLq+rHaKHcCCeTqYRi WejQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718785195; x=1719389995; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=E6Qt0EHXAUTtq4/0TMQZ2s1bx5CcrwV1JbUBnKEe+5k=; b=lS1NEjsAKQaMAnjMNhXj5poXiSY4MRR1K5sfJILYI2o7ZmBQ2JeZhQPUvgimF14O1H YBKM8D904d8duWO/Y3hRu5JO4W6NDQ4hiFaYokG+NsPr0xlFeQ881WKeyYEmMIXwRlt8 FyhRc1ttIF8qo9svyJh9yt42st74Vu4k6ZsuUocXa3sEkvvX3L6DRci16KpLMocTbk8a LUFcUbDXRXepdW100hMvxzfDINkBohBtwZUTUucGAUHmD3ebnDHrjEcoh8shMznpVqUh a8OwqiX1Ba4I4YjTVOijXWR7aTRw4HwSMwsHNM8aABjLkKqrB/pa8TvyYkmJVJOaOlxV CMTQ== X-Forwarded-Encrypted: i=1; AJvYcCVcSxT11pfmFvB7keb7GDH6wrXl9gbCCjswsuDo3xLqBp0GES2LjMAUpGl8F1BrRrfX/+BUuPBvENsUgx0CIHiaz/9c889HWd72GJzNCjv+DeDC1gQOeEUNnbbCjBcVAYtoXv28kDCFcJ0MVprsQA== X-Gm-Message-State: AOJu0YxEuE0WfAzM6Vh7fVs5IOu3P9CYYgeX5552IHKIylH7nOjMMTcY RokOBUmKUKYLXaThNoujyLuaycsXnHP317OI6HndcRfhvzUUMkWW X-Google-Smtp-Source: AGHT+IGe8MRHENq1Xo0otKWgPn4GgKTE+z5YKmSlFLt+2zmE1shF4i9vHHF7fJ5CUdPeXiXMTIbXCg== X-Received: by 2002:a17:902:d482:b0:1f7:17c2:116f with SMTP id d9443c01a7336-1f9aa459da1mr23013585ad.53.1718785194909; Wed, 19 Jun 2024 01:19:54 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.95]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f855f1decfsm110368105ad.250.2024.06.19.01.19.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Jun 2024 01:19:54 -0700 (PDT) From: Howard Chu To: Arnaldo Carvalho de Melo Cc: Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Kan Liang , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Subject: [PATCH v2 2/5] perf trace: Augment enum syscall arguments with BTF Date: Wed, 19 Jun 2024 16:20:39 +0800 Message-ID: <20240619082042.4173621-3-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240619082042.4173621-1-howardchu95@gmail.com> References: <20240619082042.4173621-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This is a feature implemented on the basis of the previous bug fix https://lore.kernel.org/linux-perf-users/d18a9606-ac9f-4ca7-afaf-fcf4c951cb= 90@web.de/T/#t 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()`. The vmlinux btf is loaded lazily, when user decided to trace the `landlock_add_rule` syscall. But if one decides to run `perf trace` without any arguments, the behaviour is to trace `landlock_add_rule`, so vmlinux btf will be loaded by default. before: ``` perf $ ./perf trace -e landlock_add_rule 0.000 ( 0.008 ms): ldlck-test/438194 landlock_add_rule(rule_type: 2) = =3D -1 EBADFD (File descriptor in bad = state) 0.010 ( 0.001 ms): ldlck-test/438194 landlock_add_rule(rule_type: 1) = =3D -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: LAND= LOCK_RULE_NET_PORT) =3D -1 EBADFD (File descriptor in bad = state) 0.036 ( 0.004 ms): ldlck-test/438194 landlock_add_rule(rule_type: LAND= LOCK_RULE_PATH_BENEATH) =3D -1 EBADFD (File descriptor in bad = state) ``` Tested-by: Arnaldo Carvalho de Melo Suggested-by: Arnaldo Carvalho de Melo Reviewed-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu --- tools/perf/builtin-trace.c | 96 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 5 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index c4fa8191253d..d93f34e9af74 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -19,6 +19,7 @@ #ifdef HAVE_LIBBPF_SUPPORT #include #include +#include #ifdef HAVE_BPF_SKEL #include "bpf_skel/augmented_raw_syscalls.skel.h" #endif @@ -110,6 +111,11 @@ struct syscall_arg_fmt { const char *name; u16 nr_entries; // for arrays bool show_zero; + bool is_enum; + struct { + void *entries; + u16 nr_entries; + } btf_entry; }; =20 struct syscall_fmt { @@ -140,6 +146,7 @@ struct trace { #ifdef HAVE_BPF_SKEL struct augmented_raw_syscalls_bpf *skel; #endif + struct btf *btf; struct record_opts opts; struct evlist *evlist; struct machine *host; @@ -897,6 +904,56 @@ static size_t syscall_arg__scnprintf_getrandom_flags(c= har *bf, size_t size, .strtoul =3D STUL_STRARRAY_FLAGS, \ .parm =3D &strarray__##array, } =20 +static int btf_enum_find_entry(struct btf *btf, char *type, struct syscall= _arg_fmt *arg_fmt) +{ + const struct btf_type *bt; + char enum_prefix[][16] =3D { "enum", "const enum" }, *ep; + int id; + size_t i; + + for (i =3D 0; i < ARRAY_SIZE(enum_prefix); i++) { + ep =3D enum_prefix[i]; + if (strlen(type) > strlen(ep) + 1 && strstarts(type, ep)) + type +=3D strlen(ep) + 1; + } + + id =3D btf__find_by_name(btf, type); + if (id < 0) + return -1; + + bt =3D btf__type_by_id(btf, id); + if (bt =3D=3D NULL) + return -1; + + arg_fmt->btf_entry.entries =3D btf_enum(bt); + arg_fmt->btf_entry.nr_entries =3D btf_vlen(bt); + + return 0; +} + +static size_t btf_enum_scnprintf(char *bf, size_t size, int val, struct bt= f *btf, char *type, + struct syscall_arg_fmt *arg_fmt) +{ + struct btf_enum *be; + int i; + + /* if btf_entry is NULL, find and save it to arg_fmt */ + if (arg_fmt->btf_entry.entries =3D=3D NULL) + if (btf_enum_find_entry(btf, type, arg_fmt)) + return 0; + + be =3D (struct btf_enum *)arg_fmt->btf_entry.entries; + + for (i =3D 0; i < arg_fmt->btf_entry.nr_entries; ++i, ++be) { + if (be->val =3D=3D val) { + return scnprintf(bf, size, "%s", + btf__name_by_offset(btf, be->name_off)); + } + } + + return 0; +} + #include "trace/beauty/arch_errno_names.c" #include "trace/beauty/eventfd.c" #include "trace/beauty/futex_op.c" @@ -1699,6 +1756,15 @@ static void trace__symbols__exit(struct trace *trace) symbol__exit(); } =20 +static void trace__load_vmlinux_btf(struct trace *trace) +{ + trace->btf =3D btf__load_vmlinux_btf(); + if (verbose > 0) { + fprintf(trace->output, trace->btf ? "vmlinux BTF loaded\n" : + "Failed to load vmlinux BTF\n"); + } +} + static int syscall__alloc_arg_fmts(struct syscall *sc, int nr_args) { int idx; @@ -1744,7 +1810,7 @@ static const struct syscall_arg_fmt *syscall_arg_fmt_= _find_by_name(const char *n } =20 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 =3D NULL; int len; @@ -1782,6 +1848,8 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *a= rg, struct tep_format_field * 7 unsigned long */ arg->scnprintf =3D SCA_FD; + } else if (strstr(field->type, "enum") && use_btf !=3D NULL) { + *use_btf =3D arg->is_enum =3D true; } else { const struct syscall_arg_fmt *fmt =3D syscall_arg_fmt__find_by_name(field->name); @@ -1796,9 +1864,10 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *= arg, struct tep_format_field return last_field; } =20 -static int syscall__set_arg_fmts(struct syscall *sc) +static int syscall__set_arg_fmts(struct syscall *sc, bool *use_btf) { - struct tep_format_field *last_field =3D syscall_arg_fmt__init_array(sc->a= rg_fmt, sc->args); + struct tep_format_field *last_field =3D syscall_arg_fmt__init_array(sc->a= rg_fmt, sc->args, + use_btf); =20 if (last_field) sc->args_size =3D last_field->offset + last_field->size; @@ -1810,7 +1879,9 @@ static int trace__read_syscall_info(struct trace *tra= ce, int id) { char tp_name[128]; struct syscall *sc; + int err; const char *name =3D syscalltbl__name(trace->sctbl, id); + bool use_btf =3D false; =20 #ifdef HAVE_SYSCALL_TABLE_SUPPORT if (trace->syscalls.table =3D=3D NULL) { @@ -1883,7 +1954,12 @@ static int trace__read_syscall_info(struct trace *tr= ace, int id) sc->is_exit =3D !strcmp(name, "exit_group") || !strcmp(name, "exit"); sc->is_open =3D !strcmp(name, "open") || !strcmp(name, "openat"); =20 - return syscall__set_arg_fmts(sc); + err =3D syscall__set_arg_fmts(sc, &use_btf); + + if (use_btf && trace->btf =3D=3D NULL) + trace__load_vmlinux_btf(trace); + + return err; } =20 static int evsel__init_tp_arg_scnprintf(struct evsel *evsel) @@ -1891,7 +1967,7 @@ static int evsel__init_tp_arg_scnprintf(struct evsel = *evsel) struct syscall_arg_fmt *fmt =3D evsel__syscall_arg_fmt(evsel); =20 if (fmt !=3D 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; } =20 @@ -2103,6 +2179,16 @@ static size_t syscall__scnprintf_args(struct syscall= *sc, char *bf, size_t size, if (trace->show_arg_names) printed +=3D scnprintf(bf + printed, size - printed, "%s: ", field->na= me); =20 + if (sc->arg_fmt[arg.idx].is_enum && trace->btf) { + size_t p =3D btf_enum_scnprintf(bf + printed, size - printed, val, + trace->btf, field->type, + &sc->arg_fmt[arg.idx]); + if (p) { + printed +=3D p; + continue; + } + } + printed +=3D syscall_arg_fmt__scnprintf_val(&sc->arg_fmt[arg.idx], bf + printed, size - printed, &arg, val); } --=20 2.45.2 From nobody Wed Feb 11 22:54:49 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C905E7D414; Wed, 19 Jun 2024 08:19:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785201; cv=none; b=fnnAtBF3relQ+IKtWZWdZl20gxB/04D0N4V9YmQRLhiMrOpsDomsn7G8wxvWwPCvX8VYwD3DUHMLp1bNlxWLzgA10YsuAXLdad4DaX0I0WEGrK8/3l8LFBxdfYAa+XGgctppFl0YRqr+l8zdTQ6zAoW90EAq8SdmuRLyJ7mZuPk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785201; c=relaxed/simple; bh=80xKGi15F2H5LmV7pq8mcuOQUaXk733xW6wRhxSn5l8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rVCRVfESQRLLQFtZ9tYElEUE/Ab5bEL9+Lud22NyueRbSl8hX68fB4jVE9hI8Eg6JFl9Yn7amnm9k0jFGLlCUZbz+ylvy+HwF0FjOzSS15dHbZYNthWc97iTo+QDTuVjVPsuk7ScV465kCMmuXy0HAZC4jw8eaoL4ClCHFBy8ow= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ejx9Ny4D; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ejx9Ny4D" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-1f9b364faddso2594355ad.3; Wed, 19 Jun 2024 01:19:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718785199; x=1719389999; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BbEWQHo+YQ1yR/+BSBiAM4ZCezg7MYt6LeR5q7fVzzE=; b=ejx9Ny4DN+Q0/umbwoTHUQYaFBvgL8ZF3hitm9PlwMNsKz/hvr11SQJbr/cqcWgO9E BullMWVeb3Ll1sIJWU7wSRbXSTkYmswkXowBfdMZ8XGaklI0Z9+qyfU7/TOjh84hztIw ve+D9rPbvUhD3OAYFwF3xBnXdmsbJfsfxiIMD1d5y0/QtuxJ4a7e0p3JDTadVro1l+CI LfznXlRTTbXEqlfLr67vUUabm0tCsf4XP+xw82l7HKaG5jUtItVBXokPWPpJdH/wZpza Rwy0j/+SgsAPv8Dc4r/fbX///Hp0NTS6pgN8Bb/Axgctk9pBVD4fq1onWZBVuWSeyWzR cVhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718785199; x=1719389999; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BbEWQHo+YQ1yR/+BSBiAM4ZCezg7MYt6LeR5q7fVzzE=; b=SXX0Sas9Rjm8pcEuS6IeN66QW3aQfohHSz7Qt+Ljeak0OYTnGpcsNe6R1qm1ghUwsX Q+KpOpSfR09YqCi1k9v21mu+KcsDesGMtXBbwkkjhzpk/BXI9/I3oEOm2XzumV7/f6o+ 3BGNx521MNlU0r7/HKGhDMQIYrwQIxd9Bl1eStxgbUv+Lj1TkCWOxxg3hSSBxFHubkD8 +XV3zOEprDHtxyFhglLZvvBBnUw6FboyLHl2YGgqTcYY26Re9tYP5Kb5EzappsAck3WX hDn0cN0yw+zAmdOfRvPPdtmoDuCZSqukkLG39hD/QbUmB38jQmXcwuyVoAfGNdJxv94S vDSA== X-Forwarded-Encrypted: i=1; AJvYcCVtp30Ejyt8qD6ay4Oe+M6P41arggQ1ZFhUTd/3AiaB91/kB2u+ox9P3pxHdrJ9OX9kiADfO92p7ntxG5N6weD3+Up1HZLZ8p70khKHsC1d46LRYvbWw5gk7i5MKJnnftQxqLileJQXJNO0aDS82Q== X-Gm-Message-State: AOJu0YzuC/1xZrhAMDhvNp/b0svg3kqh4P8+HcaV+Gvy3RzwexkzClW5 fhXdmnPydc3vo+dmS0yKAURowHYGuq1L3ckJEMQHfvpprl+fRD5y X-Google-Smtp-Source: AGHT+IFsiY/HM7Ugi61FCq9ktvY8AK428+KhGZ7u4y5guDshlh1fjW/xFKQmrUGPrAl7PgT1bh5+MA== X-Received: by 2002:a17:902:e5c6:b0:1f9:b681:1956 with SMTP id d9443c01a7336-1f9b6811d1dmr5001095ad.61.1718785199034; Wed, 19 Jun 2024 01:19:59 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.95]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f855f1decfsm110368105ad.250.2024.06.19.01.19.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Jun 2024 01:19:58 -0700 (PDT) From: Howard Chu To: Arnaldo Carvalho de Melo Cc: Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Kan Liang , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Subject: [PATCH v2 3/5] perf trace: Augment enum tracepoint arguments with BTF Date: Wed, 19 Jun 2024 16:20:40 +0800 Message-ID: <20240619082042.4173621-4-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240619082042.4173621-1-howardchu95@gmail.com> References: <20240619082042.4173621-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before: perf $ ./perf trace -e timer:hrtimer_start --max-events=3D1 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=3D1 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff974466d25f18, function: = 0xffffffff89da5be0, expires: 488283834504945, softexpires: 488283834504945,= mode: HRTIMER_MODE_ABS_PINNED_HARD) HRTIMER_MODE_ABS_PINNED_HARD is: perf $ pahole hrtimer_mode enum hrtimer_mode { HRTIMER_MODE_ABS =3D 0, HRTIMER_MODE_REL =3D 1, HRTIMER_MODE_PINNED =3D 2, HRTIMER_MODE_SOFT =3D 4, HRTIMER_MODE_HARD =3D 8, HRTIMER_MODE_ABS_PINNED =3D 2, HRTIMER_MODE_REL_PINNED =3D 3, HRTIMER_MODE_ABS_SOFT =3D 4, HRTIMER_MODE_REL_SOFT =3D 5, HRTIMER_MODE_ABS_PINNED_SOFT =3D 6, HRTIMER_MODE_REL_PINNED_SOFT =3D 7, HRTIMER_MODE_ABS_HARD =3D 8, HRTIMER_MODE_REL_HARD =3D 9, HRTIMER_MODE_ABS_PINNED_HARD =3D 10, HRTIMER_MODE_REL_PINNED_HARD =3D 11, }; Can also be tested by ./perf trace -e pagemap:mm_lru_insertion,timer:hrtimer_start,timer:hrtimer_= init,skb:kfree_skb --max-events=3D10 (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 fie= ld:enum /sys/kernel/tracing/events/*/*/format | awk '{print $3}' | sort | u= niq) | 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 fiel= d:enum /sys/kernel/tracing/events/*/*/format | awk '{print $3}' | sort | un= iq) | 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 Tested-by: Arnaldo Carvalho de Melo Suggested-by: Arnaldo Carvalho de Melo Reviewed-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu --- 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 d93f34e9af74..bd16679fb4c0 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -1962,12 +1962,12 @@ static int trace__read_syscall_info(struct trace *t= race, int id) return err; } =20 -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 =3D evsel__syscall_arg_fmt(evsel); =20 if (fmt !=3D 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_bt= f); return 0; } =20 @@ -2171,7 +2171,8 @@ static size_t syscall__scnprintf_args(struct syscall = *sc, char *bf, size_t size, * property isn't set. */ if (val =3D=3D 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; =20 printed +=3D scnprintf(bf + printed, size - printed, "%s", printed ? ",= " : ""); @@ -2877,7 +2878,7 @@ static size_t trace__fprintf_tp_fields(struct trace *= trace, struct evsel *evsel, val =3D syscall_arg_fmt__mask_val(arg, &syscall_arg, val); =20 /* Suppress this argument if its value is zero and show_zero property is= n't set. */ - if (val =3D=3D 0 && !trace->show_zeros && !arg->show_zero) + if (val =3D=3D 0 && !trace->show_zeros && !arg->show_zero && !arg->is_en= um) continue; =20 printed +=3D scnprintf(bf + printed, size - printed, "%s", printed ? ", = " : ""); @@ -2885,6 +2886,15 @@ static size_t trace__fprintf_tp_fields(struct trace = *trace, struct evsel *evsel, if (trace->show_arg_names) printed +=3D scnprintf(bf + printed, size - printed, "%s: ", field->nam= e); =20 + if (arg->is_enum && trace->btf) { + size_t p =3D btf_enum_scnprintf(bf + printed, size - printed, val, trac= e->btf, + field->type, arg); + if (p) { + printed +=3D p; + continue; + } + } + printed +=3D syscall_arg_fmt__scnprintf_val(arg, bf + printed, size - pr= inted, &syscall_arg, val); } =20 @@ -4537,7 +4547,7 @@ static void evsel__set_syscall_arg_fmt(struct evsel *= evsel, const char *name) } } =20 -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; =20 @@ -4546,7 +4556,7 @@ static int evlist__set_syscall_tp_fields(struct evlis= t *evlist) continue; =20 if (strcmp(evsel->tp_format->system, "syscalls")) { - evsel__init_tp_arg_scnprintf(evsel); + evsel__init_tp_arg_scnprintf(evsel, use_btf); continue; } =20 @@ -5024,11 +5034,16 @@ int cmd_trace(int argc, const char **argv) } =20 if (trace.evlist->core.nr_entries > 0) { + bool use_btf =3D 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.btf =3D=3D NULL) + trace__load_vmlinux_btf(&trace); } =20 if (trace.sort_events) { --=20 2.45.2 From nobody Wed Feb 11 22:54:49 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4E067EEF5; Wed, 19 Jun 2024 08:20:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785205; cv=none; b=RPLhBk+MeMNmBZ/SNyti0NqCzxIcWzoMSfmVvMn91N4GMutPqWBTipmT0mgU6puP5oYxBBjf5BNmqat2IqoKBhO5JpGI9DuJkHTKL7mWFsUL9H73bLkY7rM/4qIAEIwQeqSIqAIKj8/HawYkU0vB+XQd5AmHxylLrkQ+ME4bOik= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785205; c=relaxed/simple; bh=/LZWj7oaqNHKukw2mT2SK+cZhXWIt6cUnNRXQtMon/w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=E9Rdg4dxYKVPQnKzLEczjKmjIO+laXYRtf9hPJ94ElF0CnqO9BALjc4uA5rQZQzOGE3s/+nA/odDAmQMHcfRWqpZJYpG8ogE+JFrknGQkeNlxAValjo+RDX//oM+n/IMv2WSxWODixu9iq0dt+T68zOxVChqEKt/r5oVMiw2sIo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ITupTZh4; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ITupTZh4" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-1f862f7c7edso42739515ad.3; Wed, 19 Jun 2024 01:20:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718785203; x=1719390003; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kAYmpGaIlWdxgsMDkaG8zIxFictKgFkTjRCndchDMo8=; b=ITupTZh4jZraFr5Q0S27dAQQ/8/EF8/J8EIReWlTwh2mt/YuEnzLZUGVArmT97PhGO yLSeOQ4BfqNuwrLjsE2rJIaHgt4yyd/DAEUx++HM+whSB4Z17858Dm5T+XaunafqMwSI 91XDHWtUkr/eW6qozrAmp/Q7++hzmMDfjsJVyz3Z0OXnlt3Sf9//pxOptyrdUemKsM0X 613ZigSeHYRM/cnnEamIwZUseg97Zs8k6JWjVnWWU3aHmlhHKO7CEYZbGO40xf6s33bA YcEsxtOGCWy8DcQLQN4Jjv+M3tGUed5XYBgNFQpYBkoTQ75lo44jmJYUQcc1kP4FEp+f BBGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718785203; x=1719390003; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kAYmpGaIlWdxgsMDkaG8zIxFictKgFkTjRCndchDMo8=; b=XWZW2FGfGAIDZnLEOf98gHqNtN1zXCOLZhpr5P11xf5XGiifopwND13mIb5eKtfokz D9AxbZBdqOYQHW03shr25L+HsNw0/BengWBof3szcOnWDRMm3JpI1KZKaLXuUyZ3KR5M dHJIJg/0dhYC+aAvNgYSs2erXU1Wr40CRaRHd1BY+WY6Gi3QhFuS6xQGhYK9/hJ1QcO1 XSrvEK3EL8xwVFCnF8g9VtgrIgUYQ5PkoyoCIBSRGaSy8vvsBdMN30fupOnO/4zpRXz3 msQ3nZ8MSvLjk2l50Cqq+SrdxfAQ3GlXModj64wgpqzX04FwE0IKZlBlX+b/wDdyh+Rm YCUQ== X-Forwarded-Encrypted: i=1; AJvYcCWZXqPOAmDGcMU7t59aUwNjhtCSWfbkIp2er6GVE3DMzyOoRxnvFcL+mktxn86296d2uTRmzZs4R3i5ASS3JmIDYUmt2yoO7mtL3BKyXaCco+F2SOEjwU1HrKt0vDpBhL35IwS6NH+LDf9R8oZvVw== X-Gm-Message-State: AOJu0YzUkL+XBoC02fk7DJCCDFDmKsSL1spPYEt1cRTNmnlNTiIaXFl+ wIFOQBNMSXQlE3WqSdSLX5HOt39Mb4+4T/hDjNF3AfgbohyOJFPW X-Google-Smtp-Source: AGHT+IFgftcucoFbUM8uwfsYsAAE572uQqDK+s6ybdqzlvlcyet5YSsOUg7O/GR6vGlt5OY27tW7Qw== X-Received: by 2002:a17:903:1c2:b0:1f7:1687:3062 with SMTP id d9443c01a7336-1f9aa46582dmr23615645ad.61.1718785203190; Wed, 19 Jun 2024 01:20:03 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.95]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f855f1decfsm110368105ad.250.2024.06.19.01.19.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Jun 2024 01:20:02 -0700 (PDT) From: Howard Chu To: Arnaldo Carvalho de Melo Cc: Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Kan Liang , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Subject: [PATCH v2 4/5] perf trace: Filter enum arguments with enum names Date: Wed, 19 Jun 2024 16:20:41 +0800 Message-ID: <20240619082042.4173621-5-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240619082042.4173621-1-howardchu95@gmail.com> References: <20240619082042.4173621-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before: perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode!=3DHRTIMER_MODE= _ABS_PINNED_HARD' --max-events=3D1 No resolver (strtoul) for "mode" in "timer:hrtimer_start", can't set filter= "(mode!=3DHRTIMER_MODE_ABS_PINNED_HARD) && (common_pid !=3D 281988)" After: perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode!=3DHRTIMER_MODE= _ABS_PINNED_HARD' --max-events=3D1 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 12351248764875, softexpires: 12351248764875, m= ode: HRTIMER_MODE_ABS) && and ||: perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode !=3D HRTIMER_MO= DE_ABS_PINNED_HARD && mode !=3D HRTIMER_MODE_ABS' --max-events=3D1 0.000 Hyprland/534 timer:hrtimer_start(hrtimer: 0xffff9497801a84d0, fu= nction: 0xffffffffc04cdbe0, expires: 12639434638458, softexpires: 126394336= 38458, mode: HRTIMER_MODE_REL) perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode =3D=3D HRTIMER_= MODE_REL || mode =3D=3D HRTIMER_MODE_PINNED' --max-events=3D1 0.000 ldlck-test/60639 timer:hrtimer_start(hrtimer: 0xffffb16404ee7bf8= , function: 0xffffffffa7790420, expires: 12772614418016, softexpires: 12772= 614368016, mode: HRTIMER_MODE_REL) Switching it up, using both enum name and integer value(--filter=3D'mode = =3D=3D HRTIMER_MODE_ABS_PINNED_HARD || mode =3D=3D 0'): perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode =3D=3D HRTIMER_= MODE_ABS_PINNED_HARD || mode =3D=3D 0' --max-events=3D3 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 12601748739825, softexpires: 12601748739825, m= ode: HRTIMER_MODE_ABS_PINNED_HARD) 0.036 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 12518758748124, softexpires: 12518758748124, m= ode: HRTIMER_MODE_ABS_PINNED_HARD) 0.172 tmux: server/41881 timer:hrtimer_start(hrtimer: 0xffffb164081e78= 38, function: 0xffffffffa7790420, expires: 12518768255836, softexpires: 125= 18768205836, mode: HRTIMER_MODE_ABS) P.S. perf $ pahole hrtimer_mode enum hrtimer_mode { HRTIMER_MODE_ABS =3D 0, HRTIMER_MODE_REL =3D 1, HRTIMER_MODE_PINNED =3D 2, HRTIMER_MODE_SOFT =3D 4, HRTIMER_MODE_HARD =3D 8, HRTIMER_MODE_ABS_PINNED =3D 2, HRTIMER_MODE_REL_PINNED =3D 3, HRTIMER_MODE_ABS_SOFT =3D 4, HRTIMER_MODE_REL_SOFT =3D 5, HRTIMER_MODE_ABS_PINNED_SOFT =3D 6, HRTIMER_MODE_REL_PINNED_SOFT =3D 7, HRTIMER_MODE_ABS_HARD =3D 8, HRTIMER_MODE_REL_HARD =3D 9, HRTIMER_MODE_ABS_PINNED_HARD =3D 10, HRTIMER_MODE_REL_PINNED_HARD =3D 11, }; Tested-by: Arnaldo Carvalho de Melo Suggested-by: Arnaldo Carvalho de Melo Reviewed-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu --- tools/perf/builtin-trace.c | 89 ++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 13 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index bd16679fb4c0..1148c3edee97 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -904,11 +904,36 @@ static size_t syscall_arg__scnprintf_getrandom_flags(= char *bf, size_t size, .strtoul =3D STUL_STRARRAY_FLAGS, \ .parm =3D &strarray__##array, } =20 -static int btf_enum_find_entry(struct btf *btf, char *type, struct syscall= _arg_fmt *arg_fmt) +#define SCA_GETRANDOM_FLAGS syscall_arg__scnprintf_getrandom_flags + +static const struct btf_type *btf_find_type(struct btf *btf, char *type) { const struct btf_type *bt; + int id =3D btf__find_by_name(btf, type); + + if (id < 0) + return NULL; + + bt =3D btf__type_by_id(btf, id); + if (bt =3D=3D NULL) + return NULL; + + return bt; +} + +struct btf_parm { + struct btf *btf; + char *type; +}; + +static bool syscall_arg__strtoul_btf_enum(char *bf, size_t size, struct sy= scall_arg *arg, u64 *val) +{ + struct btf_parm *bparm =3D arg->parm; + struct btf *btf =3D bparm->btf; + char *type =3D bparm->type; char enum_prefix[][16] =3D { "enum", "const enum" }, *ep; - int id; + struct btf_enum *be; + const struct btf_type *bt; size_t i; =20 for (i =3D 0; i < ARRAY_SIZE(enum_prefix); i++) { @@ -917,11 +942,38 @@ static int btf_enum_find_entry(struct btf *btf, char = *type, struct syscall_arg_f type +=3D strlen(ep) + 1; } =20 - id =3D btf__find_by_name(btf, type); - if (id < 0) - return -1; + bt =3D btf_find_type(btf, type); + if (bt =3D=3D NULL) + return false; =20 - bt =3D btf__type_by_id(btf, id); + for (be =3D btf_enum(bt), i =3D 0; i < btf_vlen(bt); ++i, ++be) { + const char *name =3D btf__name_by_offset(btf, be->name_off); + int max_len =3D max(size, strlen(name)); + + if (strncmp(name, bf, max_len) =3D=3D 0) { + *val =3D be->val; + return true; + } + } + + return false; +} + +#define STUL_BTF_ENUM syscall_arg__strtoul_btf_enum + +static int btf_enum_find_entry(struct btf *btf, char *type, struct syscall= _arg_fmt *arg_fmt) +{ + char enum_prefix[][16] =3D { "enum", "const enum" }, *ep; + const struct btf_type *bt; + size_t i; + + for (i =3D 0; i < ARRAY_SIZE(enum_prefix); i++) { + ep =3D enum_prefix[i]; + if (strlen(type) > strlen(ep) + 1 && strstarts(type, ep)) + type +=3D strlen(ep) + 1; + } + + bt =3D btf_find_type(btf, type); if (bt =3D=3D NULL) return -1; =20 @@ -1850,6 +1902,7 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *a= rg, struct tep_format_field arg->scnprintf =3D SCA_FD; } else if (strstr(field->type, "enum") && use_btf !=3D NULL) { *use_btf =3D arg->is_enum =3D true; + arg->strtoul =3D STUL_BTF_ENUM; } else { const struct syscall_arg_fmt *fmt =3D syscall_arg_fmt__find_by_name(field->name); @@ -3776,7 +3829,8 @@ static int ordered_events__deliver_event(struct order= ed_events *oe, return __trace__deliver_event(trace, event->event); } =20 -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 =3D __evsel__syscall_arg_fmt(evsel); @@ -3785,8 +3839,10 @@ static struct syscall_arg_fmt *evsel__find_syscall_a= rg_fmt_by_name(struct evsel return NULL; =20 for (field =3D evsel->tp_format->format.fields; field; field =3D field->n= ext, ++fmt) - if (strcmp(field->name, arg) =3D=3D 0) + if (strcmp(field->name, arg) =3D=3D 0) { + *type =3D field->type; return fmt; + } =20 return NULL; } @@ -3824,14 +3880,14 @@ static int trace__expand_filter(struct trace *trace= __maybe_unused, struct evsel struct syscall_arg_fmt *fmt; int left_size =3D tok - left, right_size =3D right_end - right; - char arg[128]; + char arg[128], *type; =20 while (isspace(left[left_size - 1])) --left_size; =20 scnprintf(arg, sizeof(arg), "%.*s", left_size, left); =20 - fmt =3D evsel__find_syscall_arg_fmt_by_name(evsel, arg); + fmt =3D evsel__find_syscall_arg_fmt_by_name(evsel, arg, &type); if (fmt =3D=3D NULL) { pr_err("\"%s\" not found in \"%s\", can't set filter \"%s\"\n", arg, evsel->name, evsel->filter); @@ -3843,9 +3899,16 @@ static int trace__expand_filter(struct trace *trace = __maybe_unused, struct evsel =20 if (fmt->strtoul) { u64 val; - struct syscall_arg syscall_arg =3D { - .parm =3D fmt->parm, - }; + struct syscall_arg syscall_arg; + struct btf_parm bparm; + + if (fmt->is_enum) { + bparm.btf =3D trace->btf; + bparm.type =3D type; + syscall_arg.parm =3D &bparm; + } else { + syscall_arg.parm =3D fmt->parm; + } =20 if (fmt->strtoul(right, right_size, &syscall_arg, &val)) { char *n, expansion[19]; --=20 2.45.2 From nobody Wed Feb 11 22:54:49 2026 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 123267F48C; Wed, 19 Jun 2024 08:20:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785209; cv=none; b=CEOXE+4myWW0vxA/LVJ4l5T27xhsMN8/xO5RzDPwdf8yTekApPDgNmU77xuWPdRwEpoQQX2fT3pQks9FMJ51vzyvc/jfUFww5J4kCK2taA6xJkP4VDLZMykoYnpsuCHMNgMxAx5jfoJnh30+l+xTWEbt+jjBYjimFcVcXjSmvDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718785209; c=relaxed/simple; bh=wqrWbQjJHLVk77hDbRS9Ov7m0yXFPnxx5SOMZYtv92I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lcI9CP1CKODoOSuuELKyNr4AQn6vkgaDFjAu2kN51tqv657YoGZxyJEh+Q98EvfnVi2hNq3Tb+r2iooV+3bYdOG2wemzE74MjmT2o77l1U8kuQ3kC3/iJL1Ky8NxLTGq2iVTKST6XV4J2YFdXu3WDxVZocQgxoOr+KHs4ApCQ/g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lrEytrsZ; arc=none smtp.client-ip=209.85.210.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lrEytrsZ" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-705c0115192so5325898b3a.1; Wed, 19 Jun 2024 01:20:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718785207; x=1719390007; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=sXpj4ctbnoq9X2eril6gkLuWQ94xgN+SdmmMtAnJByc=; b=lrEytrsZM6FCfzFpDQHOSrNfaB/kJFEo/4T/zs9J6NzPMsY1I7kNU9LCDPHbM9m1XR TlsPCxUSLAzxb68/8+tMd3sM+PmabxevEUXHN5FlESSZd6f42gPFtakeaDymZmD9T3OE Tmy9ka7WPQYimXpECSkzXvrZQGHm4GVinprHaa/JxEgTG1xYWw2hAGSeOknAcQV5/JLP puH6wgn4fl6iRi1si9HqFo3YKvvyrhz1X1c3OIKH0uOly3Wcr0BlJiaFh63Ly0EF/nmT 4GVW91I+Hpc8JHgUVjV3r6F7i/E7IyQb7Ccplj31WYe7htZ4sFFTqpsh8GRJuN+HLYf/ J1Ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718785207; x=1719390007; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sXpj4ctbnoq9X2eril6gkLuWQ94xgN+SdmmMtAnJByc=; b=XTKLsKEjBfwbOcAFKFSgr6vrJzAJEyLqhPbCEi/n875TVjQOwFbEfSjbPaoGIxll/c AfGQsXU9uHiBmVBqzq5s92ykpgShkkU2Jpoh+1VFxaGh/TzvLw6zue2Mjt4K/XmUs8vj TRxOiLNXva30lvVKi6djRjBpbt/iMVeGUE8k4dNt+s5r6aRuTxVHU+6jDLzPDGvDn2YG 7T++rJ/y1ePyHA7J7nQ3YgwUIIhAGzMiDpAQ/LW6+FIZ535G760KH5wdXXvkDwIfIW53 IimPvPtbaG4BSV/+i0K5DlKdXXcbQqkbIj3mvT5AAEHFoE7Wgi+rP8d2eYpTNLLvYJ1E V7Wg== X-Forwarded-Encrypted: i=1; AJvYcCVVvfxDAkKmhnLsPGLYiqXxL2bz6+0k0Sm4vZtkMlZS/IyS1VnPJfPRwbbiwcz2DNPENvBkHnanxED5Xlc7t75bKA4ZptVs2QtW1+gxeEEPAWHNHbap3ajlvTf5tzSOmetRVtE9cdV8qEEwEpYf+w== X-Gm-Message-State: AOJu0YypavrCEaqH6dmFp1EnN71kVvGf+Fxbt77skT1VPwbP42G/p/NH WyH+NiJHr1sJWrKGnXv2lmkWYW6+3E1JFKwa2td+KCsgCbP/6TU8 X-Google-Smtp-Source: AGHT+IFlCusWPb36kf8gjCLYKpQVEm7ZjoWSHk4AtCbufMJyPycqkGt1Ke9V1dMr/9q08waHXPGl4Q== X-Received: by 2002:a05:6a20:ba3:b0:1b2:aa82:4b33 with SMTP id adf61e73a8af0-1bcbb617386mr1881167637.49.1718785207304; Wed, 19 Jun 2024 01:20:07 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.95]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f855f1decfsm110368105ad.250.2024.06.19.01.20.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Jun 2024 01:20:07 -0700 (PDT) From: Howard Chu To: Arnaldo Carvalho de Melo Cc: Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Kan Liang , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Subject: [PATCH v2 5/5] perf trace: Add test for enum augmentation Date: Wed, 19 Jun 2024 16:20:42 +0800 Message-ID: <20240619082042.4173621-6-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240619082042.4173621-1-howardchu95@gmail.com> References: <20240619082042.4173621-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Check for vmlinux's existence in sysfs as prerequisite. Add landlock_add_rule.c workload. 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. Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu --- tools/perf/tests/builtin-test.c | 1 + tools/perf/tests/shell/trace_btf_enum.sh | 57 +++++++++++++++++++ tools/perf/tests/tests.h | 1 + tools/perf/tests/workloads/Build | 1 + .../perf/tests/workloads/landlock_add_rule.c | 32 +++++++++++ 5 files changed, 92 insertions(+) create mode 100755 tools/perf/tests/shell/trace_btf_enum.sh create mode 100644 tools/perf/tests/workloads/landlock_add_rule.c diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-tes= t.c index c3d84b67ca8e..e83200415ad1 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -152,6 +152,7 @@ static struct test_workload *workloads[] =3D { &workload__sqrtloop, &workload__brstack, &workload__datasym, + &workload__landlock_add_rule, }; =20 static int num_subtests(const struct test_suite *t) diff --git a/tools/perf/tests/shell/trace_btf_enum.sh b/tools/perf/tests/sh= ell/trace_btf_enum.sh new file mode 100755 index 000000000000..4861983553ab --- /dev/null +++ b/tools/perf/tests/shell/trace_btf_enum.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# perf trace enum augmentation tests +# SPDX-License-Identifier: GPL-2.0 + +err=3D0 +set -e + +syscall=3D"landlock_add_rule" +non_syscall=3D"timer:hrtimer_init,timer:hrtimer_start" + +TESTPROG=3D"perf test -w landlock_add_rule" + +. "$(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=3D2 + fi +} + +trace_landlock() { + echo "Tracing syscall ${syscall}" + 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\) =3D -1.*" + then + err=3D0 + else + err=3D1 + fi +} + +trace_non_syscall() { + echo "Tracing non-syscall tracepoint ${non-syscall}" + if perf trace -e $non_syscall --max-events=3D1 2>&1 | \ + grep -q -E '.*timer:hrtimer_.*\(.*mode: HRTIMER_MODE_.*\)$' + then + err=3D0 + else + err=3D1 + fi +} + +check_vmlinux + +if [ $err =3D 0 ]; then + trace_landlock +fi + +if [ $err =3D 0 ]; then + trace_non_syscall +fi + +exit $err diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index 3aa7701ee0e9..69126299bb08 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_add_rule); =20 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 a1f34d5861e3..5b12b93ecffa 100644 --- a/tools/perf/tests/workloads/Build +++ b/tools/perf/tests/workloads/Build @@ -6,6 +6,7 @@ perf-y +=3D leafloop.o perf-y +=3D sqrtloop.o perf-y +=3D brstack.o perf-y +=3D datasym.o +perf-y +=3D landlock_add_rule.o =20 CFLAGS_sqrtloop.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE CFLAGS_leafloop.o =3D -g -O0 -fno-inline -fno-omit-frame-pointer -= U_FORTIFY_SOURCE diff --git a/tools/perf/tests/workloads/landlock_add_rule.c b/tools/perf/te= sts/workloads/landlock_add_rule.c new file mode 100644 index 000000000000..529b5f1ea5a7 --- /dev/null +++ b/tools/perf/tests/workloads/landlock_add_rule.c @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include +#include // for __NR_landlock_add_rule +#include +#include +#include "../tests.h" + +static int landlock_add_rule(int argc __maybe_unused, const char **argv __= maybe_unused) +{ + int fd =3D 11; + int flags =3D 45; + + struct landlock_path_beneath_attr path_beneath_attr =3D { + .allowed_access =3D LANDLOCK_ACCESS_FS_READ_FILE, + .parent_fd =3D 14, + }; + + struct landlock_net_port_attr net_port_attr =3D { + .port =3D 19, + .allowed_access =3D 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_add_rule); --=20 2.45.2