From nobody Sun Feb 8 02:41:15 2026 Received: from mail-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.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 7A9DC1AD9D9; Thu, 4 Jul 2024 12:43:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097036; cv=none; b=QnLas262N+3iwez5gV1yrMr3qdd4BjrWmu2qQd2R/5XtbCjdKy65rpp5IwA9t2tj2jw5dH5pTqS2IRAXcR7+FL6GfxU9Rgh8AP3PlYIjXyfvq3B2UlNzHnpbWmg8Boi5Do4PITCKR+qHMuEEqIqyWvvtq4vuP7ixWbwDFB9rAGw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097036; c=relaxed/simple; bh=TcMIJ/JpDkilQ3Dd6EFQj4a/Zjx58vavsGUf62pcv2A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=sTKvL2PuehBqdRxBdjil2neYZFc0jt2c/SzUxfMdcLgv3HZ4vFJtWtzrpmwK0Hsc4w8VJ9jSomuYTGhXHp8TXup2LUqSx0jXZgMKKix+nYYsTPu/Y91WNs9w9AtdfnN8LXtv/7/qGruGDpV4xIjy0mOIdIsyp5PsBDZkQttYHaE= 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=T3lytZZw; arc=none smtp.client-ip=209.85.215.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="T3lytZZw" Received: by mail-pg1-f182.google.com with SMTP id 41be03b00d2f7-656d8b346d2so342055a12.2; Thu, 04 Jul 2024 05:43:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720097034; x=1720701834; 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=fjZ5Tc84T8zrmuIv+QLMZoeIPrxCO7uOMh+7TR/hRAQ=; b=T3lytZZw9TduzqZ2bmTFWIzB/fALlsrpDQe62tSbg/pkJUatP6pb4+tRA7HzdvuF0i 6x7miIPjbL+Hq37JGp4ZfPpJ7wU9GksRPMLl5lU6wBZRMgZNn4tnfaxi9ldWQOkztnG+ VJudrzAwRjtnxycsgo6jPyXWzwdID6rEpEhHI5H0GQ27Ewgzo9K/Xw/UVb7er4FvAIcq 0LH9aZ6r7+1ddvNM55aYpLpQW+6IkcG8fi6f83FWyiZ1I8UZt6phqHEh+g0EU3DaqVxX YP851X6opELrsx86mxboQUvbSScArrygRcJLz5t5gZVtF9wm+HhZWmdywZaeUnetZ5kV wIQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720097034; x=1720701834; 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=fjZ5Tc84T8zrmuIv+QLMZoeIPrxCO7uOMh+7TR/hRAQ=; b=SFKejb+y2HdIEsSkTkEUr2FXgVssoOLFuku0bTMueDcRW6SOI95DoCt6sRgF5oKAhe g/Gph3M/CSatwNAkZSKZn4HyfRCxSTpTqSi5/XiSNIhmpQouE1dERO9wAYMrrx/pF84s 1QeztY1SSMIEdpoQZ5yDA3tpgklF38C1w5edlommkqz2UJl22/gG7VlhGurW979Qiob+ UoYPh3CvUcmHhJkcl3QD3SZOgWdssTdnvCKeyUOxbIja5JuC8qql6hn2wjJX3ycofklv DXbqEKkARaPRP0XLvin909s8onOZV6yFyEH7RlI3QIuNBf25MXPa/y/n/HsMyKy6NViY j5Uw== X-Forwarded-Encrypted: i=1; AJvYcCWFhfrCK4mRr2sAihMaMONJPOD4B9yGlAVKnksGpbmMKW4xmo9fX4NQVqHs0AYCg42DCOIZvu2jw/tCcEWVeJuFvcmxveOf7QqmhSHqFqlHtwWUCCgSCoLLIUSnjpBLJoMacxGdodVEbl2zz6JoDQ== X-Gm-Message-State: AOJu0YzsrlvN4dbsf+7c0+zUgMBZJwgjTKOKivB2hatK5Lk69tuI++y1 F35ATSrT376Cpm7GEQAtjSthdRsuLhOWn6ujlbUkk+wA78GYXxp4 X-Google-Smtp-Source: AGHT+IHLVo+ZErpdJM4ep4tZQ1/IIU7cGYXLkQ4xUFbdXcfJFJZSPAeeaLf9W7dSLtWEnkMnVDBb/g== X-Received: by 2002:a05:6a21:6d9d:b0:1bd:91aa:79a6 with SMTP id adf61e73a8af0-1c0cc727deemr1581273637.9.1720097033520; Thu, 04 Jul 2024 05:43:53 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fac1598d35sm121578245ad.285.2024.07.04.05.43.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jul 2024 05:43:53 -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 v4 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries Date: Thu, 4 Jul 2024 20:43:47 +0800 Message-ID: <20240704124354.904540-2-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240704124354.904540-1-howardchu95@gmail.com> References: <20240704124354.904540-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This is a bug found when implementing pretty-printing for the landlock_add_rule system call, I decided to send this patch separately because this is a serious bug that should be fixed fast. I wrote a test program to do landlock_add_rule syscall in a loop, yet perf trace -e landlock_add_rule freezes, giving no output. This bug is introduced by the false understanding of the variable "key" below: ``` for (key =3D 0; key < trace->sctbl->syscalls.nr_entries; ++key) { struct syscall *sc =3D trace__syscall_info(trace, NULL, key); ... } ``` The code above seems right at the beginning, but when looking at syscalltbl.c, I found these lines: ``` for (i =3D 0; i <=3D syscalltbl_native_max_id; ++i) if (syscalltbl_native[i]) ++nr_entries; entries =3D tbl->syscalls.entries =3D malloc(sizeof(struct syscall) * nr_en= tries); ... for (i =3D 0, j =3D 0; i <=3D syscalltbl_native_max_id; ++i) { if (syscalltbl_native[i]) { entries[j].name =3D syscalltbl_native[i]; entries[j].id =3D i; ++j; } } ``` meaning the key is merely an index to traverse the syscall table, instead of the actual syscall id for this particular syscall. So if one uses key to do trace__syscall_info(trace, NULL, key), because key only goes up to trace->sctbl->syscalls.nr_entries, for example, on my X86_64 machine, this number is 373, it will end up neglecting all the rest of the syscall, in my case, everything after `rseq`, because the traversal will stop at 373, and `rseq` is the last syscall whose id is lower than 373 in tools/perf/arch/x86/include/generated/asm/syscalls_64.c: ``` ... [334] =3D "rseq", [424] =3D "pidfd_send_signal", ... ``` The reason why the key is scrambled but perf trace works well is that key is used in trace__syscall_info(trace, NULL, key) to do trace->syscalls.table[id], this makes sure that the struct syscall returned actually has an id the same value as key, making the later bpf_prog matching all correct. After fixing this bug, I can do perf trace on 38 more syscalls, and because more syscalls are visible, we get 8 more syscalls that can be augmented. before: perf $ perf trace -vv --max-events=3D1 |& grep Reusing Reusing "open" BPF sys_enter augmenter for "stat" Reusing "open" BPF sys_enter augmenter for "lstat" Reusing "open" BPF sys_enter augmenter for "access" Reusing "connect" BPF sys_enter augmenter for "accept" Reusing "sendto" BPF sys_enter augmenter for "recvfrom" Reusing "connect" BPF sys_enter augmenter for "bind" Reusing "connect" BPF sys_enter augmenter for "getsockname" Reusing "connect" BPF sys_enter augmenter for "getpeername" Reusing "open" BPF sys_enter augmenter for "execve" Reusing "open" BPF sys_enter augmenter for "truncate" Reusing "open" BPF sys_enter augmenter for "chdir" Reusing "open" BPF sys_enter augmenter for "mkdir" Reusing "open" BPF sys_enter augmenter for "rmdir" Reusing "open" BPF sys_enter augmenter for "creat" Reusing "open" BPF sys_enter augmenter for "link" Reusing "open" BPF sys_enter augmenter for "unlink" Reusing "open" BPF sys_enter augmenter for "symlink" Reusing "open" BPF sys_enter augmenter for "readlink" Reusing "open" BPF sys_enter augmenter for "chmod" Reusing "open" BPF sys_enter augmenter for "chown" Reusing "open" BPF sys_enter augmenter for "lchown" Reusing "open" BPF sys_enter augmenter for "mknod" Reusing "open" BPF sys_enter augmenter for "statfs" Reusing "open" BPF sys_enter augmenter for "pivot_root" Reusing "open" BPF sys_enter augmenter for "chroot" Reusing "open" BPF sys_enter augmenter for "acct" Reusing "open" BPF sys_enter augmenter for "swapon" Reusing "open" BPF sys_enter augmenter for "swapoff" Reusing "open" BPF sys_enter augmenter for "delete_module" Reusing "open" BPF sys_enter augmenter for "setxattr" Reusing "open" BPF sys_enter augmenter for "lsetxattr" Reusing "openat" BPF sys_enter augmenter for "fsetxattr" Reusing "open" BPF sys_enter augmenter for "getxattr" Reusing "open" BPF sys_enter augmenter for "lgetxattr" Reusing "openat" BPF sys_enter augmenter for "fgetxattr" Reusing "open" BPF sys_enter augmenter for "listxattr" Reusing "open" BPF sys_enter augmenter for "llistxattr" Reusing "open" BPF sys_enter augmenter for "removexattr" Reusing "open" BPF sys_enter augmenter for "lremovexattr" Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr" Reusing "open" BPF sys_enter augmenter for "mq_open" Reusing "open" BPF sys_enter augmenter for "mq_unlink" Reusing "fsetxattr" BPF sys_enter augmenter for "add_key" Reusing "fremovexattr" BPF sys_enter augmenter for "request_key" Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch" Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat" Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat" Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat" Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat" Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "linkat" Reusing "open" BPF sys_enter augmenter for "symlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat" Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat" Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat" Reusing "connect" BPF sys_enter augmenter for "accept4" Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at" Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2" Reusing "open" BPF sys_enter augmenter for "memfd_create" Reusing "fremovexattr" BPF sys_enter augmenter for "execveat" Reusing "fremovexattr" BPF sys_enter augmenter for "statx" after perf $ perf trace -vv --max-events=3D1 |& grep Reusing Reusing "open" BPF sys_enter augmenter for "stat" Reusing "open" BPF sys_enter augmenter for "lstat" Reusing "open" BPF sys_enter augmenter for "access" Reusing "connect" BPF sys_enter augmenter for "accept" Reusing "sendto" BPF sys_enter augmenter for "recvfrom" Reusing "connect" BPF sys_enter augmenter for "bind" Reusing "connect" BPF sys_enter augmenter for "getsockname" Reusing "connect" BPF sys_enter augmenter for "getpeername" Reusing "open" BPF sys_enter augmenter for "execve" Reusing "open" BPF sys_enter augmenter for "truncate" Reusing "open" BPF sys_enter augmenter for "chdir" Reusing "open" BPF sys_enter augmenter for "mkdir" Reusing "open" BPF sys_enter augmenter for "rmdir" Reusing "open" BPF sys_enter augmenter for "creat" Reusing "open" BPF sys_enter augmenter for "link" Reusing "open" BPF sys_enter augmenter for "unlink" Reusing "open" BPF sys_enter augmenter for "symlink" Reusing "open" BPF sys_enter augmenter for "readlink" Reusing "open" BPF sys_enter augmenter for "chmod" Reusing "open" BPF sys_enter augmenter for "chown" Reusing "open" BPF sys_enter augmenter for "lchown" Reusing "open" BPF sys_enter augmenter for "mknod" Reusing "open" BPF sys_enter augmenter for "statfs" Reusing "open" BPF sys_enter augmenter for "pivot_root" Reusing "open" BPF sys_enter augmenter for "chroot" Reusing "open" BPF sys_enter augmenter for "acct" Reusing "open" BPF sys_enter augmenter for "swapon" Reusing "open" BPF sys_enter augmenter for "swapoff" Reusing "open" BPF sys_enter augmenter for "delete_module" Reusing "open" BPF sys_enter augmenter for "setxattr" Reusing "open" BPF sys_enter augmenter for "lsetxattr" Reusing "openat" BPF sys_enter augmenter for "fsetxattr" Reusing "open" BPF sys_enter augmenter for "getxattr" Reusing "open" BPF sys_enter augmenter for "lgetxattr" Reusing "openat" BPF sys_enter augmenter for "fgetxattr" Reusing "open" BPF sys_enter augmenter for "listxattr" Reusing "open" BPF sys_enter augmenter for "llistxattr" Reusing "open" BPF sys_enter augmenter for "removexattr" Reusing "open" BPF sys_enter augmenter for "lremovexattr" Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr" Reusing "open" BPF sys_enter augmenter for "mq_open" Reusing "open" BPF sys_enter augmenter for "mq_unlink" Reusing "fsetxattr" BPF sys_enter augmenter for "add_key" Reusing "fremovexattr" BPF sys_enter augmenter for "request_key" Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch" Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat" Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat" Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat" Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat" Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "linkat" Reusing "open" BPF sys_enter augmenter for "symlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat" Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat" Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat" Reusing "connect" BPF sys_enter augmenter for "accept4" Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at" Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2" Reusing "open" BPF sys_enter augmenter for "memfd_create" Reusing "fremovexattr" BPF sys_enter augmenter for "execveat" Reusing "fremovexattr" BPF sys_enter augmenter for "statx" TL;DR: These are the new syscalls that can be augmented Reusing "openat" BPF sys_enter augmenter for "open_tree" Reusing "openat" BPF sys_enter augmenter for "openat2" Reusing "openat" BPF sys_enter augmenter for "mount_setattr" Reusing "openat" BPF sys_enter augmenter for "move_mount" Reusing "open" BPF sys_enter augmenter for "fsopen" Reusing "openat" BPF sys_enter augmenter for "fspick" Reusing "openat" BPF sys_enter augmenter for "faccessat2" Reusing "openat" BPF sys_enter augmenter for "fchmodat2" as for the perf trace output: before perf $ perf trace -e faccessat2 --max-events=3D1 [no output] after perf $ ./perf trace -e faccessat2 --max-events=3D1 0.000 ( 0.037 ms): waybar/958 faccessat2(dfd: 40, filename: "uevent") = =3D 0 P.S. The reason why this bug was not found in the past five years is probably because it only happens to the newer syscalls whose id is greater, for instance, faccessat2 of id 439, which not a lot of people care about when using perf trace. Commiter notes: That and the fact that the BPF code was hidden before having to use -e, that got changed kinda recently when we switched to using BPF skels for augmenting syscalls in 'perf trace': =E2=AC=A2[acme@toolbox perf-tools-next]$ git log --oneline tools/perf/util/= bpf_skel/augmented_raw_syscalls.bpf.c a9f4c6c999008c92 perf trace: Collect sys_nanosleep first argument 29d16de26df17e94 perf augmented_raw_syscalls.bpf: Move 'struct timespec64' = to vmlinux.h 5069211e2f0b47e7 perf trace: Use the right bpf_probe_read(_str) variant for= reading user data 33b725ce7b988756 perf trace: Avoid compile error wrt redefining bool 7d9642311b6d9d31 perf bpf augmented_raw_syscalls: Add an assert to make sur= e sizeof(augmented_arg->value) is a power of two. 262b54b6c9396823 perf bpf augmented_raw_syscalls: Add an assert to make sur= e sizeof(saddr) is a power of two. 1836480429d173c0 perf bpf_skel augmented_raw_syscalls: Cap the socklen para= meter using &=3D sizeof(saddr) cd2cece61ac5f900 perf trace: Tidy comments related to BPF + syscall augment= ation 5e6da6be3082f77b perf trace: Migrate BPF augmentation to use a skeleton =E2=AC=A2[acme@toolbox perf-tools-next]$ =E2=AC=A2[acme@toolbox perf-tools-next]$ git show --oneline --pretty=3Drefe= rence 5e6da6be3082f77b | head -1 5e6da6be3082f77b (perf trace: Migrate BPF augmentation to use a skeleton, 2= 023-08-10) =E2=AC=A2[acme@toolbox perf-tools-next]$ I.e. from August, 2023. One had as well to ask for BUILD_BPF_SKEL=3D1, which now is default if all it needs is available on the system. I simplified the code to not expose the 'struct syscall' outside of tools/perf/util/syscalltbl.c, instead providing a function to go from the index to the syscall id: int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx); Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/lkml/ZmhlAxbVcAKoPTg8@x1 Signed-off-by: Howard Chu --- tools/perf/builtin-trace.c | 14 +++++++------- tools/perf/util/syscalltbl.c | 7 +++++++ tools/perf/util/syscalltbl.h | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 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 Sun Feb 8 02:41:15 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.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 B62491AE852; Thu, 4 Jul 2024 12:44:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097042; cv=none; b=qB1K9xgfKp2IdrBT1RF6CxGvFOnVyv9z+Px8eAX7NAeREZI0iId75+dThUEjfVEsnPMxGzq8oYZetSNUwOY3MHpj8jpmbhP8f8awsmh8WNNaxG5uY9GUVOGoRg0ZnNYto8bVCMvhRkCacs0oL7Z3UPGaY5dHODWXXb+VHWeURwk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097042; c=relaxed/simple; bh=WCRQ+kbFo75jDsVNUBclxxnQ3Q3U422ghye2DTytOYw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rwW/9trqDvVpZnZEqUAbUParvU4jeDAbH8cLA7gzeOiEa4VzTjJYrkqxxyLPegtCSCXVzir5OCaSOTP2G37kqXqLPjPN1SY9/rXsKRd/6Qsbhs7MAkjJU5b6uvtiS7k/8HO4dhCCG81y1Gk1/v6HSV8Bt0EZdEVynj+PlKqOHEE= 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=DcAni+uH; arc=none smtp.client-ip=209.85.214.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="DcAni+uH" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-1f9ffd24262so3575625ad.0; Thu, 04 Jul 2024 05:44:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720097040; x=1720701840; 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=vHqZd9kKJjuZwsVZWyop0eexJ6PnUtjpwAFHznRXJBI=; b=DcAni+uHQLGXRv9+l+w3JLd5mfOLV78t+vf1JYvbNHmuRzdTMUqLrg2SgUD4ab/iIN h+W80ICMO3Zcr/W1WhX1pGxukGv9ImSFlMrhzjFt/2Kd9xCXxehxz+n3mjNpTEPhnnML PXzfIehtVv5KyC9f4tRpfqRPyYmCYcrrWto84hth3rKL8p5WSsCTxp6JxyCLsluqCwEi Q/yKyyCiaxioNE+JLVYzTaw9GIVfGDVFihXqJ6AFMpuBZffjCoWOeVIoawmRYD8rFFxB 42BX/CbVlp4wufkecRRdgGYSLNRt0vvkh7Mz2cJghIP4VVUVTHi1l01NJxvknWVw93zd m5fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720097040; x=1720701840; 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=vHqZd9kKJjuZwsVZWyop0eexJ6PnUtjpwAFHznRXJBI=; b=O7YDuJr0KE5Qi0SyRCrmT1MffyPzpDw37gJtnPaLmH+3cMe3lC7EEk8NwQrECsHtCi uKnOmBj2E6PtM497eT2bjUPGBoyLKq1bD1pv2Wz85rxMzwR74qo7U3HyDf/7C19A98x5 VSHrBj+091KqBqMhBgU1zLV6np1zqs8J7F77qUveK8uh01GwJDyrcYipH0qVnw7ZtMLN rGVlpfU3X1z9OlR5AJW6PPZDtas9kM4Ub7azkezEy1ghKVVzrgI77IDo+H1NmyYclMFm 8UhbbNT9q1b+ZpYuHIuI8RbzQ71oQ7QAquHuw91+ZXijMLJFnqyuR7bq2gYPLd1P715K mi2g== X-Forwarded-Encrypted: i=1; AJvYcCWJDPfm5dyC3k6/jcMuHBCyfrmT0UJ/RyO1cVadz2kNbwZRpxC1ogCDvXMDUGMCrKqUq6qEPLbgqJHudnZBkrq0rAm/Drx7sxbAbKt6rOqyJsT3eWMCSg41F90qR8k1e3wseg5gqed1niiF0ieOOw== X-Gm-Message-State: AOJu0Yz68sXgHDcjQK+hiYrsgo+XPiN3vJNTRjRpfqmPUYBuRJ8Zh8Mf 73UhJkEuLjXELnPwkrLd2pplgGYt7vh1PDQJFsGIwB+drO8oXmUx X-Google-Smtp-Source: AGHT+IFj7Au9dEFXmQ0VP8LKs1SDTksXBOBDOUR6tcTsDEDC4GlqWO2djKu6utYfqnjS0d47Gsu+Hg== X-Received: by 2002:a17:902:b182:b0:1fa:2ae7:cc5c with SMTP id d9443c01a7336-1fb33ef8fd5mr8458965ad.46.1720097039920; Thu, 04 Jul 2024 05:43:59 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fac1598d35sm121578245ad.285.2024.07.04.05.43.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jul 2024 05:43: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 , =?UTF-8?q?G=C3=BCnther=20Noack?= , Ingo Molnar , Mark Rutland , =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Peter Zijlstra Subject: [PATCH v4 2/8] perf trace: BTF-based enum pretty printing for syscall args Date: Thu, 4 Jul 2024 20:43:48 +0800 Message-ID: <20240704124354.904540-3-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240704124354.904540-1-howardchu95@gmail.com> References: <20240704124354.904540-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] Signed-off-by: Arnaldo Carvalho de Melo --- 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 Sun Feb 8 02:41:15 2026 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7AC311AE86C; Thu, 4 Jul 2024 12:44:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097048; cv=none; b=tFniedYTVHW+54MAyrFKQFVT4JdMTVnY5JCq+rhlevNFuPrjjcHdBpREzlEHr7WpNpwHo3tG950jjZpsOklnI6sJ5m5EL7p/X8FlidmufKPS5KAMSlGyXbTp0lZpU/zTn8qTZhei2mGA9kzTy4gXAsiC2iP60Migzqb5auI4lfc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097048; c=relaxed/simple; bh=1IoeeiKDQn4cIh5wAhNK2A9yVDhqBbOIWz+VT/VgCiA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=go07rnGa2opyWtO/Dcpx+MqHkS2+3hFL2x6dyp1NXIQU697RcoIHOMB2mT5uuCHj+7T3wDfNMA3jN2xn8hAXxaYPt6gmEjaItm4+nBV/R+aLnTXw4Rn96OkIPsO1Jk4srOFprxuq0HxZYtwhTRq6xDvphiULgAY5BpAWcksdvEw= 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=i5ox4Axu; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="i5ox4Axu" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-1fb3cf78fcaso2055845ad.1; Thu, 04 Jul 2024 05:44:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720097046; x=1720701846; 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=TwThFutnJmHGHzUHIb+ig5KtDU/wrUyzzPYUrLoH27E=; b=i5ox4AxuBE216HoNiQvBG4QK8LJgR/xc51G59LqGfdGVEOFtKFN6fV0hqPV0VmVUYw xqV+6SIVfY6tD8dIqQxqgxirsW9w/dWH/8qxxER7cldmyVYanXONDlW98u7Y6N/s0g0m ntdTTLi9rBN+DebvADxaX/Pj1WeWkV/fS5x/LZvbufVVB7laZ50Rs3aelnvWKYzhK+/e fWvOlnByyJ8FtVVw+xkEx6pCN0jV+3+Nl0z7dR4H6mLsiLG0G+OrmNDyADK+23MJT6WV 1f1PivvdcdM2m0fPgs2a5GHO5FIkmgdxbH/ukqsHReOEIoXCHzFTx0X0fsmQ3PeV9d/0 qVgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720097046; x=1720701846; 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=TwThFutnJmHGHzUHIb+ig5KtDU/wrUyzzPYUrLoH27E=; b=tU5l2z0rqYMPsVEmJR56U01iho/75pkjnfBCWpS19SwbiVBSdh+QjCk6NJ8vvcS541 lMpcO/QvTWKPq/ev0fISa7NVhvc2YwofBrK1TMmIxGvNE49Pww8aTyj8iPbg5o62NcPV MbaPwg2vZzDBpjskp+b4/YmkdN1/t2VWx0Eayh0iRVfXipSvQUTJF6qbXk5pnqdxrGNg 8HQPyBX1X+TaS0RFMP2lJec+qX7sBqrah3cRqS9aaIW6t8nrANwxu+uvZh6M1E6Bbp8R Exg9oxBHatCYEUjqVKjZlGV+CRI3eNcBZplbOT8UXxrNPzRR413Xxz86FLA9FWPJmqc0 ceaw== X-Forwarded-Encrypted: i=1; AJvYcCWUHunE4I7ZP/105Cqg+cH4PwpvI7cxqQRF/wAzwQKc5R+ksj781/ZzrzRF+g7OsVCKIy+P4dl/mpRdrrRjSLmEjDN+4/aLzutEp82HAyEkuw0bXVbQrgWJSk3Z/K/KN++wT4ScVhf6Wxzu37pdvA== X-Gm-Message-State: AOJu0Yym3K6YyeZ+m3bXRrj+MTi3PmwUrKVrXNoGs7Gxd2fcJ9ArQzKE H5y0OW5NcbjXeyXDcAXiVWqFP+krL4u2gifLH8jGtUQuJNUXQf9c X-Google-Smtp-Source: AGHT+IGCj5WT6hpJwbRAgG+ZoC/jZ6t5VubcKLYGS0+nBOM4pwyEDVfujhAdymmNJwuFo3b1B0gbXA== X-Received: by 2002:a17:902:c114:b0:1fa:18c3:2791 with SMTP id d9443c01a7336-1fb33e7be44mr10028505ad.36.1720097045668; Thu, 04 Jul 2024 05:44:05 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fac1598d35sm121578245ad.285.2024.07.04.05.44.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jul 2024 05:44:05 -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 v4 3/8] perf trace: Augment non-syscall tracepoints with enum arguments with BTF Date: Thu, 4 Jul 2024 20:43:49 +0800 Message-ID: <20240704124354.904540-4-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240704124354.904540-1-howardchu95@gmail.com> References: <20240704124354.904540-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 Signed-off-by: Arnaldo Carvalho de Melo --- 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 Sun Feb 8 02:41:15 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.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 465601AED3F; Thu, 4 Jul 2024 12:44:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097053; cv=none; b=EE2laUurUw5JQAZN1Q5T0UdUyFkUYKtTRnIEdqrT+SEKDCCN9Rz2idiny7u3Sv3YV7qgxoLdZwvfSMCmvILqEyRvNnb5pUn9ch+uznG06ulNI6uexDPz0+EPbLeG4dj9fZpJRFzBE4l5yRf1P8wKYoH1cYnKn90wZ3Ofw/S9t98= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097053; c=relaxed/simple; bh=4YPmeJoGk2QQ4wLKLW9HnU3sm7ynzcDOGhauwdU+ECI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aXAMD5Fs24o+FCYsCevodRHRNXfwbiFjR6UDZzPCSZIumf8Yzx1aOvDxSrqoojDPRL3TwGMYi9/mAgxVQvSh6rdpgUEMcsVdkZCy/prItsEe2zRDsxA+uQCC5UchgGA6aGFyzztE5CrHJ0JsuV8dF1RiT88B6hDfQGJSR3N1E3U= 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=e41dnANJ; arc=none smtp.client-ip=209.85.214.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="e41dnANJ" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-1fb3b7d0d3aso1988045ad.2; Thu, 04 Jul 2024 05:44:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720097051; x=1720701851; 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=MJI0qVtInmsKoLtDiaHowoxEiB2tmAZi3VAbs2ioBHw=; b=e41dnANJBC00o9JHWFHOxT2UHFs2h/IdCbF4Gymy4pdhVP/Gk/6kO9RmdHNXQuYv/G VmEzsBOyQ9VpuAdF/TWSzJS/YcJa+IXOnWqGksBWO1tDrR+kyI1rl602ruo2zp1m0/hJ oqYYKbOqp46L9A5Ve20F6qDLs0+X5uyYR6W9eCvcgLLb0bT5V8xjTryFT3RiKtNn1Bkw xVND3wyPheoezZxUSPrCmgImfTHNZUlmeCO4jI8NhfB4wkYqdVoiZxnqxlz9JaGDoGVD /JMA0QXb0PRqxodnYO6rqp2kSPEKd2OYKIjyDO5+ttHhVajBgtsBMlNC2hmPUVGrOSQo zxnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720097051; x=1720701851; 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=MJI0qVtInmsKoLtDiaHowoxEiB2tmAZi3VAbs2ioBHw=; b=llwNnYpNFt43+G9KfLGvEDOMLEDwwCcwFksavPMXgxZcE2xRK+OR/oQH1DCvs4DHmW 0JWh4jIUua9/jAeRlnqxj2q4n7w6/odMMELrwDFpMEK847D46/UbvAleb85TpA0Z3F19 SvSVY4ovLG1wHZyOZyJ6etyLdfz1SQbGJPcGwOioDT8ax3x+5gybwHNNgY08RekLiMJi RR1erQVf+Bj25IXOAKI0pnhMqbjGIuzUYfWufmcrFndMQhBdCjEazH3q9GPOS/jRTt9F dFhW6wvB/4sDZ/TTyEFyvAAnEy5hx/MVafouoXAPl4LRCg2fo6eU44T6omBPvPek72WF VVcQ== X-Forwarded-Encrypted: i=1; AJvYcCV2lMPYOMO/QZfD1bIZwwUO3iwlFEy+fzEXylNcIAkDFT/GfdPGgV1gMewH61kxG/Gttqcu2iFGIDhHc5LJ3zp7sQPl85367BmHs9Wnp36too7EyqWG+s13ANI+P2md7G+WHLtr5RkB6CbMUTOyzQ== X-Gm-Message-State: AOJu0YwTXoV814Z1nSyj81039wWOXMqzTLUuu+0ZE0ajFnokBgYNfSa6 GpBW6NnmAN+oi3fmGqa+6YpzyFEOzkXpVM90splOrjIB6JwhnoEU X-Google-Smtp-Source: AGHT+IHU//+Danqa9EO0CddAyA52y1U1HgbG6X/MbbExFTWJGDBIvdpcOcpilGYcXOwHbFRVXwJ3Rw== X-Received: by 2002:a17:902:f682:b0:1f9:c8cc:9df4 with SMTP id d9443c01a7336-1fb33ecc816mr13126555ad.45.1720097051306; Thu, 04 Jul 2024 05:44:11 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fac1598d35sm121578245ad.285.2024.07.04.05.44.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jul 2024 05:44:11 -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 v4 4/8] perf trace: Filter enum arguments with enum names Date: Thu, 4 Jul 2024 20:43:50 +0800 Message-ID: <20240704124354.904540-5-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240704124354.904540-1-howardchu95@gmail.com> References: <20240704124354.904540-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 Signed-off-by: Arnaldo Carvalho de Melo --- 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 Sun Feb 8 02:41:15 2026 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 E1D8D1AED57; Thu, 4 Jul 2024 12:44:16 +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=1720097058; cv=none; b=BpocZ7BQYmEkXtDvHos2cwVGyFqwGPWING8C3khXcKDMozoqXUV+IElokjO8ixYHd/PCLqMkgrnJOHU41gP/wab48BxyS+h9X1NRTqKH5bWjr9bJWCrAdoJiCyl8HXvM9fgpJysRp9vc4A5XEhte1PNkVXsUicn3b9iiDtL894g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097058; c=relaxed/simple; bh=GYaWPgJnVdGEdrYxINBzc2b+yUlQf/YFbIz/YORO0bI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ret6jGdwjzmiylzzL2KTzNHvdgl6ZRIOsMIGZaCbgceZwbwuiWTOIDgiILWYSRFgBLn2GLqI1931emNJ/C+9YAnWT1dXJuhXTeZlqk+U+LAO2FLzaNiJ0ZVP1arZautr64a9fTQOvP46qQqWT/GqZ2fF15Nv5d1xY/1vvzEd3Uw= 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=d122Y4kg; 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="d122Y4kg" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-706627ff48dso397051b3a.1; Thu, 04 Jul 2024 05:44:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720097056; x=1720701856; 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=COoMomlM0SOTNQJK5GTR3BCGqXeYbavr39Ox6xrITDg=; b=d122Y4kg8gGyr2GmRYO25sS714brc202+IdD6ZdgDAGgfHdc4BASo0jdfTB4rCOSJt sASBiJvAbaVGeEOamH+EFi/yaJmxLKlX4BOf+w+hR4NTJljzRKmKXl2MLdUMqgvYQGJw aohkUi48cRbo+gagbhlfXeyPuXe0YhPu4bxzR4/PYKkgoi2aT3lOKU1hnMf2Iz25laZI ReHFRvqPhKS91kV4vIUOEiX2r/E5S0M5AP556hOKf2S9iL1bzq4S0Xvt2jYzXLuAh5Ac w4G1RJEpxsR2HIIUx61Bu6XRwztSAtLqy3jGFqg6KAKuGFeto52O35FbuS5642pUYrjP Q0MA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720097056; x=1720701856; 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=COoMomlM0SOTNQJK5GTR3BCGqXeYbavr39Ox6xrITDg=; b=mmaxJbtZmgbg627kzatfmVfE2pPv+hxmhIvA51Uu5XBBMAmFNC176yALa7m8FiW0k1 g7RdLdfirvx8U8yYXAFO29OI1n1RkMIpwZbUCjxjJqI+RCDn3frlDNXGGp2AqWRDh4gN EE+w7voT+PqsRsVe7npWkoKnMyf+7bA90NO6BmueVamRGLC9gSR9wCqRMjfx/aM2fmnd SmzNlIRvBsCLZGR4i+755Kt0rTagwpTzpfz61DFZnuRcwVaIOMxwjE8FiTRDRlP4Gvr4 3yGD3cVteXnStMhGiryf45i/ss8IxdixOnh/kfNeNZCoDyKMVGnY8/+jCkaOcQVLdSbT 0pkg== X-Forwarded-Encrypted: i=1; AJvYcCWlnb6XxgNcESpo7grm1bBMULeDL/uGDGrFtf1tGmDLOszyF1YrRUvoracccjQSUrzoASOlXtN0waeVCHOhuZrJ+2PJUS40pGOpEvlXwqUf95kE8it/VsRCDX/6CgXWlybbXCjwG1YmRILYMntfOA== X-Gm-Message-State: AOJu0YyrfsruQ6MzoiSftYts4wVPdlemtcYq0HSHLSu+NNBUvHg9xNgs HrkNCoyp7FWRTiX+RahA3yACbzCFt+wJsYUkBbl47n6l8GsJ6RMfPGEATF7BP+Q= X-Google-Smtp-Source: AGHT+IFQKgu+wE8acHvTPhfDz1Xb562Yu0edit1U29RFHANHUK9OrNBXiWreTsVbs9cHTDSLSZW3UQ== X-Received: by 2002:a05:6a20:6a0d:b0:1bd:2215:923e with SMTP id adf61e73a8af0-1c0cc758353mr1673327637.4.1720097056057; Thu, 04 Jul 2024 05:44:16 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fac1598d35sm121578245ad.285.2024.07.04.05.44.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jul 2024 05:44:15 -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, kernel test robot , Arnaldo Carvalho de Melo Subject: [PATCH v4 5/8] perf test: Add landlock workload Date: Thu, 4 Jul 2024 20:43:51 +0800 Message-ID: <20240704124354.904540-6-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240704124354.904540-1-howardchu95@gmail.com> References: <20240704124354.904540-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 Link1 below) to shorten then name of the workload from 'landlock_add_rule' to 'landlock', and I moved it to a separate patch. Howard fixed the build error found by Namhyung (see Link2 below), changing the landlock.h header to the one in source tree, and including syscall.h for the '__NR_landlock_add_rule' syscall number. However, there is another problem. Because of this line in Makefile.config: INC_FLAGS +=3D -I$(srctree)/tools/arch/$(SRCARCH)/include/uapi , we'll include 'tools/arch/x86/include/uapi/asm/unistd_64.h' in the source tree. But what we want is '/usr/include/asm/unistd_64.h'. This hardcoded unistd_64.h in the source tree is not cool for the landlock workload because it is a simplified list of syscall numbers for particular use cases, we need to discard this search path if we want the __NR_landlock_add_rule macro. To solve this problem, Howard added a CFLAGS_REMOVE_landlock.o to remove the flag of -I$(srctree)/tools/arch/$(SRCARCH)/include/uapi. The problem above will not occur in some arch, say arm64 and riscv because they include asm-generic/unistd.h instead. The arch that it really affects is the ones that include asm/unistd_32.h and asm/unistd_64.h. linux $ find . -regex './arch/.*/include/uapi/asm/unistd.h' | xargs grep -H= --color=3Dauto 'include ./arch/x86/include/uapi/asm/unistd.h:# include ./arch/x86/include/uapi/asm/unistd.h:# include ./arch/parisc/include/uapi/asm/unistd.h:#include ./arch/parisc/include/uapi/asm/unistd.h:#include ./arch/nios2/include/uapi/asm/unistd.h:#include ./arch/mips/include/uapi/asm/unistd.h:#include ./arch/mips/include/uapi/asm/unistd.h:#include ./arch/mips/include/uapi/asm/unistd.h:#include ./arch/mips/include/uapi/asm/unistd.h:#include ./arch/s390/include/uapi/asm/unistd.h:#include ./arch/s390/include/uapi/asm/unistd.h:#include ./arch/arm64/include/uapi/asm/unistd.h:#include ./arch/riscv/include/uapi/asm/unistd.h:#include ./arch/sparc/include/uapi/asm/unistd.h:#include ./arch/sparc/include/uapi/asm/unistd.h:#include ./arch/xtensa/include/uapi/asm/unistd.h:#include ./arch/hexagon/include/uapi/asm/unistd.h:#include ./arch/openrisc/include/uapi/asm/unistd.h:#include ./arch/arm/include/uapi/asm/unistd.h:#include ./arch/arm/include/uapi/asm/unistd.h:#include ./arch/alpha/include/uapi/asm/unistd.h:#include ./arch/sh/include/uapi/asm/unistd.h:#include ./arch/m68k/include/uapi/asm/unistd.h:#include ./arch/microblaze/include/uapi/asm/unistd.h:#include ./arch/arc/include/uapi/asm/unistd.h:#include ./arch/powerpc/include/uapi/asm/unistd.h:#include ./arch/powerpc/include/uapi/asm/unistd.h:#include ./arch/csky/include/uapi/asm/unistd.h:#include ./arch/loongarch/include/uapi/asm/unistd.h:#include Reported-by: Namhyung Kim Reported-by: kernel test robot Closes: https://lore.kernel.org/r/202406250302.E4WaX9Ud-lkp@intel.com/ Closes: https://lore.kernel.org/linux-perf-users/Zn8TfuQi0iq7bMVD@google.co= m/ 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 Link1: https://lore.kernel.org/lkml/CAH0uvohaypdTV6Z7O5QSK+va_qnhZ6BP6oSJ89= s1c1E0CjgxDA@mail.gmail.com Link2: https://lore.kernel.org/linux-perf-users/Zn8TfuQi0iq7bMVD@google.com/ Signed-off-by: Arnaldo Carvalho de Melo --- 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 | 38 +++++++++++++++++++++++++++ 4 files changed, 42 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..e132d5d95983 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_REMOVE_landlock.o =3D -I$(srctree)/tools/arch/$(SRCARCH)/include/u= api diff --git a/tools/perf/tests/workloads/landlock.c b/tools/perf/tests/workl= oads/landlock.c new file mode 100644 index 000000000000..c4f29b17f2a7 --- /dev/null +++ b/tools/perf/tests/workloads/landlock.c @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include // for __NR_landlock_add_rule +#include +#include +#include "../tests.h" +#ifdef __NR_landlock_add_rule +#include "../../../../include/uapi/linux/landlock.h" +#endif + +/* This workload is used only to test enum augmentation with BTF in perf t= race */ +static int landlock(int argc __maybe_unused, const char **argv __maybe_unu= sed) +{ +#if defined(__NR_landlock_add_rule) && defined(HAVE_LIBBPF_SUPPORT) + 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; +#else + return 2; +#endif +} + +DEFINE_WORKLOAD(landlock); --=20 2.45.2 From nobody Sun Feb 8 02:41:15 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.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 4FA641AEFD5; Thu, 4 Jul 2024 12:44:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097062; cv=none; b=cxBDx14DwZE/ib6BcBnsIeTPmHGmy6MPHGThADB7NMchfGm9Rf2vMlRHBBhhGvSwet6xkzqRgyYON9F4kcFqfKlZz28U4rJ6GxxYNF+agby6gXwMyzYxmbspAdwWnDRKV/r4DFztU93RKdkeOlh0KJ/SrSuDIONOaXQEC7HFDyE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097062; c=relaxed/simple; bh=BEB58jmhgFBt8hBVpkDwswlsxmcPeMe5P4dNnOzglMw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SsKnAnorCf6KLAppRmdpDa1nXABA9q18VrsZS+tbYZBsoQKwE8mVa99mrfln9yA4DjGmvSlJJ653xNAuEHQp/VYsj+4gT+FBHSJvpX//8jn63N+IybVLPBbOTKCvN+pQwxEvv5UtcqQcEYlELOjBVF1o1bC/TJdynpYRfuhKrVo= 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=mUSTUsL2; arc=none smtp.client-ip=209.85.214.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="mUSTUsL2" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-1f9de13d6baso3819645ad.2; Thu, 04 Jul 2024 05:44:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720097060; x=1720701860; 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=lkbwA9Ypz3p6Kbh2EzTzzipYEVc7UpegE9m4rYBdh/I=; b=mUSTUsL2n+dkpkl9y9siNDqx8tNTh9avlz//NXmBPu37J/4A+WIPmYIkkBA/3LXn8G uAuR/hrFCMhqSo7HEh5/gUxnC1VCzaGkvNhnLqqEIDbWmw3SxDP6roa7/1TrcYru2Ia9 Kew9cuoTPwoAuQOoW4vyCNPDGGxIxljcaxulH9v+7OdxuCzcdx75DtqnGVSWLVxNlsPO hCxwthOqholaPZ+CxBKwvdjxZyynpHQxGLPYbSCyt0d972OwN9ypfUfIfNx8H4LMAJC0 oPSiEiTztGlNxFKxPEeRGLCbA3RXuM/XfPK5EJg1D/tQ5NH0bPepsCQkQ0ZpOk/dxxaS eZKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720097060; x=1720701860; 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=lkbwA9Ypz3p6Kbh2EzTzzipYEVc7UpegE9m4rYBdh/I=; b=PPI4ZrkjsjhN4GokWZ3j0jCJaODWfpxVi5uOMSaxrxoriCIJCKaz34oQ7GiEpZH7f1 TkB3VbSUJNjOIQAnQlqnZCt7kjk6BXfEHc6XNxlbYapuNLPhlR6sAVQAdbfDrJLKcPia vsH59xRHz4riFJJGDNdJUwimWGCtn8ZuE7nHRrq4oRibBiNpS5tVQnz3F9GcknEZZIhj HZOFj88EW5NbU2MielzDiLg0pofegHolp7gHTavhBPGgXk2GX24Vh2iXfLJJqPaC2NVv HxM7RTzFC8r1R64a1ONc44Wo0Sl/M9xVhgbfJnVCjXZr91XySvJM1b21uLWssAb1s/cD 2HXQ== X-Forwarded-Encrypted: i=1; AJvYcCXTgKSKYL1zn9far2r1924+cLul/B1Ii6HmXuMNC7drC37ZFdDr1s3lvp4jHvoVAGFIs5gOI+qINaRoHGTsScBT0STnpd0TM74wXbregrS2lvV1qQyAjsGrR/EzfparnDqL5upCyiVZ8PurXu6lhw== X-Gm-Message-State: AOJu0Ywi7OZtNdx+UbdwABNg9xN8Mx/8uk3aABRj5wb8FA1/y7kQh2Xy 7FZpGKLNh2jx1kxHO+kSNLZNc1i7PJGTHSTV3rHK6MPFxi4gOb5O X-Google-Smtp-Source: AGHT+IH/CsRGzP6TacQehRyuxdkQycNMahPZJQy11YgaD0BoOj5GL/uSUKVi5Ji5WIZ7GtgRR7UDhA== X-Received: by 2002:a17:902:d2c8:b0:1f9:c1f0:7150 with SMTP id d9443c01a7336-1fb33df5a3dmr11130625ad.8.1720097060430; Thu, 04 Jul 2024 05:44:20 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fac1598d35sm121578245ad.285.2024.07.04.05.44.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jul 2024 05:44:20 -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 v4 6/8] perf test trace_btf_enum: Add regression test for the BTF augmentation of enums in 'perf trace' Date: Thu, 4 Jul 2024 20:43:52 +0800 Message-ID: <20240704124354.904540-7-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240704124354.904540-1-howardchu95@gmail.com> References: <20240704124354.904540-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 Signed-off-by: Arnaldo Carvalho de Melo --- 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 Sun Feb 8 02:41:15 2026 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) (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 A1C391AED27; Thu, 4 Jul 2024 12:44:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097068; cv=none; b=Gm/s7kCcfjZAL0s9D3SR37CZkcCnrMnSbntvR4FQIhw6/CwOEnFDecQWKwQgnfikQ+CxrLLe+t+aShHeHxkAdfYMmMwhJkq4oCotsFWynGenMnPc5KN9tkg4uhj5mv+Mg2jy+TwScstLqGbmqzjvuHBmXZhhtARQGgeC8OJw03o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097068; c=relaxed/simple; bh=/EDhtoZGuMjUrPv+ooBwV8B0wduikxo/o9z3vV4TzHs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SK0CNSOytjfonWWxM0F+2UymNLHtypmuxL1gtM0rUZd0PG0FoG9107+/9f20Yvud0KbylgKdm57ns8ZsqzVVFWY+fJSXrGfbpfy/rPj9PZo8j/EqbS2dhntP4Nxw2m/g2nMUoEm4inblk8y5/lqR9k6XS7ubOZqSh/CdH1sdd74= 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=P+EYktf/; arc=none smtp.client-ip=209.85.215.180 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="P+EYktf/" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-71871d5e087so363863a12.1; Thu, 04 Jul 2024 05:44:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720097065; x=1720701865; 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=TLeFXsSxx3g+J1fD+mwT7HmIZf3vVjDYwcLJ5dlu1g4=; b=P+EYktf/dAA/KsRstci9D8Pk1jM6+tzWNEUNmqaxjFE3WL3kDsZ3WnTgE2WG/LRJzG uZfcjnqExOT8dYH3WdoqYLADVEXg/chvJPp2Ak6ZbyLQzTN9bUIJBdQf2PSKb2vwH5iT yL8pco1JlsjgSlxTqpuD6DeIFIrr3mdUyYNRm0MU3A/ofYpByn0KcMbcjG6J1b86Vn+9 f7L8IfdY3C/I8bIIdvXHb5KAY2EZMjYHVbByviMde3e3xT9MlEpw4tlvmRfyfYjQ5Bzm U/miNPLUkuVKjQ67zHaZF1fs42aPoe89NeSdA79TfRShSoHVeL4ZsBOuKbthwz3bdKKc dyqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720097065; x=1720701865; 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=TLeFXsSxx3g+J1fD+mwT7HmIZf3vVjDYwcLJ5dlu1g4=; b=SQf5CZg1eXGLfquZDCrst9zs92WJvW3CylRXanIjxYku2/YMscg5/IJHopET4r1RX2 qdptN/YAA56AeivQcFQqedsN3VtdEYe6SDz7mLO4JwRWpGhwZshy99CV3MthGqrucp47 LsiQoNS3Paw83D30IJOknbVhQcdm78Vv1gmgF8tSn+Vto8WDEuDhca3i7m7VL1QghfCR QhdEF1bifqQQuMPzn8H4p1e1OyDDIbF18+R2jFv8hLtKp/5NtXiM78BxLwJD/0ZYy7HT v6T4Ts890GDqWCGhdpogIZXwTTicXU19vUcJ2pFYKGeQMeMDZrp1yzeqmDVNNVBoL80F Q1/Q== X-Forwarded-Encrypted: i=1; AJvYcCW+rcIidPJQm0bEK44A3udR3B7J5sfiUNbOI66f12DQ/ZjsBAu+yq3sRDUwyD4Nbh2hACXtXgON1tCdUJgbeigdy4siiXRaQZrLRUE9ytsoJLzPzyDvaIX8MEtoI4xV0Bl2724xzyXAF90op4lw3w== X-Gm-Message-State: AOJu0YwXwoP349NwFu55Fc3mFeEngHpKZbCRvHPb0QCTeA1bEgh1IGl9 9HQda1UBOfIkhH/vk3R3fMo/9tZK7zo/+a7bGDAmMaNN4r9ggdq2 X-Google-Smtp-Source: AGHT+IF1wQK+EIYXuJjTq6zI2ckz5T4RsUsZRVQG8MhPcu8EHiz3RNjJnmIeWWDdnuLtvz4+KK5Bow== X-Received: by 2002:a05:6a20:9189:b0:1be:4c54:b891 with SMTP id adf61e73a8af0-1c0cc8ba7d8mr1327606637.47.1720097064869; Thu, 04 Jul 2024 05:44:24 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fac1598d35sm121578245ad.285.2024.07.04.05.44.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jul 2024 05:44:24 -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 v4 7/8] perf trace: Introduce trace__btf_scnprintf() Date: Thu, 4 Jul 2024 20:43:53 +0800 Message-ID: <20240704124354.904540-8-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240704124354.904540-1-howardchu95@gmail.com> References: <20240704124354.904540-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. Tested-by: Howard Chu Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu --- 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 Sun Feb 8 02:41:15 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 58E111B0111; Thu, 4 Jul 2024 12:44:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097071; cv=none; b=Qv1JkIcFL4D2GtHY4VJI7agq2puLykV48qaxajTlmJsEIEzYWnysAKHTx/y7yvoscFZE047I7vM+XxubqQKppxcjQjVeEyTCRSGNODtP4mak15QtkjgxxOStLdEsexq6AHG+MOT/UH1EO4hl1tqiCE6Sqq75uGo6/dMHni4gFaQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720097071; c=relaxed/simple; bh=nNpo0ZuXzYf3+WtjOjL0cQD9p4VX8Z4rtX7xIBWGZnA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=c10dmNxXxHYh7rj7QITOFcC+ziJiL7s0XQZwjY2wHHKStZG6edEogYt5KbsKaUGEAwSm0SB1YgCJ3+67wSqE98/8jjc5n/Nt7HGvIMUJLd2TZFsQkphGmHA38bF8H4+SbPxFiYEzmYeybMCI1dKB3VrnTcie7u7QRw7lYPxUirE= 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=htB/cbBj; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="htB/cbBj" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-1fa3bdd91c1so3788055ad.2; Thu, 04 Jul 2024 05:44:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720097070; x=1720701870; 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=dOZZRsIMsFCEeUFHxyJsA3wcVIrREBOvAUEAQZ8gA8w=; b=htB/cbBjgpOdESnDp9Fkqr/CaXdoX6Z7S4b7R/7a9j5jeQ8PAs1hn6mkrbSc6Ijr8M 0BxRNKWjdOajjKVyZ/THys7QDcn/wsjwJ0ZZh51JEA7hywPVswjFOSoYLwWZl40BQ/1t 4uNFQ3BN9AXgo56LCTKtf1QMP3mmrSV/ILP9nlXQeuDN7XmuX+bKZvqZfE4A+HrKt+4P c8P/JFdkgQMAwgdUPlxGfHsD8HFxnXAtg8hpfG8Y2tuOUokvhgnOYFqf0dfpr3lVyklJ TRItiBORI0ysaD3/+CYNs09PxbFHi2KJUrk0/cnrHKBp9s+kZoceaUjKF/Lqm4zL3wfT c/Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720097070; x=1720701870; 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=dOZZRsIMsFCEeUFHxyJsA3wcVIrREBOvAUEAQZ8gA8w=; b=XzBIDuqzOHE8q0Y9uzD4iJ7r1fJT/OmL6ciCVxAS8GUpUu93eBcLAb266ngoWRNJkG i/VjXxeZpojP1N6ar0Dz3URK3+7rr0mAVWE580fID46AfgLN9W/28AuR+vTT42+3TW/Y 7tziAoYVBn4Lv08KsxUpenY6f9FpQQX/u4zP+R8Jqf3076JbXJpXjUcferulpt0ClN6s 9oJFBXvgi26WURgE1/cUxgVbLbapZOZIQIeFW2VTHYK5hqF6BdTiOWmAGc7jF2w6Rd73 I7BpikpvnoebxYgTXkT4ExHBk2YrqIm/udYSgzS90RJhuNliKK6FSLWo5KC5YWt1sXSC qQpA== X-Forwarded-Encrypted: i=1; AJvYcCWOENkYMCOD1NdZXSWWTYjhPkSQUS0o1hTBvVsp4F1qPeD763BlgDfUdHCunEZMZpefn9cJ71OUBaJq7P1U51IBVlKAzumg9WVSCfltls2Jh11gZdUvy9UPqFyM6T3vg7xZfpWxqWwB0yrYi40d1A== X-Gm-Message-State: AOJu0YxYiDcuK6dfn1GsALrIUnoArcZoIg9KDImHwL39RSGgM4/Zq6Hv 9w8vUzh290hB5jJMv219lG6IIOvBADaf40e+ZSI5lN3YDS4QIt0d X-Google-Smtp-Source: AGHT+IEREQa3V1TZYqMuGAY3TF8kKhDOTUkaY1pjSYNzaZUov6MNMKlJxwunKwFWZ7sRkP3iD/g/xA== X-Received: by 2002:a17:902:d2d1:b0:1f9:d6cc:e504 with SMTP id d9443c01a7336-1fb33e1890fmr16190015ad.24.1720097069478; Thu, 04 Jul 2024 05:44:29 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fac1598d35sm121578245ad.285.2024.07.04.05.44.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jul 2024 05:44:29 -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 v4 8/8] perf trace: Remove arg_fmt->is_enum, we can get that from the BTF type Date: Thu, 4 Jul 2024 20:43:54 +0800 Message-ID: <20240704124354.904540-9-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240704124354.904540-1-howardchu95@gmail.com> References: <20240704124354.904540-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:~# Tested-by: Howard Chu Cc: Adrian Hunter Cc: Howard Chu Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu --- 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