From nobody Thu Dec 18 12:12:04 2025 Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) (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 0751F14BF9B; Fri, 5 Jul 2024 13:20:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185651; cv=none; b=Hf8gYUzJFdqgL5bcdyPa0j87nxqntlIfAvvS1G+qhL7Cj+dzJba4m0Lkslf70BLGPV1LwK4Iau99lXygkI9i3yfuJGhv55EafChzsMnabutS7HW93MKEPbHI4JeSF7MZVWxwftRiXIMUS0vie1CBmNk7BHMdZwoh/UvxE7cu9zI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185651; c=relaxed/simple; bh=sHaxqYXHG2HLaIB+D8RhPhiyDt9yrXC/8xpBdkP4nLQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qjqXtmhtHz5mGTotAFpGQpBDUDwVVTJHncT4l0i+Dqlh9/fjYLDZ1O77noBt2/YyJHyYRZQ1O2++4zwM+Ua77M9QZrB1acdSuksyLOcEv8tkUoQ6n0EXbNX2crZYH5mLqNqLPJZnk1ipg62CDHzLS8gN+WQ8PgH8E8roNcv+0dM= 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=YFRFCh24; arc=none smtp.client-ip=209.85.215.176 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="YFRFCh24" Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-75ee39f1ffbso1109503a12.2; Fri, 05 Jul 2024 06:20:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720185649; x=1720790449; 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=EdV0v22yUm/xQxD/kVPFe9jly3facK8iEM4rioFXbJA=; b=YFRFCh2487e+BrAV3ecFbEF1H9Gr0oV8H2KZJZp+yXVBHTPuGpdCANCr9vTP9x+rZT /Z0/Ij9C7C3km6To6FmeWxVHOga1qtdYp3SMG+33RE0Kuo4ZTSZ2u1Z7y7OVPjs3PXXS w6DyrvMd0kvSkli2/Dkp/gm9J76rYLsPP8Oykb3uNhjpIpkKfCMXIRdoABVJEUPiADaL uJmqfqGvKmJS7c3VZKuRBX3637nE5ZsXKUBaWX0zPWJkrDV4nnpp6bFF+XIoRYchzz+p m64zNSXkAf69/pZ06v8VEfzw2fDHthBAcSsss5BEB7m4/4OZYxK58cejFXoCf5UFCLiZ aIrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720185649; x=1720790449; 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=EdV0v22yUm/xQxD/kVPFe9jly3facK8iEM4rioFXbJA=; b=ltSioHntVOTIwQKbSLanNO8mQBiZzgJxw+lG//D9K1C39+FWPbdCojxuho9JJY3CVI S8tcVr8im4T3KPA2UfS7/Xm0NqK2UJxK2+tpHEqPGH2oNRXx4S+ihjXQgZPvhCPeIO4D Hqtf+Jsz1DBJQfoR9T+WF3EB+fs1c4ea/xeUFpYCvK5AaWArCQ1ZtHCfM9OaYWyHmFyT Db8pVcNF7u7IXjhh+nFXrP9V+CMxPHdXI8lrjNCDwhSdv1ly8jmX8rpD1wSiiibXmtGe 1qw2izPsAhjXwrRR+rZxCGpg4FCKa1+gUMeCxSoIfQcs3g9VTfb/zQG/aAJaZ636bLMu iF6A== X-Forwarded-Encrypted: i=1; AJvYcCUbznXe/l13lIP8xoLZxAGmu49BrgjxOx3bVwCk0Ge9cXGoraPF8S6iKUvQlTSWmQkZx9RaPtc4BzqjCxNxuHqNBduIxKdwXwzF+UUT0TGPWO9MWcaRtd/X2zClr2vdT5N+clPiNSRq0JqgkOU6HA== X-Gm-Message-State: AOJu0YyhOG2XXSGNvybO52Neib8vEF/P8ABXf/19ZXqjFL7ZXRcGZfM1 OwBiEC6QZW9KDo+IGlXMo0nMxeNm2i/rQZXHZR/FSUTYCVu/FKFN X-Google-Smtp-Source: AGHT+IHbXhgz6hXL3vXtUwswf/FgOMe23CpsW5q44P2Xt+VydFM3gA8qlpIIjA5oV2i0Gaeo5lM9mg== X-Received: by 2002:a17:90a:b88d:b0:2c9:81ab:237d with SMTP id 98e67ed59e1d1-2c99c5042c3mr3419090a91.7.1720185648929; Fri, 05 Jul 2024 06:20:48 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a956260sm3328974a91.19.2024.07.05.06.20.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 06:20:48 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries Date: Fri, 5 Jul 2024 21:20:51 +0800 Message-ID: <20240705132059.853205-2-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705132059.853205-1-howardchu95@gmail.com> References: <20240705132059.853205-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); Signed-off-by: Howard Chu 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 Link: https://lore.kernel.org/r/20240624181345.124764-2-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- 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_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 Thu Dec 18 12:12:04 2025 Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) (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 AE73114D43D; Fri, 5 Jul 2024 13:20:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185656; cv=none; b=OHFb+W2Wfrc1hrWeK/rka5BJwnTWlCghLNeNKSr0UuU5YOf0DSll9TIRTYabgUf0gY5k3L65iePG/7eyCzNbHySEfT8sW0WOAMe2kAxIj00sQtCT7lsqEuXYw/auz0P/V3B7cb8FdGyxxasEjE/SEhuqrXh/a6aiBqLy6QY3ZE8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185656; c=relaxed/simple; bh=SIR9uo5jBHA4ojUDJSYvUwgfou2A3ePKJvZDSyXEPWk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pGHezNCTUUr1jcBxW+uJ6UkA69CrU5csxq3K6/2qxcO+QVMlDe/JJPNbLXPvqgbYx3A8jLJSr+GySdkyHVDPh7R5f0EabNNMSm+J+vFEPgfkoHCdq4+27mJOg72tOKDc2k3bJdJwAvpQ1AJlnMVozw5NHTuK65DWHpWtL5wxf9g= 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=e/beO5UK; arc=none smtp.client-ip=209.85.216.48 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="e/beO5UK" Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-2c1a4192d55so1091664a91.2; Fri, 05 Jul 2024 06:20:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720185653; x=1720790453; 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=ZXuX9LroFfrWSjjWC3sm96qQ6X5CtfodhnxL67G+Hzk=; b=e/beO5UKVg4jvMvSMszikPIvYk0k+UsAUHVytt0jxyXzAiRGFFA1QteNIxyecJdAEJ TQo4qHeOQoR/Ru4mT+ZVmNE3LapkcH/kZymCUfrPi/9y2U1d2VSqeKzurY77/ovqC6Gy 8qrbGTTYQm8iKRhA6gjtkPsU063TFBtz2002oqjjgpojOMFRyKQPRwV6BebVD2tvLFmJ nHOfJNXYBOQnYV0RbmPVF3rkxOnvm+yXNgdNLPuupRywiW1IHNnb6amUfJiFsR9XlMlW UMJj8QyCKiVnz3DldRnHnTh9J7a8UaAHCItG/ReRrLTX1WDq7J40qdvw/SkyW3DkNDh+ bUSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720185653; x=1720790453; 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=ZXuX9LroFfrWSjjWC3sm96qQ6X5CtfodhnxL67G+Hzk=; b=q5K5d0VGL8FPTEl31b/XuIqpDqY9xSjuQFTiICHZRBPlSuYeMCJKQkNhX82jKMoQ4l B7vVTuu3AZG6+Dh/KlMksMtziv7LZLSNe8YYMZX4vGHPI/ydZGs1IBi5wZPRuDVSdm+J yVlz6Rmzd8B2feR/Tw5Uh/QDj1qFw/Ja1ZNohqPAHd4bwbFUF2wJg0ErlO7dIHQxueIj 7V4A1BgN+rkjUsst8czsl+DPZuEjtCXO/QiCJhNCN9C/Cj3JLEx8DvSe71cpjI5n8Rst krbKkcBFc2Mu0k3Tu5TD2bSCQ1TDWHfZgK2enZnsvPoVGODvqLDYUhTcJly6Vki3+wkr hqCQ== X-Forwarded-Encrypted: i=1; AJvYcCVStAN69Te5wXxRuHbwajH3S5FAZozZGLMPfi1YfR8Zx+lv8TurPTBrziaLKY2UehY9zpftPZvFDT5cP4bZ1fWj+6qftHQC6plSvWPvyIQ34TibNEctazSQsj94CVmxZ4/Wn6LD0kt6Xr0cHmm8Vg== X-Gm-Message-State: AOJu0Yzyi1e6A7JYBexoc1i/1nVTMxbUaHm7y9dnjxy/zbnuJPxWa1n9 rVWVehRPqmL/O7OOvFgj73M6FMhX8St1dHdS0JojxL3zlVZDEO7K X-Google-Smtp-Source: AGHT+IG/fPPB9MOMuxf/eVV759tzKez9SE7brEmS73PmDCqTXiBUO/pVALkae4a3hOOVtNnlZUPYBg== X-Received: by 2002:a17:90a:ac04:b0:2c9:6cb8:65ce with SMTP id 98e67ed59e1d1-2c99c52a6ddmr3330896a91.10.1720185652789; Fri, 05 Jul 2024 06:20:52 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a956260sm3328974a91.19.2024.07.05.06.20.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 06:20:52 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo , Alexander Shishkin , =?UTF-8?q?G=C3=BCnther=20Noack?= , Ingo Molnar , Mark Rutland , =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Peter Zijlstra Subject: [PATCH v5 2/8] perf trace: BTF-based enum pretty printing for syscall args Date: Fri, 5 Jul 2024 21:20:52 +0800 Message-ID: <20240705132059.853205-3-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705132059.853205-1-howardchu95@gmail.com> References: <20240705132059.853205-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 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) = =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) ``` Committer notes: Made it build with NO_LIBBPF=3D1, simplified btf_enum_fprintf(), see [1] for the discussion. Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Alexander Shishkin Cc: G=C3=BCnther Noack Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Micka=C3=ABl Sala=C3=BCn Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/lkml/20240613022757.3589783-1-howardchu95@gma= il.com Link: https://lore.kernel.org/lkml/ZnXAhFflUl_LV1QY@x1 # [1] Link: https://lore.kernel.org/r/20240624181345.124764-3-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- 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 #include +#include #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 }; =20 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; }; =20 +static void trace__load_vmlinux_btf(struct trace *trace __maybe_unused) +{ +#ifdef HAVE_LIBBPF_SUPPORT + if (trace->btf !=3D NULL) + return; + + 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"); + } +#endif +} + struct tp_field { int offset; union { @@ -887,6 +909,64 @@ static size_t syscall_arg__scnprintf_getrandom_flags(c= har *bf, size_t size, =20 #define SCA_GETRANDOM_FLAGS syscall_arg__scnprintf_getrandom_flags =20 +#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 !=3D NULL) + return 0; + + type =3D strstr(type, "enum "); + if (type =3D=3D NULL) + return -1; + + type +=3D 5; // skip "enum " to get the enumeration name + + id =3D btf__find_by_name(btf, type); + if (id < 0) + return -1; + + arg_fmt->type =3D btf__type_by_id(btf, id); + return arg_fmt->type =3D=3D 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 =3D btf_enum(type); + const int nr_entries =3D btf_vlen(type); + + for (int i =3D 0; i < 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; +} + +static size_t trace__btf_enum_scnprintf(struct trace *trace, struct syscal= l_arg_fmt *arg_fmt, char *bf, + size_t size, int val, char *type) +{ + if (trace->btf =3D=3D 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 =3D SCA_STRARRAY, \ .strtoul =3D 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 } =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; @@ -1756,6 +1838,7 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *a= rg, struct tep_format_field continue; =20 len =3D strlen(field->name); + arg->is_enum =3D false; =20 if (strcmp(field->type, "const char *") =3D=3D 0 && ((len >=3D 4 && strcmp(field->name + len - 4, "name") =3D=3D 0) || @@ -1782,6 +1865,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); @@ -1798,7 +1883,8 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *a= rg, struct tep_format_field =20 static int syscall__set_arg_fmts(struct syscall *sc) { - 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, + &sc->use_btf); =20 if (last_field) sc->args_size =3D last_field->offset + last_field->size; @@ -1811,6 +1897,7 @@ static int trace__read_syscall_info(struct trace *tra= ce, int id) char tp_name[128]; struct syscall *sc; const char *name =3D syscalltbl__name(trace->sctbl, id); + int err; =20 #ifdef HAVE_SYSCALL_TABLE_SUPPORT if (trace->syscalls.table =3D=3D NULL) { @@ -1883,7 +1970,13 @@ 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); + + /* after calling syscall__set_arg_fmts() we'll know whether use_btf is tr= ue */ + if (sc->use_btf) + trace__load_vmlinux_btf(trace); + + return err; } =20 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 =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 +2196,15 @@ 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) { + size_t p =3D trace__btf_enum_scnprintf(trace, &sc->arg_fmt[arg.idx], b= f + printed, + size - printed, val, field->type); + 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 Thu Dec 18 12:12:04 2025 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (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 0D51014E2D0; Fri, 5 Jul 2024 13:20:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185658; cv=none; b=l29JCGJd1/3RMIHSJzDmsshQ19a7zXu4wVQGKiMlQQtQaa3VtPNzCEM0rvpgEbdriLGJqLPgb6KQUzxhYPqe15vbrjwC+b0EWV2beLEdaSqgZZcEU/H8S/KEcHCsRYuRxdjGYS0edvIhZJx+WP6AZABHKlQtJs/PakQEjVsY0/A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185658; c=relaxed/simple; bh=wZt9Yscf3NHoVs//WjE+d/6CjmjjOUhU9J1rClELho4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VPOYqN2+TWwoIu9xsxRnJKzqyYJEzHuX9IKlbfwgcOneLSn97ypO3RDczpormp89bMqQm2HgBspb3u/tgpoeLEP40RHvlBRDKm6gQm/kGpuCBj6EvvaZBdV9MbA2pPk974u9hQDWUN6mD2YLYw02E8/9o9/XYxEL1MOa0qzbbbg= 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=fXbu8pEb; arc=none smtp.client-ip=209.85.210.170 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="fXbu8pEb" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-70b0e7f6f8bso533912b3a.3; Fri, 05 Jul 2024 06:20:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720185656; x=1720790456; 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=mrw/+MkpLo+YifaVzEnjYrzCeq2JJtmQbuCJK7soUkM=; b=fXbu8pEb3apv9rPsil5uNP6P0QYaEyIhFd71068tvGsxW0diqq1p/WDr98AwP5TWRT w7Q58nwSO2HkdedqdYAfneCZLgnDEJpgnMBJ8wCflXQ7Z8IXyP4oqdv5lFjM7Rc+oir3 NQffPTay+jB01d8+v+DcCuKCiPFuumXMwJb3XFoy/VpkGPWtmB1k2CIMsLhiYqVRS6NZ UMPh0cz2ZrAC3Ppdd/iHmdoU/uI0RSC7udX4dtVuvsTkRAxYjssSqfXZehXG2qq/3dk/ +rHDfCgqBbcmiHyvGYgsZVXIZJOr7aJtaZ5YMqyMKUy+jbJOvRV7XTCCD+eBjemHSpg1 sGPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720185656; x=1720790456; 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=mrw/+MkpLo+YifaVzEnjYrzCeq2JJtmQbuCJK7soUkM=; b=lOuXeCWW+f71i/WAOnTmTK8LxziXLPQe3olspp1OhvmhWrixVgo8o16z1SAHf2MJ2x 3dtf3sTwq1dimxElaKXcDPgS8bdRxzqPsX5vj2LqbSuv6q2ckp2eW88gkBP1a2hbdJsy YW8hsvI9oS7Uzd5j1e05tNlLQVqnBIanFxvR5FjBGKnxAMj9QNStl2YOWgj3xZ50qaYN zyziSeJKSprNe9JBQYH2TsdeXCC73/wB78q4mi1tVTrz7213L6jlHIeeHKaSubjp+6ut ZfOW5UvA5myUq/k/lcdcHE+YxBo19C3duBluHcPXXOrvc8OLziGMWfe3MiSaQjtrGHQe 69WQ== X-Forwarded-Encrypted: i=1; AJvYcCV4GduP67txy8aNowQ3r1HRwrc/k1Phi+EfUIkdH9k+SExwFaxOPRJ3dp1K4QGhoRsEfrJ40e4xALmIhvA7BQA5xzJz5OSzOzV4uD/t8aJ9m0PlpDX6Vvorq8YEKq6ie9QtLQJ0eCnGlcGwN7Qd3A== X-Gm-Message-State: AOJu0YzA38R0w9f/N+kA99uqYn+IZhpo2G/s+RXA3ynA239p51K9/Zzt rVHJIWxLGqSojcjQoMCbOzsiYZ8s8Zg7g9NrrM1C27nSeW7l0L8P X-Google-Smtp-Source: AGHT+IEQS8p5ZISXTNcrojUwhGkeG0CCVNiQC4mV/zKMJFWpnqBddiF20XsSoDdX7Oc+PNRRc4hZ5g== X-Received: by 2002:a05:6a20:12c3:b0:1c0:bd6c:aaa0 with SMTP id adf61e73a8af0-1c0cc88eeaamr5536793637.28.1720185656171; Fri, 05 Jul 2024 06:20:56 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a956260sm3328974a91.19.2024.07.05.06.20.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 06:20:55 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Alexander Shishkin , Ingo Molnar , Mark Rutland , Peter Zijlstra , Arnaldo Carvalho de Melo Subject: [PATCH v5 3/8] perf trace: Augment non-syscall tracepoints with enum arguments with BTF Date: Fri, 5 Jul 2024 21:20:53 +0800 Message-ID: <20240705132059.853205-4-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705132059.853205-1-howardchu95@gmail.com> References: <20240705132059.853205-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: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 4382442895089, softexpires: 4382442895089, mod= e: HRTIMER_MODE_ABS_PINNED_HARD) in which 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 Committer testing: root@x1:~# perf trace -e timer:hrtimer_start --max-events=3D2 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff225050, function= : 0xffffffff9e22ddd0, expires: 241152380000000, softexpires: 24115238000000= 0, mode: HRTIMER_MODE_ABS) 0.028 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff225050, function= : 0xffffffff9e22ddd0, expires: 241153654000000, softexpires: 24115365400000= 0, mode: HRTIMER_MODE_ABS_PINNED_HARD) root@x1:~# Suggested-by: Arnaldo Carvalho de Melo Reviewed-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/lkml/20240615032743.112750-1-howardchu95@gmai= l.com Link: https://lore.kernel.org/r/20240624181345.124764-4-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- 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 *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 @@ -2188,7 +2188,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 ? ",= " : ""); @@ -2893,7 +2894,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 ? ", = " : ""); @@ -2901,6 +2902,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) { + size_t p =3D trace__btf_enum_scnprintf(trace, arg, bf + printed, + size - printed, val, field->type); + if (p) { + printed +=3D p; + continue; + } + } + printed +=3D syscall_arg_fmt__scnprintf_val(arg, bf + printed, size - pr= inted, &syscall_arg, val); } =20 @@ -4553,7 +4563,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 @@ -4562,7 +4572,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 @@ -5040,11 +5050,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__load_vmlinux_btf(&trace); } =20 if (trace.sort_events) { --=20 2.45.2 From nobody Thu Dec 18 12:12:04 2025 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) (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 45DE815250F; Fri, 5 Jul 2024 13:21:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185661; cv=none; b=L7H4ci/tg4hGcBw6EpjG80sCYztImnFS6SgFFQbPzpKjG7fRfaqdbO3WeG12tW61CpJttdbJ78HdIC7sCpO0YA+ApNHHq66ADOAKlW/0fGqZ5eeWJ9nXDO1uubuPKzIG98pCO768MLfSxP6bZu3Prr7NSc5KVNuSXftDq+tBqMc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185661; c=relaxed/simple; bh=wDgsftP4Z2gjtvPtuKIKy8aJh8WgfvjpQOBfMGDJbMQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AbzOHwxZ5BnDptoANJZRZ3QscdqwCOpXsLIxsPhdWNDTtU6pz36J8/NGOgRwS474sFVF4u+PsK7mMcC6E3Ogt1ejEyiDvHxzrbg+dMSbue8MrXcSGH02MJJ03+FVCBsCyUIw5DfGy1fbqLqpA0gi+RX2U2IlzjGaj9z4KU/a8K4= 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=HcuUeKE3; arc=none smtp.client-ip=209.85.216.47 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="HcuUeKE3" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-2c96170d23eso1140091a91.0; Fri, 05 Jul 2024 06:21:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720185659; x=1720790459; 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=lYTot191GZo6DS32N1w+V73flNMPv1Itq1GPGesqtFc=; b=HcuUeKE3iSyUPkLrkx8jeKvdZeCUgO0OhWsg3R+2iHP05FxgvrZHYx83Gp37ixjNU+ i78vPhgQltQlBLgnHkya0MWzl+4yPZOEAKgB2yDVT7O9UvKew3rGEMeWrVSNGtn+6tfk 1eMud+kJcGZj2WfwwWlQGfPTeb6EvmJHqmkq0dlBJ8J73LSg8XU0ghVax1MuYlXpzi0R fnzY7BwXFIWHjARfiRFdwFPSoRyuVnwwubcyBkpR+0qrUHXeQ7cYgQCiKIbL6tyhARGo EumjWUH1Ia24RNZGps4Vg9CfU3xSk/jAQYlEsuivwJLTxjn2cAMvwuLVym2CgpxyLdgZ zqkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720185659; x=1720790459; 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=lYTot191GZo6DS32N1w+V73flNMPv1Itq1GPGesqtFc=; b=qdLl20ZwGDf6rv9vVN9ZXVbY5YZZOyl8FAhOZVUCk3SNx0JA7afDKhRwqU0HSGb8oc cmieIkMGMotsVAE8VekGdmORs9iP4MBbCCnyHW2unhtY58AHfTvPul0nOu4NPhy2inB+ fEaioO2y0PrYTM/jeoZBDHLvbS8iL39KUxEShLcfvWwv505pjL8OFG/nu83HwhQrIkFw o8MeQm7wLPJVm6wZ15r20HTlAt0cKtzhA5F/lIzGc87YcONoU//h6Z409bkWcX0qylCA 8y56OcaIeKX7R2mnsl1Hi4aJTRMb53T11wunTGEVZJwMwCEDEhy1FsS30eDmcSrgiFhg +aQQ== X-Forwarded-Encrypted: i=1; AJvYcCUxLtKHdqUtFXPCGI3raUAzjyUUzt6FwdbYA9xd4zuggY+SnIeMTighZazOJ/bal0qMoq4YTRhGJJ9FBih/QsNDsSfvFs6NnpeUElct3qPopJ4JixP2e0biy2CxH1zDMgKpuFg8RQ/KBkQNij2mAw== X-Gm-Message-State: AOJu0Yyq7ZE7XAJtCkReFQX9pt8aDa1SSvWJ/EzbRjp+Rqj9qa/XqUrm auysJQexqAy6Aplf7B8gMgMi5tQgaSB14X8xhNreHLDI6nD7zuK6 X-Google-Smtp-Source: AGHT+IFTO8gY63VFci8BKxgM5Yq5F6qZwCpz32kmO8O4wOepxy/rQZh9GzTxK1qznhBBekHEWxKCXw== X-Received: by 2002:a17:90b:193:b0:2c7:dfb6:dbe6 with SMTP id 98e67ed59e1d1-2c99c822e05mr2824515a91.45.1720185659536; Fri, 05 Jul 2024 06:20:59 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a956260sm3328974a91.19.2024.07.05.06.20.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 06:20:59 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo , Alexander Shishkin , Ingo Molnar , Mark Rutland , Peter Zijlstra Subject: [PATCH v5 4/8] perf trace: Filter enum arguments with enum names Date: Fri, 5 Jul 2024 21:20:54 +0800 Message-ID: <20240705132059.853205-5-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705132059.853205-1-howardchu95@gmail.com> References: <20240705132059.853205-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, }; Committer testing: root@x1:~# perf trace -e timer:hrtimer_start --filter=3D'mode !=3D HRTIME= R_MODE_ABS' --max-events=3D2 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff2a5050, function= : 0xffffffff9e22ddd0, expires: 241502326000000, softexpires: 24150232600000= 0, mode: HRTIMER_MODE_ABS_PINNED_HARD) 18446744073709.488 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff425050, = function: 0xffffffff9e22ddd0, expires: 241501814000000, softexpires: 241501= 814000000, mode: HRTIMER_MODE_ABS_PINNED_HARD) root@x1:~# perf trace -e timer:hrtimer_start --filter=3D'mode !=3D HRTIME= R_MODE_ABS && mode !=3D HRTIMER_MODE_ABS_PINNED_HARD' --max-events=3D2 0.000 podman/510644 timer:hrtimer_start(hrtimer: 0xffffa2024f5f7dd0,= function: 0xffffffff9e2170c0, expires: 241530497418194, softexpires: 24153= 0497368194, mode: HRTIMER_MODE_REL) 40.251 gnome-shell/2484 timer:hrtimer_start(hrtimer: 0xffff8d48bda176= 50, function: 0xffffffffc0661550, expires: 241550528619247, softexpires: 24= 1550527619247, mode: HRTIMER_MODE_REL) root@x1:~# perf trace -v -e timer:hrtimer_start --filter=3D'mode !=3D HRT= IMER_MODE_ABS && mode !=3D HRTIMER_MODE_ABS_PINNED_HARD && mode !=3D HRTIME= R_MODE_REL' --max-events=3D2 Using CPUID GenuineIntel-6-BA-3 vmlinux BTF loaded 0 0xa 0x1 New filter for timer:hrtimer_start: (mode !=3D 0 && mode !=3D 0xa && mode= !=3D 0x1) && (common_pid !=3D 524049 && common_pid !=3D 4041) mmap size 528384B ^Croot@x1:~# Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/lkml/ZnCcliuecJABD5FN@x1 Link: https://lore.kernel.org/r/20240624181345.124764-5-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- 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 sysc= all_arg_fmt *arg_fmt, stru return arg_fmt->type =3D=3D NULL ? -1 : 0; } =20 +static bool syscall_arg__strtoul_btf_enum(char *bf, size_t size, struct sy= scall_arg *arg, u64 *val) +{ + const struct btf_type *bt; + char *type =3D arg->parm; + struct btf_enum *be; + struct btf *btf; + + trace__load_vmlinux_btf(arg->trace); + + btf =3D arg->trace->btf; + if (btf =3D=3D NULL) + return false; + + if (syscall_arg_fmt__cache_btf_enum(arg->fmt, btf, type) < 0) + return false; + + bt =3D arg->fmt->type; + be =3D btf_enum(bt); + for (int 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; +} + 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 =3D 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 =20 +#define STUL_BTF_ENUM syscall_arg__strtoul_btf_enum + #define STRARRAY(name, array) \ { .scnprintf =3D SCA_STRARRAY, \ .strtoul =3D STUL_STRARRAY, \ @@ -1867,6 +1906,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); @@ -3792,7 +3832,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); @@ -3801,13 +3842,15 @@ static struct syscall_arg_fmt *evsel__find_syscall_= arg_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; } =20 -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 =3D evsel->filter, *new_filter =3D evsel->filter; =20 @@ -3840,14 +3883,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); @@ -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 =3D { - .parm =3D fmt->parm, + .trace =3D trace, + .fmt =3D fmt, }; =20 + if (fmt->is_enum) { + syscall_arg.parm =3D type; + } else { + syscall_arg.parm =3D fmt->parm; + } + if (fmt->strtoul(right, right_size, &syscall_arg, &val)) { char *n, expansion[19]; int expansion_lenght =3D scnprintf(expansion, sizeof(expansion), "%#"= PRIx64, val); --=20 2.45.2 From nobody Thu Dec 18 12:12:04 2025 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (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 DA465154456; Fri, 5 Jul 2024 13:21:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185664; cv=none; b=e226vEivsB1auaa+k0gtAi/gCLLCP3TidDxHceqgnAgSA+PQcai03L/TPPkzNeOMQcQDcrZIN/2Pi2h2j8joCjbn/CafNQ9FvpsbJ3Nw+yL5PoCN9OQNDy73dvtVP/s3HWuSlV75ke5ujhb8jbVIPqqt3GNscr/9N3juQAyWx9M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185664; c=relaxed/simple; bh=lEdgG0ZTYJexChkBRMuE04MIvYbrZH3QypaCc3wVyQY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AcjLAaqeYHUGl5SjZcf5cqyxtRASYM3XwzH6qSrKYZCCrbmNVOzix1XB8qAT+gzq1OIKRLiT/XiKkbMLiU+9s2nhtugHFlK3LS016XlCAPIg1F+AlwgHqwT9RAxyfX+RcO/cSrIMDfsAQXiTUw2SpwyjaX3sxKX3I4qVTjLV1mw= 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=XVTxqZS/; arc=none smtp.client-ip=209.85.216.43 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="XVTxqZS/" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-2c983d8bdc7so1214161a91.0; Fri, 05 Jul 2024 06:21:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720185662; x=1720790462; 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=c8OqZCgqHPZ3fH019qRYJYUerKLq5729V+3ETr9F91k=; b=XVTxqZS/C7BZtWgbOuro7Klf8bKr+vU73oOJxfXTQf1GrBCvHsTUdRxfAyMCHSfroz zMqG4YmrJmOqM3UB+3rtt4mvHx9yrI4Gq4qOOiEEYj2l/yd5a8eorOUohSBgW3o9jm0Z gXqv5NXtvENSD3tKSAUdlPCWPo7DfOd+2YnZT5y+dZhsCI4smI4CFn3lXuyN87oDY2Ts RdSGSitTOUidv6fIpbAvKybhydIN5CccPVEj73hHPen9cT+SAjvmYCnekBUSNsRHRqAO unLRlH9uwS5ppxv3wTxwXWxGRj203X7KDrfUSt3RmJzM5yiavFYK2X9Z2+caO/6v7NlY ngNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720185662; x=1720790462; 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=c8OqZCgqHPZ3fH019qRYJYUerKLq5729V+3ETr9F91k=; b=UE9RFABeNj5LcgTVJn0aaneRx4xewL+pVcbgB9yIzO3pUIL7PcYxLU8ppQX7eaXaDO LuVeFKYqrgoFQNKsw4TDX7WF09VmuIgPFtVDsljrugCaHrDoJJ/hpzzNly9nDthymKK7 0dMidfjHqF39BHi0zB3S1kMwOyQ6rjat7fMo2395mBm6VkR6bDqYX/4M47Q3c46PiuvJ ZxeRu9Jz6/NbZx56kjzSnA4zHhuYcr/fy6SJx92YhSH85JCrbXSmxIVshN+e6HHEPQDL YfQuPEbb3bhSSGOL3xuDaxIIt1gIYczw15sQU8AKeeOgkLF6wVqPRlAhQ5diI8DCohRX 0THg== X-Forwarded-Encrypted: i=1; AJvYcCUhjF75J9yBl3p67IAkj61PtVyXv/YwmrgZ1mJK0zD4k+IAfBhwK4KM4ygjljnNslFvytF+mtfPWE4iZGYEJP5BoVTMLsOUjX6aDXhbuATyZrlLIYFfVlkbJtrMJPKcIAEFsWTOceQKlLjTefYg+Q== X-Gm-Message-State: AOJu0Yw4J2UBWSaGNLe1J6ZAb4a7M3Hw/q8Zg4ATOUg1N/tZ8tTHjY6B kE4bwPSF8aj/Q1eoR/Ysab9yd82TSfchlQETEvLId/5qD65djUqcPheKVzWX X-Google-Smtp-Source: AGHT+IEQUkwiQuH7QJvMroMjpFR26sJW0bDHyitpkMpJFH0EGn+AI9nZfdyPVs64YRchH2tuAUhRgA== X-Received: by 2002:a17:90a:eac4:b0:2c8:e43b:4015 with SMTP id 98e67ed59e1d1-2c99c506536mr3651533a91.6.1720185662155; Fri, 05 Jul 2024 06:21:02 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a956260sm3328974a91.19.2024.07.05.06.20.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 06:21:01 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v5 5/8] perf test: Add landlock workload Date: Fri, 5 Jul 2024 21:20:55 +0800 Message-ID: <20240705132059.853205-6-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705132059.853205-1-howardchu95@gmail.com> References: <20240705132059.853205-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" 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, rul= e_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd8e258594, flags: 45) = =3D -1 EINVAL (Invalid argument) 0.011 ( 0.002 ms): perf/747160 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd8e2585a0, flags: 45) =3D -= 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 =3D -Wno-attributes" line to cope with those landlock struct packed structs when building on 32-bit architectures. Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu 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/CAH0uvohaypdTV6Z7O5QSK+va_qnhZ6BP6oSJ89s= 1c1E0CjgxDA@mail.gmail.com Link: https://lore.kernel.org/r/20240624181345.124764-1-howardchu95@gmail.c= om Link: https://lore.kernel.org/r/20240624181345.124764-6-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- 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-tes= t.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[] =3D { &workload__sqrtloop, &workload__brstack, &workload__datasym, + &workload__landlock, }; =20 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); =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 48bf0d3b0f3d..3fe97e68d105 100644 --- a/tools/perf/tests/workloads/Build +++ b/tools/perf/tests/workloads/Build @@ -6,8 +6,10 @@ perf-test-y +=3D leafloop.o perf-test-y +=3D sqrtloop.o perf-test-y +=3D brstack.o perf-test-y +=3D datasym.o +perf-test-y +=3D landlock.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 CFLAGS_brstack.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE CFLAGS_datasym.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE +CFLAGS_landlock.o =3D -Wno-attributes diff --git a/tools/perf/tests/workloads/landlock.c b/tools/perf/tests/workl= oads/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 +#include +#include +#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 i= nstead + * of including linux/landlock, that isn't available in older systems. + * + * We are not interested in the the result of the syscall, just in interce= pting + * 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_unu= sed) +{ + int fd =3D 11, 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); --=20 2.45.2 From nobody Thu Dec 18 12:12:04 2025 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (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 979FD155353; Fri, 5 Jul 2024 13:21:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185667; cv=none; b=p8eSatjE46EMA1XO4m+9FBUkUGxB/77gdJAs65mnigF3/LnUTSX1o2IDYAI4w0zlbBX37lDNTIpdU2j7k85ydPccwFv8sF4/MAmpAXTk258c+MgXo1noIYblOsgYvcSTfo17u88CGuuWehT6XFdgjzVaWZOq+yEUIDg95+Nx4CM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185667; c=relaxed/simple; bh=CpvgJue7O4MWaSyHmJCoq1ukXf1YzFWD1+T3USR8SlI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=c80lxDToew8Wl+E1oKmrH8YV28RWnT/VDpeHBfCfTBOezo0ZVBd8hL1Iq2x45BvEKdPkerMPhYOgXB+nBrPRGZ0kiMvtbwPQYoaCakAZocH9bPgFR7Vn9EZT1EXs+idsCeeiioWq+1TuKtVmCn3eHxqRjeVSCBe4IHRXeD9j3+s= 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=K1+OizNz; arc=none smtp.client-ip=209.85.216.51 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="K1+OizNz" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-2c97ff39453so1130011a91.0; Fri, 05 Jul 2024 06:21:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720185665; x=1720790465; 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=pDEfGupzV1QZZP9bDVKEPg1EQ2BMXRdRN/4z4Ft9J/0=; b=K1+OizNzOUqRXTYcVaY+B9bPeC9BtpWE11z+6Gn8uUU4XJentb49Egk4ICEKadslmB HSwK9q0B0ETeMh41kvoFdNMsrMyti1m//E1hn7CWb7TRwKRCkG9mZ6pOo9u+AaQBUwAU uBGOZI9QOoD8dKJmtR3rX706tQXHMhKro0qHsHtv3Ki17wFhOjF/F0Ctszj/wOP18Bm3 52D5v+nC5RWNfs29U4QxhyavegWW2JRHhSVOgr/iO04w/HfrrBCE+YenyNqMkruVkqQ5 rW3iiVEF0KSChRJxNukXj9zAFOemKS7BhLLh8muV1GbKHFyJANjYpDseU0vplG3u6YiN F+sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720185665; x=1720790465; 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=pDEfGupzV1QZZP9bDVKEPg1EQ2BMXRdRN/4z4Ft9J/0=; b=frt1C6xoGbLQBAHkhoMr/+q5wmsxG87bit6kdSwF3my+jFQ0+OcmmPS66uBGQItZ0c 0AKo0ij4ZXnHYviPv8ydgTG3IlmBbcR5DvLql1o2HjffCXkI/h9S4ts+bnDQfeWn/SYQ 9tFfeG92aLXLn3ZGX6CdduwtOt/O+pTRw77CJnhoXgSwtdjHm4bl6GrGcWsxnY5XmWkx i7AIxqkUNSxF5zq75v0l+/pDLo+5uIiZFjZEqOsniYz1VJz+0d+Asru5nBOfcE50i+sM 4p+dzguz6hbWDtWTShzU/jmhiLVk42g9Im4OFgXdVQ6iwvaEHGLdTwxSQbgTVgi79QL0 wFfA== X-Forwarded-Encrypted: i=1; AJvYcCWpltIwcFtFL1FcxA+zg+qGoJGYgj24QlNn/ginJFlmr4hIF3uH4Nqn2iGadlSygoDGFgx/llpdPc4j4sZ26/cbVsZv+FoEMgBZdfXY0SWaEvPwjB/qGmOS1J+JGgSR6VrA2RkfGI59ST2Lzi0C5Q== X-Gm-Message-State: AOJu0YzLqom37Azvn2o0ykh/cFkS2FbOiABOZEW53GtjaNVxehSwU3Tt nnRiZ4iKTU/yxQ7kp+Ji/sxV74S4r6kQwyPQS1B/fLZhJK7zyJCg X-Google-Smtp-Source: AGHT+IEPN/HG6eB9nCtBZ7y86WQQRj2QBqQqZw29SiAFMQAjveicX9k1pyHGfibhmRKVLLZznL+l0g== X-Received: by 2002:a17:90b:607:b0:2c9:6ae7:20e4 with SMTP id 98e67ed59e1d1-2c99c6d0d70mr3148009a91.45.1720185664803; Fri, 05 Jul 2024 06:21:04 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a956260sm3328974a91.19.2024.07.05.06.21.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 06:21:04 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v5 6/8] perf test trace_btf_enum: Add regression test for the BTF augmentation of enums in 'perf trace' Date: Fri, 5 Jul 2024 21:20:56 +0800 Message-ID: <20240705132059.853205-7-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705132059.853205-1-howardchu95@gmail.com> References: <20240705132059.853205-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" 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, rul= e_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd324171d4, flags: 45) = =3D -1 EINVAL (Invalid argument) 0.012 ( 0.002 ms): perf/749827 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd324171e0, flags: 45) =3D -= 1 EINVAL (Invalid argument) 457.821 ( 0.007 ms): perf/749830 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd4acd31e4, flags: 45) = =3D -1 EINVAL (Invalid argument) 457.832 ( 0.003 ms): perf/749830 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd4acd31f0, flags: 45) =3D -= 1 EINVAL (Invalid argument) 124: perf trace enum augmentation tests : Ok root@x1:~# Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu 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/20240619082042.4173621-6-howardchu95@gma= il.com Link: https://lore.kernel.org/r/20240624181345.124764-7-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- 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/sh= ell/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=3D0 +set -e + +syscall=3D"landlock_add_rule" +non_syscall=3D"timer:hrtimer_init,timer:hrtimer_start" + +TESTPROG=3D"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=3D2 + 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\) =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 --=20 2.45.2 From nobody Thu Dec 18 12:12:04 2025 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (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 2E7DD14AD02; Fri, 5 Jul 2024 13:21:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185669; cv=none; b=PFpoRv1nNuzQBS3zNE0O5nXS0TnHglXYlpjkuzNbTfe2k+lwpN4WwpVYewFmJVbDLax5P6LSDacwhXE/Wsg94K2MPv97HdK5n0YLvsnM38Lbp8v1/LpeAJKIq15AqLqbe5TwfXlqoKNC6h2CYf6OHiZE8yIcB7I0OVf4lLwM/Pc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185669; c=relaxed/simple; bh=zpCwz5WJUp6bdiwz/dL0kF9VkHkjT2zu8ODJeCDRUY4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aIvSFHS7Pakz+erpCyJNanwRxKoPqyVoanilT73LsQ/M1X6zKakHadoPNLH7s6VcWrxcDNl5wmF4aZ/ltHXrZzUcTC3a7Mg6ftHbpWaRgM6CLomPyiSFFv/M1tfnY5vGh4eX127/hgQ6Ev8UMv/NbrWui17ZB2C//OFCwAKbO3U= 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=dwWumbAH; arc=none smtp.client-ip=209.85.210.173 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="dwWumbAH" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-70af81e8439so1311380b3a.0; Fri, 05 Jul 2024 06:21:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720185667; x=1720790467; 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=76lmvuOrrkN7Lw4Dwyrz4F1r/Om3MtfOcN897FaxN6s=; b=dwWumbAHIyXCXnVSk33efi8Qd0vtaKfxLjkwu4BwZpe6b1QYd+rJDVcncmNiysDxcA lkKscxGQWjpYjhgZfVwApamksG7POb+lP4qznV8nOISstKi1dbPpi+915FFJXqU4Rupv ckoPLZvVhwAvYyOsSi6tK9HOOvhUYntTfl1POuIQlHIInDYJfq0S/wLv2MklWEdMGNWB 2pfEzk/kLtEPHheUohz23jYv1jgACOZUnWM0j5IxQBaCjRGUFBUngkTR9l0SM3GQwiRH a2rCRbJwWof7lj/0xnWi6cP/iheK6sTbtmDplr+MAmwU/kaq7JUfyMkucyDBbfjjBEL7 /sww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720185667; x=1720790467; 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=76lmvuOrrkN7Lw4Dwyrz4F1r/Om3MtfOcN897FaxN6s=; b=KEKk1tY0NHy3KRDkwnm+Ch+VVGrDOu+fsKR0EM9345CDJuPVpJQQAH7dPB8BsrHnlM oomgalMnPcZnKnkbW139hUb4atWljgV0Pq2ofEdggcHPQ6+fXYqvmwnXx/br3KWbJaDW 0UMZVip2A1nNcp65kEmHg1JCCaUAzDn+oZmtuToMEhiiQQWJFimz3RqFKEWuiWH4LSiM 9Ld51sWnjsdDoF6o0DwbaBFaAsGJY0Cno7WxmMS/GPrkknzG5CGYWM17PGQsjBabIrlj eBqtS/FY4AcJ6bL522PKokoSl9RirG5P4muKvpqm2RHJDRVLip7NG0EgGi3qEFIKST3D nCxw== X-Forwarded-Encrypted: i=1; AJvYcCWTBnYgnM9k2tNKL8bXhGOSyYtOND+OYjGBu8gDE20a8gLVPBDeXnMmPPcJLG0q9wHimWUHuwqo36ZWjDlDzYxpFHD4IMdZeR/N3gHBI0O35itrhwJJpukB62VOyYgaERY35S/KmUSM2wmAJjaZfg== X-Gm-Message-State: AOJu0YwdzPiRv9MJ3ccGSFasqQ6DQt60FEG8icJvSG8J+w1Kx7R51iHL myO84zAsEGRQVzgOxxQ0VqCVf9RjN3iz40E9GFW1J32Ad9wRJWdP X-Google-Smtp-Source: AGHT+IEB6MiJIWg/3vtnd3mzfEGIIo3aQFfdb4zuRiYUlsPJi1TzicVIl2F06wIj+9Vtq+gqplsKXA== X-Received: by 2002:a05:6a20:2d10:b0:1be:c057:ea12 with SMTP id adf61e73a8af0-1c0cc73de03mr5236512637.14.1720185667372; Fri, 05 Jul 2024 06:21:07 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a956260sm3328974a91.19.2024.07.05.06.21.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 06:21:07 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v5 7/8] perf trace: Introduce trace__btf_scnprintf() Date: Fri, 5 Jul 2024 21:20:57 +0800 Message-ID: <20240705132059.853205-8-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705132059.853205-1-howardchu95@gmail.com> References: <20240705132059.853205-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" From: Arnaldo Carvalho de Melo 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 Tested-by: Howard Chu Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/r/20240624181345.124764-8-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- 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_typ= e *type, struct btf *btf, c static size_t trace__btf_enum_scnprintf(struct trace *trace, struct syscal= l_arg_fmt *arg_fmt, char *bf, size_t size, int val, char *type) { - if (trace->btf =3D=3D NULL) - return 0; - if (syscall_arg_fmt__cache_btf_enum(arg_fmt, trace->btf, type) < 0) return 0; =20 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 =3D=3D 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, str= uct syscall_arg_fmt *arg_fmt __maybe_unused, + char *bf __maybe_unused, size_t size __maybe_unused, int val __mayb= e_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_si= ze, struct trace *trace, struct thread *thread) { - size_t printed =3D 0; + size_t printed =3D 0, btf_printed; unsigned long val; u8 bit =3D 1; struct syscall_arg arg =3D { @@ -2237,13 +2247,11 @@ static size_t syscall__scnprintf_args(struct syscal= l *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) { - size_t p =3D trace__btf_enum_scnprintf(trace, &sc->arg_fmt[arg.idx], b= f + printed, - size - printed, val, field->type); - if (p) { - printed +=3D p; - continue; - } + btf_printed =3D trace__btf_scnprintf(trace, &sc->arg_fmt[arg.idx], bf += printed, + size - printed, val, field->type); + if (btf_printed) { + printed +=3D btf_printed; + continue; } =20 printed +=3D 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 =3D sizeof(bf); struct tep_format_field *field =3D evsel->tp_format->format.fields; struct syscall_arg_fmt *arg =3D __evsel__syscall_arg_fmt(evsel); - size_t printed =3D 0; + size_t printed =3D 0, btf_printed; unsigned long val; u8 bit =3D 1; struct syscall_arg syscall_arg =3D { @@ -2942,13 +2950,10 @@ 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) { - size_t p =3D trace__btf_enum_scnprintf(trace, arg, bf + printed, - size - printed, val, field->type); - if (p) { - printed +=3D p; - continue; - } + btf_printed =3D trace__btf_scnprintf(trace, arg, bf + printed, size - pr= inted, val, field->type); + if (btf_printed) { + printed +=3D btf_printed; + continue; } =20 printed +=3D syscall_arg_fmt__scnprintf_val(arg, bf + printed, size - pr= inted, &syscall_arg, val); --=20 2.45.2 From nobody Thu Dec 18 12:12:04 2025 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (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 D129E157A5B; Fri, 5 Jul 2024 13:21:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185672; cv=none; b=GM5BC4bHMZs0i2rnGQmDjh7RvszxLJl9oewe9TCGMD+22gBhldv4dRn4xqluJtaSbs81oQdMUNEk83b+DevoG/jqmZiAmrReI1uOlHc0vpx4UyawFTzUpmBKr1+UZWZtP9Z/2hl/aInudqcXiqxf8YkOFmaoCnN0zTI3ezrSrwo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720185672; c=relaxed/simple; bh=9LVGdFIrTGDbjOh+XA8Z0YC/ZXcuGb1K9vsLn965MHI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XS2ltidt/ETtSMHXqLrZdePl+Qx0B2dNk4cWvllhVIseLWFyiWxh5h4zb2eUtTY+OLcRI+BQpoZ2aP7RPhEgbgwOw0awly4YR3lHrzARzbiRCXn8WzwVhqX+7QIFvZK8ARvhIcp24X0kv8JzdOMVeKLFVzM7R1Z0x2r8VAxlfwQ= 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=J23Xjr4v; arc=none smtp.client-ip=209.85.210.182 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="J23Xjr4v" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-70aff4e3f6dso1183941b3a.3; Fri, 05 Jul 2024 06:21:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720185670; x=1720790470; 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=jFnq702W1wouPPtmwM6wErXmz26QeU/F3Y7O+wXoTK0=; b=J23Xjr4vionLbWUTzZSQOcT3lzzROueeu7EKF++MP0/yvTobkfg6t9sD0PXJK+n7O+ YlmQvluWXUY4W5qi6LRAVWIlxXzTMrUPK3iU8EXFed6qCwAN6YU/7Vl0q8ElIlaVoIPW EZixeR5bVcrueo57dZSOUgdQ+WPSSRQgvbtXsE6YzCfBPZzk9HvTpvuVWiBNmC/IWXHf ABFvaBv7xhNcWYFjURRHMMolM8Zk4YmfmSY5rCv958JJFrZltZ4/ul/uD8h5ceLTwdQi ejx6nDqTgMrxXVn9sSf0N6IiXq5ZxGci/ugeqkV7F6eaK2i5WE0FzlSkCZ/cEuO+iz1y lGpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720185670; x=1720790470; 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=jFnq702W1wouPPtmwM6wErXmz26QeU/F3Y7O+wXoTK0=; b=UT/k3nE/FKNwaqgE4wXtpay1bunugPR3b70xRQwTNwhp7nescNmV9plrHtIic7bwxk 3Z43FCsNaagQQXKz/plExQ3mBc/fFKQcgCZIsOVWCsYVkttLdhN/dhpFqeEwqsrUlM8R NK4qeSJWkLGxAbnjugCEnzMO8QnULmhK301lLW517Tdz4nlHO8Yxxqk7yJhpkD235DXU RExVXzULFEA7hln6eF3QmUCa9SllwlYTGjAeClrK4F1FRcX56MCIc+WPPuESm1VD4eyl 4eCMRV+/wC8OTHkaDfn3MzKzjdo6WQQIuk+aNffgJR3UEmgM8h+UsZgHIVQSiHOubert M9vA== X-Forwarded-Encrypted: i=1; AJvYcCX9FLoq1K//LeoIyDkihq8NAED3MObv2l0TPmsYi/Hi3R4v7RTlwA6oL+4O/rEH0j5XNel3Jz/yfr00DiCTbhvsmFgxYP+2LJk8T8UOvYidul1oTT5omGsPMODU4kJYzG3roWY8hYR3UXtra3MA2A== X-Gm-Message-State: AOJu0YwgH4C3E8lTFBLTZnVpKQzT6oGxJZnZMjhu8ryT1Ut/Pz79Kko5 ui093aVvQiwzUV32JOqU95cQY8BfFuU5srzcYM4Vz2HrWaBuDGHXtDHvPC18 X-Google-Smtp-Source: AGHT+IHMXkERqiJ306NNH5xtSyh4oWiOkR6KYw1bp41GHQw50XGmpQtAfpX/O3XiwCh3vGitDgJybQ== X-Received: by 2002:a05:6a20:c995:b0:1bd:23c7:ebfb with SMTP id adf61e73a8af0-1c0cc8db0f4mr4769522637.62.1720185670067; Fri, 05 Jul 2024 06:21:10 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a956260sm3328974a91.19.2024.07.05.06.21.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 06:21:09 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v5 8/8] perf trace: Remove arg_fmt->is_enum, we can get that from the BTF type Date: Fri, 5 Jul 2024 21:20:58 +0800 Message-ID: <20240705132059.853205-9-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705132059.853205-1-howardchu95@gmail.com> References: <20240705132059.853205-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" From: Arnaldo Carvalho de Melo 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 Tested-by: Howard Chu Cc: Adrian Hunter Cc: Howard Chu Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/r/20240624181345.124764-9-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- 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 =20 #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_fm= t, struct btf *btf, char *type) { int id; =20 - // Already cached? - if (arg_fmt->type !=3D NULL) - return 0; - type =3D strstr(type, "enum "); if (type =3D=3D NULL) - return -1; + return; =20 type +=3D 5; // skip "enum " to get the enumeration name =20 id =3D btf__find_by_name(btf, type); if (id < 0) - return -1; + return; =20 arg_fmt->type =3D btf__type_by_id(btf, id); - return arg_fmt->type =3D=3D NULL ? -1 : 0; } =20 static bool syscall_arg__strtoul_btf_enum(char *bf, size_t size, struct sy= scall_arg *arg, u64 *val) +{ + const struct btf_type *bt =3D arg->fmt->type; + struct btf *btf =3D arg->trace->btf; + struct btf_enum *be =3D btf_enum(bt); + + for (int 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; +} + +static bool syscall_arg__strtoul_btf_type(char *bf, size_t size, struct sy= scall_arg *arg, u64 *val) { const struct btf_type *bt; - char *type =3D arg->parm; - struct btf_enum *be; + char *type =3D arg->type_name; struct btf *btf; =20 trace__load_vmlinux_btf(arg->trace); @@ -945,20 +957,19 @@ static bool syscall_arg__strtoul_btf_enum(char *bf, s= ize_t size, struct syscall_ if (btf =3D=3D NULL) return false; =20 - if (syscall_arg_fmt__cache_btf_enum(arg->fmt, btf, type) < 0) - return false; + if (arg->fmt->type =3D=3D NULL) { + // See if this is an enum + syscall_arg_fmt__cache_btf_enum(arg->fmt, btf, type); + } =20 + // Now let's see if we have a BTF type resolved bt =3D arg->fmt->type; - be =3D btf_enum(bt); - for (int 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 (bt =3D=3D NULL) + return false; =20 - if (strncmp(name, bf, max_len) =3D=3D 0) { - *val =3D 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); =20 return false; } @@ -978,23 +989,23 @@ static size_t btf_enum_scnprintf(const struct btf_typ= e *type, struct btf *btf, c return 0; } =20 -static size_t trace__btf_enum_scnprintf(struct trace *trace, struct syscal= l_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 =3D=3D NULL) return 0; =20 - if (arg_fmt->is_enum) - return trace__btf_enum_scnprintf(trace, arg_fmt, bf, size, val, type); + if (arg_fmt->type =3D=3D 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 =3D=3D NULL) + return 0; + + if (btf_is_enum(arg_fmt->type)) + return btf_enum_scnprintf(arg_fmt->type, trace->btf, bf, size, val); =20 return 0; } @@ -1007,14 +1018,14 @@ static size_t trace__btf_scnprintf(struct trace *tr= ace __maybe_unused, struct sy return 0; } =20 -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 =20 -#define STUL_BTF_ENUM syscall_arg__strtoul_btf_enum +#define STUL_BTF_TYPE syscall_arg__strtoul_btf_type =20 #define STRARRAY(name, array) \ { .scnprintf =3D SCA_STRARRAY, \ @@ -1887,7 +1898,6 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *a= rg, struct tep_format_field continue; =20 len =3D strlen(field->name); - arg->is_enum =3D false; =20 if (strcmp(field->type, "const char *") =3D=3D 0 && ((len >=3D 4 && strcmp(field->name + len - 4, "name") =3D=3D 0) || @@ -1915,8 +1925,8 @@ 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; + *use_btf =3D true; + arg->strtoul =3D STUL_BTF_TYPE; } else { const struct syscall_arg_fmt *fmt =3D syscall_arg_fmt__find_by_name(field->name); @@ -2236,10 +2246,13 @@ static size_t syscall__scnprintf_args(struct syscal= l *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 entr= y. */ 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].is_enum)) + !(sc->arg_fmt && sc->arg_fmt[arg.idx].strtoul =3D=3D STUL_BTF_TYPE)) continue; =20 printed +=3D 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 =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 && !arg->is_en= um) + if (val =3D=3D 0 && !trace->show_zeros && !arg->show_zero && arg->strtou= l !=3D STUL_BTF_TYPE) continue; =20 printed +=3D 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 =3D { .trace =3D trace, .fmt =3D fmt, + .type_name =3D type, + .parm =3D fmt->parm, }; =20 - if (fmt->is_enum) { - syscall_arg.parm =3D type; - } else { - syscall_arg.parm =3D fmt->parm; - } - if (fmt->strtoul(right, right_size, &syscall_arg, &val)) { char *n, expansion[19]; int expansion_lenght =3D scnprintf(expansion, sizeof(expansion), "%#"= PRIx64, val); diff --git a/tools/perf/trace/beauty/beauty.h b/tools/perf/trace/beauty/bea= uty.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; --=20 2.45.2