From nobody Sun Feb 8 19:03:42 2026 Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) (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 766C7147C7D; Fri, 5 Jul 2024 09:42:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172576; cv=none; b=PxOKOgKi0682G2dGTDAzP1GQYrb66moE90cCaWd2Q9cIlDIMJoMzz0Ef7/tIlZUaiE57q1yisX7jwM2jUo2gYykg1Z6bwYOLvBzf1DOuia1QzfZLMbG3512IxFb9ALfm320iOdlR9+SZHjD+kK29jOUj/0tmBPm2ESgUZTspwq0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172576; c=relaxed/simple; bh=sHaxqYXHG2HLaIB+D8RhPhiyDt9yrXC/8xpBdkP4nLQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FFBXxdVNw0JpcQF+nLjLSpw1gTsp9DEYx6knVSwY6elooB7mqV44UuvM/0Cpj/too35bUQC5+iybFEOeq6qlnbyT8GKhdStWeiwnKguUaVYloPCR53f8mqNFW+1wSTWLziLgUbCSgYIbEnlcERvwbn/oh8ZE2k5f+I8MB6NC7Uk= 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=gbPRWCY2; arc=none smtp.client-ip=209.85.216.52 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="gbPRWCY2" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-2c97aceb6e4so934453a91.2; Fri, 05 Jul 2024 02:42:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720172574; x=1720777374; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EdV0v22yUm/xQxD/kVPFe9jly3facK8iEM4rioFXbJA=; b=gbPRWCY2iXx+T8uA37bXmaiQ3t5RktvNqwOZHCcQjvmRetIHMeEehDxCFX4uEmSjM4 yKLEZLBv0fQxU4Z7OU8rfYxwwGx4ltErQQbBxrKUBKkWgznHWp0lIuXGBJGB1QIkzcK0 bEsUKvwksYQhfcUMrLOwI9uZUArfb2eJrxllyBdGL7MawlC7KmTzx/3+mverh8pe7QeW W/s/w0qnf7L3A3PBXHcr1dFbjqypK7nn8Q5S/39qELL/BS8xeD4t8Mut5sfZQbYTMvoB SsAW9+5bDzfuMYFlYaxy35N7mO2+H1VKmj0A2/a/gqetbSwV3gSw+oW/q3qj+iXgWEqX +N7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720172574; x=1720777374; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EdV0v22yUm/xQxD/kVPFe9jly3facK8iEM4rioFXbJA=; b=qBZB1fV1/TdFHm8VcMpRRXiCDGHwXeM209+JwblkuFsK8rkhk3JBfNHBUH6QIlBngR dBVIxH/pijQdOfD10nGuzwnt4GZjF9YTBCrirHCcVX6/NXROpKmrCOEdwGCj4yQdTFY6 8TaSdcnLvHkALhRYzE5uM66Ey837hswjDGj1vmT/vbjQ1SsyHldK6Dg/yRu8JYXFwA1m B4nhnyF0JQHZ7CFPp/5L602V5BSUVmSGWyIP7JWxcpMpAS1x40Z9PTSMlYx5BvcZjsUx F4WNGViwLEq+jClan3giHMlrNNWqom3YiL04mkBa4XTQZJG1fe4MFG+1QmAqc+FT8xeL RzHQ== X-Forwarded-Encrypted: i=1; AJvYcCVOKuN5my4NbbBnTc3sZWly/8VhUEfhXfYOdyKv5Tu6RNTleVyZrjtN9SU5x+eW1GjQWM9QmXkl6Nt8A0qsh4QAtlsbS8Uxpf8Vrx4tr2zVHCTDwWVii8EyU2ILqSwxWrnOaeCXmotzpFidHpWqwg== X-Gm-Message-State: AOJu0Yz/jCuoNjFVKFbVwm4qZHXS3jD+X3DENShPnKQuL96WmkBA8CaC wv1Zq/ZOxx/y0wsf/UIDbjGsDU+P8KDuCH1VWiQTNkyv+Tqh5JQtrZLlarvN X-Google-Smtp-Source: AGHT+IGcTfXHlURhPpD1tFf/w+MMxdNwqGlhPEfG3A95Q4KKyf+snBGp5goq0oXChyIw1CLN2Bkhvg== X-Received: by 2002:a17:90a:da02:b0:2c9:9f2a:2b20 with SMTP id 98e67ed59e1d1-2c99f2a2ca4mr3043919a91.22.1720172573747; Fri, 05 Jul 2024 02:42:53 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a9cd133sm2958138a91.38.2024.07.05.02.42.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 02:42: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 v5 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries Date: Fri, 5 Jul 2024 17:42:53 +0800 Message-ID: <20240705094300.585156-2-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705094300.585156-1-howardchu95@gmail.com> References: <20240705094300.585156-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This is a bug found when implementing pretty-printing for the landlock_add_rule system call, I decided to send this patch separately because this is a serious bug that should be fixed fast. I wrote a test program to do landlock_add_rule syscall in a loop, yet perf trace -e landlock_add_rule freezes, giving no output. This bug is introduced by the false understanding of the variable "key" below: ``` for (key =3D 0; key < trace->sctbl->syscalls.nr_entries; ++key) { struct syscall *sc =3D trace__syscall_info(trace, NULL, key); ... } ``` The code above seems right at the beginning, but when looking at syscalltbl.c, I found these lines: ``` for (i =3D 0; i <=3D syscalltbl_native_max_id; ++i) if (syscalltbl_native[i]) ++nr_entries; entries =3D tbl->syscalls.entries =3D malloc(sizeof(struct syscall) * nr_en= tries); ... for (i =3D 0, j =3D 0; i <=3D syscalltbl_native_max_id; ++i) { if (syscalltbl_native[i]) { entries[j].name =3D syscalltbl_native[i]; entries[j].id =3D i; ++j; } } ``` meaning the key is merely an index to traverse the syscall table, instead of the actual syscall id for this particular syscall. So if one uses key to do trace__syscall_info(trace, NULL, key), because key only goes up to trace->sctbl->syscalls.nr_entries, for example, on my X86_64 machine, this number is 373, it will end up neglecting all the rest of the syscall, in my case, everything after `rseq`, because the traversal will stop at 373, and `rseq` is the last syscall whose id is lower than 373 in tools/perf/arch/x86/include/generated/asm/syscalls_64.c: ``` ... [334] =3D "rseq", [424] =3D "pidfd_send_signal", ... ``` The reason why the key is scrambled but perf trace works well is that key is used in trace__syscall_info(trace, NULL, key) to do trace->syscalls.table[id], this makes sure that the struct syscall returned actually has an id the same value as key, making the later bpf_prog matching all correct. After fixing this bug, I can do perf trace on 38 more syscalls, and because more syscalls are visible, we get 8 more syscalls that can be augmented. before: perf $ perf trace -vv --max-events=3D1 |& grep Reusing Reusing "open" BPF sys_enter augmenter for "stat" Reusing "open" BPF sys_enter augmenter for "lstat" Reusing "open" BPF sys_enter augmenter for "access" Reusing "connect" BPF sys_enter augmenter for "accept" Reusing "sendto" BPF sys_enter augmenter for "recvfrom" Reusing "connect" BPF sys_enter augmenter for "bind" Reusing "connect" BPF sys_enter augmenter for "getsockname" Reusing "connect" BPF sys_enter augmenter for "getpeername" Reusing "open" BPF sys_enter augmenter for "execve" Reusing "open" BPF sys_enter augmenter for "truncate" Reusing "open" BPF sys_enter augmenter for "chdir" Reusing "open" BPF sys_enter augmenter for "mkdir" Reusing "open" BPF sys_enter augmenter for "rmdir" Reusing "open" BPF sys_enter augmenter for "creat" Reusing "open" BPF sys_enter augmenter for "link" Reusing "open" BPF sys_enter augmenter for "unlink" Reusing "open" BPF sys_enter augmenter for "symlink" Reusing "open" BPF sys_enter augmenter for "readlink" Reusing "open" BPF sys_enter augmenter for "chmod" Reusing "open" BPF sys_enter augmenter for "chown" Reusing "open" BPF sys_enter augmenter for "lchown" Reusing "open" BPF sys_enter augmenter for "mknod" Reusing "open" BPF sys_enter augmenter for "statfs" Reusing "open" BPF sys_enter augmenter for "pivot_root" Reusing "open" BPF sys_enter augmenter for "chroot" Reusing "open" BPF sys_enter augmenter for "acct" Reusing "open" BPF sys_enter augmenter for "swapon" Reusing "open" BPF sys_enter augmenter for "swapoff" Reusing "open" BPF sys_enter augmenter for "delete_module" Reusing "open" BPF sys_enter augmenter for "setxattr" Reusing "open" BPF sys_enter augmenter for "lsetxattr" Reusing "openat" BPF sys_enter augmenter for "fsetxattr" Reusing "open" BPF sys_enter augmenter for "getxattr" Reusing "open" BPF sys_enter augmenter for "lgetxattr" Reusing "openat" BPF sys_enter augmenter for "fgetxattr" Reusing "open" BPF sys_enter augmenter for "listxattr" Reusing "open" BPF sys_enter augmenter for "llistxattr" Reusing "open" BPF sys_enter augmenter for "removexattr" Reusing "open" BPF sys_enter augmenter for "lremovexattr" Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr" Reusing "open" BPF sys_enter augmenter for "mq_open" Reusing "open" BPF sys_enter augmenter for "mq_unlink" Reusing "fsetxattr" BPF sys_enter augmenter for "add_key" Reusing "fremovexattr" BPF sys_enter augmenter for "request_key" Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch" Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat" Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat" Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat" Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat" Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "linkat" Reusing "open" BPF sys_enter augmenter for "symlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat" Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat" Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat" Reusing "connect" BPF sys_enter augmenter for "accept4" Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at" Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2" Reusing "open" BPF sys_enter augmenter for "memfd_create" Reusing "fremovexattr" BPF sys_enter augmenter for "execveat" Reusing "fremovexattr" BPF sys_enter augmenter for "statx" after perf $ perf trace -vv --max-events=3D1 |& grep Reusing Reusing "open" BPF sys_enter augmenter for "stat" Reusing "open" BPF sys_enter augmenter for "lstat" Reusing "open" BPF sys_enter augmenter for "access" Reusing "connect" BPF sys_enter augmenter for "accept" Reusing "sendto" BPF sys_enter augmenter for "recvfrom" Reusing "connect" BPF sys_enter augmenter for "bind" Reusing "connect" BPF sys_enter augmenter for "getsockname" Reusing "connect" BPF sys_enter augmenter for "getpeername" Reusing "open" BPF sys_enter augmenter for "execve" Reusing "open" BPF sys_enter augmenter for "truncate" Reusing "open" BPF sys_enter augmenter for "chdir" Reusing "open" BPF sys_enter augmenter for "mkdir" Reusing "open" BPF sys_enter augmenter for "rmdir" Reusing "open" BPF sys_enter augmenter for "creat" Reusing "open" BPF sys_enter augmenter for "link" Reusing "open" BPF sys_enter augmenter for "unlink" Reusing "open" BPF sys_enter augmenter for "symlink" Reusing "open" BPF sys_enter augmenter for "readlink" Reusing "open" BPF sys_enter augmenter for "chmod" Reusing "open" BPF sys_enter augmenter for "chown" Reusing "open" BPF sys_enter augmenter for "lchown" Reusing "open" BPF sys_enter augmenter for "mknod" Reusing "open" BPF sys_enter augmenter for "statfs" Reusing "open" BPF sys_enter augmenter for "pivot_root" Reusing "open" BPF sys_enter augmenter for "chroot" Reusing "open" BPF sys_enter augmenter for "acct" Reusing "open" BPF sys_enter augmenter for "swapon" Reusing "open" BPF sys_enter augmenter for "swapoff" Reusing "open" BPF sys_enter augmenter for "delete_module" Reusing "open" BPF sys_enter augmenter for "setxattr" Reusing "open" BPF sys_enter augmenter for "lsetxattr" Reusing "openat" BPF sys_enter augmenter for "fsetxattr" Reusing "open" BPF sys_enter augmenter for "getxattr" Reusing "open" BPF sys_enter augmenter for "lgetxattr" Reusing "openat" BPF sys_enter augmenter for "fgetxattr" Reusing "open" BPF sys_enter augmenter for "listxattr" Reusing "open" BPF sys_enter augmenter for "llistxattr" Reusing "open" BPF sys_enter augmenter for "removexattr" Reusing "open" BPF sys_enter augmenter for "lremovexattr" Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr" Reusing "open" BPF sys_enter augmenter for "mq_open" Reusing "open" BPF sys_enter augmenter for "mq_unlink" Reusing "fsetxattr" BPF sys_enter augmenter for "add_key" Reusing "fremovexattr" BPF sys_enter augmenter for "request_key" Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch" Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat" Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat" Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat" Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat" Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "linkat" Reusing "open" BPF sys_enter augmenter for "symlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat" Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat" Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat" Reusing "connect" BPF sys_enter augmenter for "accept4" Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at" Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2" Reusing "open" BPF sys_enter augmenter for "memfd_create" Reusing "fremovexattr" BPF sys_enter augmenter for "execveat" Reusing "fremovexattr" BPF sys_enter augmenter for "statx" TL;DR: These are the new syscalls that can be augmented Reusing "openat" BPF sys_enter augmenter for "open_tree" Reusing "openat" BPF sys_enter augmenter for "openat2" Reusing "openat" BPF sys_enter augmenter for "mount_setattr" Reusing "openat" BPF sys_enter augmenter for "move_mount" Reusing "open" BPF sys_enter augmenter for "fsopen" Reusing "openat" BPF sys_enter augmenter for "fspick" Reusing "openat" BPF sys_enter augmenter for "faccessat2" Reusing "openat" BPF sys_enter augmenter for "fchmodat2" as for the perf trace output: before perf $ perf trace -e faccessat2 --max-events=3D1 [no output] after perf $ ./perf trace -e faccessat2 --max-events=3D1 0.000 ( 0.037 ms): waybar/958 faccessat2(dfd: 40, filename: "uevent") = =3D 0 P.S. The reason why this bug was not found in the past five years is probably because it only happens to the newer syscalls whose id is greater, for instance, faccessat2 of id 439, which not a lot of people care about when using perf trace. Commiter notes: That and the fact that the BPF code was hidden before having to use -e, that got changed kinda recently when we switched to using BPF skels for augmenting syscalls in 'perf trace': =E2=AC=A2[acme@toolbox perf-tools-next]$ git log --oneline tools/perf/util/= bpf_skel/augmented_raw_syscalls.bpf.c a9f4c6c999008c92 perf trace: Collect sys_nanosleep first argument 29d16de26df17e94 perf augmented_raw_syscalls.bpf: Move 'struct timespec64' = to vmlinux.h 5069211e2f0b47e7 perf trace: Use the right bpf_probe_read(_str) variant for= reading user data 33b725ce7b988756 perf trace: Avoid compile error wrt redefining bool 7d9642311b6d9d31 perf bpf augmented_raw_syscalls: Add an assert to make sur= e sizeof(augmented_arg->value) is a power of two. 262b54b6c9396823 perf bpf augmented_raw_syscalls: Add an assert to make sur= e sizeof(saddr) is a power of two. 1836480429d173c0 perf bpf_skel augmented_raw_syscalls: Cap the socklen para= meter using &=3D sizeof(saddr) cd2cece61ac5f900 perf trace: Tidy comments related to BPF + syscall augment= ation 5e6da6be3082f77b perf trace: Migrate BPF augmentation to use a skeleton =E2=AC=A2[acme@toolbox perf-tools-next]$ =E2=AC=A2[acme@toolbox perf-tools-next]$ git show --oneline --pretty=3Drefe= rence 5e6da6be3082f77b | head -1 5e6da6be3082f77b (perf trace: Migrate BPF augmentation to use a skeleton, 2= 023-08-10) =E2=AC=A2[acme@toolbox perf-tools-next]$ I.e. from August, 2023. One had as well to ask for BUILD_BPF_SKEL=3D1, which now is default if all it needs is available on the system. I simplified the code to not expose the 'struct syscall' outside of tools/perf/util/syscalltbl.c, instead providing a function to go from the index to the syscall id: int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx); Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/lkml/ZmhlAxbVcAKoPTg8@x1 Link: https://lore.kernel.org/r/20240624181345.124764-2-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo --- 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 19:03:42 2026 Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8EEBB1474B7; Fri, 5 Jul 2024 09:43:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172582; cv=none; b=mxAiA0xKQKX+wKKB4Xq4+4fs/r59SbcOOVgjryGBmVB6EmUYR2v8n0IlyRIDi6I7b/+QgXuFCJb7ZeLHHwTCcKrSjWpirRriVdqS+qzZBCH0aPaZcLA+G2NXFMRTp2l9qXoWlPBQJbdwpjZ1LwGAUp/MjiH/tchiVODFe3XEKZE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172582; c=relaxed/simple; bh=SIR9uo5jBHA4ojUDJSYvUwgfou2A3ePKJvZDSyXEPWk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qZRKkb0e3lbh/bARvHFQsI+fuzHHpP05k6q0xY7Lx9l9AAqq2gosZdky2NR8nMs7G9YIw/PwmgSphtFEAjvkybmduYorNHHI79EfvKNgD1ALXGgtPvPFAWBdYVnnUQo+edHuEJIhOX7llqWBE+q7slHJj1jBehcPLeAphFoAAN0= 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=FL6k8Xhn; arc=none smtp.client-ip=209.85.216.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FL6k8Xhn" Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-2c96f037145so1062502a91.3; Fri, 05 Jul 2024 02:43:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720172580; x=1720777380; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZXuX9LroFfrWSjjWC3sm96qQ6X5CtfodhnxL67G+Hzk=; b=FL6k8XhnuIlsaT6XE2tdxHNA1proQ07hJHJcapMU2DPsbaydbNtxBrb3ziqQHbhyjl u3PrxZiBO5MKFR9G19Kj41aq0Axo0854rPUnfWAgmLhS2TcjlQks2NZN4v8rwR7gpRPm kHdRbyqglC7THUznLnra+BqZv3sediSdtKtR1/rspyHTSwgdxmV+8cL50gWMqbUDZSfH HoCETHluYL5kP9TIhped01IsXMGnQ9aPrikb0mILyzLcaNH0LW22gRdf9z/n7mIbPBYS nshYe/CUuKjXLmL9SKELDjh3JDkqH0F+b7GbbbQlGVNaM/DCKuZ4JWGcB0k3D9SnuinW v8YQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720172580; x=1720777380; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZXuX9LroFfrWSjjWC3sm96qQ6X5CtfodhnxL67G+Hzk=; b=Jauz+xhwATp73fx972VjOPNNBY682pZvO+pO+FaMy2EMpi57SVePUrWFkQRs/aTtFS CCQMz2QHUuCzbLAnZjCDYG9h/pd5Okek/pVN7r5GI27Hd7fhY3x87/LlK02cYqLh36/x +TSJVvCnClmjy3PwBhn92u+xH31ynw7h4x+Zy6xebzG5hr5fC3v1q9280PDGRD01g2Va Oj+5pbBG1UY+QwM4tM6/oqT/naIS72gQ5BUc9whaEtFJS8Aob2p0SPhrb/CytWPHySVn shAwZ9ynmCVdjmym+g4v0VMVuKWjmcWgJTo3zF3mmPof4LzqyUPO6ZH2uqEGEbgqUYoM KoEw== X-Forwarded-Encrypted: i=1; AJvYcCWmr9mvwd6zvWN6+e+/zQf8KdiqTaj+0+O35oz64ftTjjfJrQuqqVbSvw65jW94bDLdzzGTC4hPUZUNfh5/MLAykJhICB7LYPmVr6V+OYM9T36pdvdK5vhb6CZsYqvv4WT9So/IublmspGuUh/jgw== X-Gm-Message-State: AOJu0YxggrJ6RzDZnmok9rgUPPhPO+1a930EYtxe750ClY/cVi/7KfiM QJ64xZVRLfefBLXqDPq4g5itDq1yp5p3iLZZrnlPGzTl48H6OPB6ZKpSipkYOeY= X-Google-Smtp-Source: AGHT+IGKkfUZ6DlqQ8AWUF9wgJ3QmVdonI652zcmMU/RuSLme3QGD3S59vb9GCnP0SjJYVmXpchTvA== X-Received: by 2002:a17:90b:19d2:b0:2c7:c788:d34d with SMTP id 98e67ed59e1d1-2c99c6b3733mr3180082a91.38.1720172579570; Fri, 05 Jul 2024 02:42:59 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a9cd133sm2958138a91.38.2024.07.05.02.42.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 02:42: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 v5 2/8] perf trace: BTF-based enum pretty printing for syscall args Date: Fri, 5 Jul 2024 17:42:54 +0800 Message-ID: <20240705094300.585156-3-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705094300.585156-1-howardchu95@gmail.com> References: <20240705094300.585156-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable In this patch, BTF is used to turn enum value to the corresponding name. There is only one system call that uses enum value as its argument, that is `landlock_add_rule()`. The vmlinux btf is loaded lazily, when user decided to trace the `landlock_add_rule` syscall. But if one decide to run `perf trace` without any arguments, the behaviour is to trace `landlock_add_rule`, so vmlinux btf will be loaded by default. The laziest behaviour is to load vmlinux btf when a `landlock_add_rule` syscall hits. But I think you could lose some samples when loading vmlinux btf at run time, for it can delay the handling of other samples. I might need your precious opinions on this... before: ``` perf $ ./perf trace -e landlock_add_rule 0.000 ( 0.008 ms): ldlck-test/438194 landlock_add_rule(rule_type: 2) = =3D -1 EBADFD (File descriptor in bad state) 0.010 ( 0.001 ms): ldlck-test/438194 landlock_add_rule(rule_type: 1) = =3D -1 EBADFD (File descriptor in bad state) ``` after: ``` perf $ ./perf trace -e landlock_add_rule 0.000 ( 0.029 ms): ldlck-test/438194 landlock_add_rule(rule_type: LAND= LOCK_RULE_NET_PORT) =3D -1 EBADFD (File descriptor in bad state) 0.036 ( 0.004 ms): ldlck-test/438194 landlock_add_rule(rule_type: LAND= LOCK_RULE_PATH_BENEATH) =3D -1 EBADFD (File descriptor in bad state) ``` Committer notes: Made it build with NO_LIBBPF=3D1, simplified btf_enum_fprintf(), see [1] for the discussion. Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Alexander Shishkin Cc: G=C3=BCnther Noack Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Micka=C3=ABl Sala=C3=BCn Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/lkml/20240613022757.3589783-1-howardchu95@gma= il.com Link: https://lore.kernel.org/lkml/ZnXAhFflUl_LV1QY@x1 # [1] Link: https://lore.kernel.org/r/20240624181345.124764-3-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo --- 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 19:03:42 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 C28FD1487C6; Fri, 5 Jul 2024 09:43:05 +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=1720172587; cv=none; b=OVVo6hIIBPy3A9gNXw6sKlHKhCFaJDNwWpB21Voi5ui+hDqLIx2UzYq+MRTRwl8Bgt8DCebFoJQ6k2gRrWLCgmIfdRQuAbCskQa/EJa1jyfdQV+Y9VBcFM9L4va4EXZSeuPIyMKd146ts5G48b4GBzaWakoO+ff0g8gfFkPrYo4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172587; c=relaxed/simple; bh=wZt9Yscf3NHoVs//WjE+d/6CjmjjOUhU9J1rClELho4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eIm9eGfVNS2obcchPXRKKrKxe15LPKOYCfuz6kQCnqkN2vZwT+cXsLjB0jYKH0rNdpxFc2wJe3ShyBkx7b+LTCCchsdVaUPK+CWRYSGrzTyrdv+BctZwV83B9wFJ5fq5/fC7U+g2HCxpb05s/R9XkTWK3e1W0AUuQHCxQ/ZDAHc= 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=hoo8/Y5Q; 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="hoo8/Y5Q" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-75c5bdab7faso869257a12.1; Fri, 05 Jul 2024 02:43:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720172585; x=1720777385; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mrw/+MkpLo+YifaVzEnjYrzCeq2JJtmQbuCJK7soUkM=; b=hoo8/Y5QvCSKS+o8gGmDubZv6R5BxrT0KNrP2Q+y5xw/8XhL8V/+uijHZTuJCr9gfm t5tCsUlfohGafBl3BcvAix2DNKhi509E75RNHWK5FdyIsUsN5VtDjuLqzEqxEpzLGWDw xtXZoAjUT5ahLpw1K7AQlh4CIo3Tx3ZC+SqOPIX9ViYlDH3nzK1v1DkHDVZeoKRcfu/G gy+B++Uw+xMZBzZvEgSx1bMVs4WwCPnuCpSjNskqVbJAZll0cnk3/ym7J3GSo1d8PQ72 YxuXnrVm3HRGgJ/G2wZeWffAYGWqxKo/11Gm0CLvLtGcVooB96Wgyk12RS4Ymbt5/G4i RSrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720172585; x=1720777385; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mrw/+MkpLo+YifaVzEnjYrzCeq2JJtmQbuCJK7soUkM=; b=cBUsS/FwHe8IYyHWj+V5RBbSUDHl1Sw4NApae6dR8FV6x8caD/Rmq8TYBiyKRWD0PM xZcv3UKS12pdqH1hzbOLq1D8lRDrnyZ9FRqLyDKd/DNM2/HUt7ffaT7hHFQ5lR9m4NWv Q52svoXorbrVSGSASZbs8xOCQv7JPIX8wXKSoT+28rQ7oNtxW9qGZxck3sjGjylCS3nG 9GeewaYr+fOvSnDdC2+1FvtHePKtuYEvXd61KcEsyrZrEFKGSjN89qM0fERp8NcyZRU9 JfmOuttq1HGCrzZkyVAu4vVFRrer3ISl+p20tjPam78LyrT75FcnZ/wlzVyfdeIZtZCo nT4Q== X-Forwarded-Encrypted: i=1; AJvYcCWAMpxIuYuJN4NyKeDOcGnLDyn7jymtkI7plvvKWPIO0mJkM9TNhzNanEftR56K+P64wOHv02e9to4+sQyClhNeOcjGSCHltuN6t+/BQRN6PODyTZtfxSEVpCYv7JB28qcj3CVPkOsfJHf4HLOfqQ== X-Gm-Message-State: AOJu0YzBePDK29p4IPHbwY1mC9lgIB8AHaoh2h191gYNxUpI+2esAK6T AVVzdCH1gp8xPqLzd5OQ+594hb1Y2GPlOmjMMcRocBEEDBWEZDvA X-Google-Smtp-Source: AGHT+IGA2D94Ha4nD4ajrc88CdhEy0O/8fEX/Bg8KCpQUIDfrSSsFRpHN4WBbPjAK20F05UOfj1p/Q== X-Received: by 2002:a05:6a21:3995:b0:1c0:bd9c:adf with SMTP id adf61e73a8af0-1c0cc8ce924mr4193981637.50.1720172584916; Fri, 05 Jul 2024 02:43:04 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a9cd133sm2958138a91.38.2024.07.05.02.43.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 02:43:04 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Alexander Shishkin , Ingo Molnar , Mark Rutland , Peter Zijlstra , Arnaldo Carvalho de Melo Subject: [PATCH v5 3/8] perf trace: Augment non-syscall tracepoints with enum arguments with BTF Date: Fri, 5 Jul 2024 17:42:55 +0800 Message-ID: <20240705094300.585156-4-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705094300.585156-1-howardchu95@gmail.com> References: <20240705094300.585156-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before: perf $ ./perf trace -e timer:hrtimer_start --max-events=3D1 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff974466c25f18, function: = 0xffffffff89da5be0, expires: 377432432256753, softexpires: 377432432256753,= mode: 10) After: perf $ ./perf trace -e timer:hrtimer_start --max-events=3D1 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 4382442895089, softexpires: 4382442895089, mod= e: HRTIMER_MODE_ABS_PINNED_HARD) in which HRTIMER_MODE_ABS_PINNED_HARD is: perf $ pahole hrtimer_mode enum hrtimer_mode { HRTIMER_MODE_ABS =3D 0, HRTIMER_MODE_REL =3D 1, HRTIMER_MODE_PINNED =3D 2, HRTIMER_MODE_SOFT =3D 4, HRTIMER_MODE_HARD =3D 8, HRTIMER_MODE_ABS_PINNED =3D 2, HRTIMER_MODE_REL_PINNED =3D 3, HRTIMER_MODE_ABS_SOFT =3D 4, HRTIMER_MODE_REL_SOFT =3D 5, HRTIMER_MODE_ABS_PINNED_SOFT =3D 6, HRTIMER_MODE_REL_PINNED_SOFT =3D 7, HRTIMER_MODE_ABS_HARD =3D 8, HRTIMER_MODE_REL_HARD =3D 9, HRTIMER_MODE_ABS_PINNED_HARD =3D 10, HRTIMER_MODE_REL_PINNED_HARD =3D 11, }; Can also be tested by ./perf trace -e pagemap:mm_lru_insertion,timer:hrtimer_start,timer:hrtimer_= init,skb:kfree_skb --max-events=3D10 (Chose these 4 events because they happen quite frequently.) However some enum arguments may not be contained in vmlinux BTF. To see what enum arguments are supported, use: vmlinux_dir $ bpftool btf dump file /sys/kernel/btf/vmlinux > vmlinux vmlinux_dir $ while read l; do grep "ENUM '$l'" vmlinux; done < <(grep fie= ld:enum /sys/kernel/tracing/events/*/*/format | awk '{print $3}' | sort | u= niq) | awk '{print $3}' | sed "s/'\(.*\)'/\1/g" dev_pm_qos_req_type error_detector hrtimer_mode i2c_slave_event ieee80211_bss_type lru_list migrate_mode nl80211_auth_type nl80211_band nl80211_iftype numa_vmaskip_reason pm_qos_req_action pwm_polarity skb_drop_reason thermal_trip_type xen_lazy_mode xen_mc_extend_args xen_mc_flush_reason zone_type And what tracepoints have these enum types as their arguments: vmlinux_dir $ while read l; do grep "ENUM '$l'" vmlinux; done < <(grep fiel= d:enum /sys/kernel/tracing/events/*/*/format | awk '{print $3}' | sort | un= iq) | awk '{print $3}' | sed "s/'\(.*\)'/\1/g" > good_enums vmlinux_dir $ cat good_enums dev_pm_qos_req_type error_detector hrtimer_mode i2c_slave_event ieee80211_bss_type lru_list migrate_mode nl80211_auth_type nl80211_band nl80211_iftype numa_vmaskip_reason pm_qos_req_action pwm_polarity skb_drop_reason thermal_trip_type xen_lazy_mode xen_mc_extend_args xen_mc_flush_reason zone_type vmlinux_dir $ grep -f good_enums -l /sys/kernel/tracing/events/*/*/format /sys/kernel/tracing/events/cfg80211/cfg80211_chandef_dfs_required/format /sys/kernel/tracing/events/cfg80211/cfg80211_ch_switch_notify/format /sys/kernel/tracing/events/cfg80211/cfg80211_ch_switch_started_notify/format /sys/kernel/tracing/events/cfg80211/cfg80211_get_bss/format /sys/kernel/tracing/events/cfg80211/cfg80211_ibss_joined/format /sys/kernel/tracing/events/cfg80211/cfg80211_inform_bss_frame/format /sys/kernel/tracing/events/cfg80211/cfg80211_radar_event/format /sys/kernel/tracing/events/cfg80211/cfg80211_ready_on_channel_expired/format /sys/kernel/tracing/events/cfg80211/cfg80211_ready_on_channel/format /sys/kernel/tracing/events/cfg80211/cfg80211_reg_can_beacon/format /sys/kernel/tracing/events/cfg80211/cfg80211_return_bss/format /sys/kernel/tracing/events/cfg80211/cfg80211_tx_mgmt_expired/format /sys/kernel/tracing/events/cfg80211/rdev_add_virtual_intf/format /sys/kernel/tracing/events/cfg80211/rdev_auth/format /sys/kernel/tracing/events/cfg80211/rdev_change_virtual_intf/format /sys/kernel/tracing/events/cfg80211/rdev_channel_switch/format /sys/kernel/tracing/events/cfg80211/rdev_connect/format /sys/kernel/tracing/events/cfg80211/rdev_inform_bss/format /sys/kernel/tracing/events/cfg80211/rdev_libertas_set_mesh_channel/format /sys/kernel/tracing/events/cfg80211/rdev_mgmt_tx/format /sys/kernel/tracing/events/cfg80211/rdev_remain_on_channel/format /sys/kernel/tracing/events/cfg80211/rdev_return_chandef/format /sys/kernel/tracing/events/cfg80211/rdev_return_int_survey_info/format /sys/kernel/tracing/events/cfg80211/rdev_set_ap_chanwidth/format /sys/kernel/tracing/events/cfg80211/rdev_set_monitor_channel/format /sys/kernel/tracing/events/cfg80211/rdev_set_radar_background/format /sys/kernel/tracing/events/cfg80211/rdev_start_ap/format /sys/kernel/tracing/events/cfg80211/rdev_start_radar_detection/format /sys/kernel/tracing/events/cfg80211/rdev_tdls_channel_switch/format /sys/kernel/tracing/events/compaction/mm_compaction_defer_compaction/format /sys/kernel/tracing/events/compaction/mm_compaction_deferred/format /sys/kernel/tracing/events/compaction/mm_compaction_defer_reset/format /sys/kernel/tracing/events/compaction/mm_compaction_finished/format /sys/kernel/tracing/events/compaction/mm_compaction_kcompactd_wake/format /sys/kernel/tracing/events/compaction/mm_compaction_suitable/format /sys/kernel/tracing/events/compaction/mm_compaction_wakeup_kcompactd/format /sys/kernel/tracing/events/error_report/error_report_end/format /sys/kernel/tracing/events/i2c_slave/i2c_slave/format /sys/kernel/tracing/events/migrate/mm_migrate_pages/format /sys/kernel/tracing/events/migrate/mm_migrate_pages_start/format /sys/kernel/tracing/events/pagemap/mm_lru_insertion/format /sys/kernel/tracing/events/power/dev_pm_qos_add_request/format /sys/kernel/tracing/events/power/dev_pm_qos_remove_request/format /sys/kernel/tracing/events/power/dev_pm_qos_update_request/format /sys/kernel/tracing/events/power/pm_qos_update_flags/format /sys/kernel/tracing/events/power/pm_qos_update_target/format /sys/kernel/tracing/events/pwm/pwm_apply/format /sys/kernel/tracing/events/pwm/pwm_get/format /sys/kernel/tracing/events/sched/sched_skip_vma_numa/format /sys/kernel/tracing/events/skb/kfree_skb/format /sys/kernel/tracing/events/thermal/thermal_zone_trip/format /sys/kernel/tracing/events/timer/hrtimer_init/format /sys/kernel/tracing/events/timer/hrtimer_start/format /sys/kernel/tracing/events/xen/xen_mc_batch/format /sys/kernel/tracing/events/xen/xen_mc_extend_args/format /sys/kernel/tracing/events/xen/xen_mc_flush_reason/format /sys/kernel/tracing/events/xen/xen_mc_issue/format Committer testing: root@x1:~# perf trace -e timer:hrtimer_start --max-events=3D2 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff225050, function= : 0xffffffff9e22ddd0, expires: 241152380000000, softexpires: 24115238000000= 0, mode: HRTIMER_MODE_ABS) 0.028 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff225050, function= : 0xffffffff9e22ddd0, expires: 241153654000000, softexpires: 24115365400000= 0, mode: HRTIMER_MODE_ABS_PINNED_HARD) root@x1:~# Suggested-by: Arnaldo Carvalho de Melo Reviewed-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/lkml/20240615032743.112750-1-howardchu95@gmai= l.com Link: https://lore.kernel.org/r/20240624181345.124764-4-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo --- 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 19:03:42 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.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 3120014882A; Fri, 5 Jul 2024 09:43:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172592; cv=none; b=cIR3zLUqqTbepPWUJCsdIyixjIfyeOQVIakDP+MpL3YMarhwzypkHz+pWsPTQU23SDdRrNF6/9nGTg+sNKDIBGYoDhTkJ9CD6psvu/bKOO4WKGw2NexrUTdPo/pA1na5sIamEQ7XGrPzJMakZO6M5r0DrFBUwg0pojeDoChYuUk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172592; c=relaxed/simple; bh=wDgsftP4Z2gjtvPtuKIKy8aJh8WgfvjpQOBfMGDJbMQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EfTx2oud5lhngE0qMcyRCh7od2sFgxZbwYWiO382kJdvkMCiZf73KdL/1tVf0kt3xfWUMML1BLK5A3Ya5IJCOlDW5/CYjvU2Q5h+hxH+4TQyXoGx2h4FHBhnQEX7fzZYQf/5poX1JQLaN7xyZPToivLjn3CiOZSBsP87IsYS/ME= 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=O92ezHX2; arc=none smtp.client-ip=209.85.214.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="O92ezHX2" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-1fb3cf78fbdso7061285ad.1; Fri, 05 Jul 2024 02:43:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720172590; x=1720777390; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lYTot191GZo6DS32N1w+V73flNMPv1Itq1GPGesqtFc=; b=O92ezHX2+9u8q6mK6snKferHLue8TfTnmbVNo+31bnewYojnJ6frFldKBdTbbIsYN5 4IjFHK7kjTxxAs+RerMLc8zL4aup5esITau7l+6i902zyi3Ir0WbzWt27zcwkavmWrL2 M7HmBkaze1Q0Mu5ySPhUf7rgE/9xB5yXX4c0eO+/w7sG16Y2Gf4xlBA+QE6FIqsq4Phm ky7qSr5VHjPaCHWlmwnTQgmVm9jQnVOYjtpnAvLa6g5kpipob/Ms39/YUDi/Y9pb7e8g y/Lzcv45I9Cj/8IltVrRnxMVbVNICnY9672Fba9pkQReyGcmdg4ZrC1L8om7Tt8w2lEK vXaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720172590; x=1720777390; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lYTot191GZo6DS32N1w+V73flNMPv1Itq1GPGesqtFc=; b=I9eG5+MTdP9Z6U567XcFSOI0zJZSfqbgohyH+fJ1G+ZMtx1ZThICaLDAqpk0Q6Z+Oc l7+KkObS7aS1asZH5uFGIQ3OApEKL733SgAYT8CyZfspCzRBrljOLGhtE0yvCg1+Ym3W tf3Pa/bLHoWtbzuDWEdoElPA6rMi2QhmtSIOcVIGA1jETEx1+zpvcBi+XwSAtRuXWmKQ pKBKJKOhEs94oq7A48tPUn2yUdJYhUAxlVsajx6yzCIYjb+8HDFYbZKJF3hU4jI46aCu 0KrI2OXEwIUAKPqJTrD37eOsKsopabDjQzu3xIFp8E26W0jPAJN9krBbNAbNgln7rM2y 6uhQ== X-Forwarded-Encrypted: i=1; AJvYcCUT/r+StfdUmBSxc0zSClezTRK/sgSr++G77lIEW2rPX9wyJ98xUo8+Y6PAVc9LbCh6EnWza8rtMTy4DD+aT5SvvRY+ZGTROLkEwbF7AL7rrz9ZEpot7fDMl9fiClswgAlf1beCTUyhZjnbW7/olg== X-Gm-Message-State: AOJu0YwCKj0Kbkw9slw4HauoQQ/UijWzP/6DuBLL1o1fLbA8BPjicwq6 VZT9B5kedD9yWcIF8C2xxxThiaY/fy8zFwAWmWFmLTjXOd2+NLU6 X-Google-Smtp-Source: AGHT+IE56K4FGWx3BpcbBb6ydEaFUrkFOCD9vpTcLh4vpUR0WSXiBD2DSIkeCEE54zmLQk5hoMi3mg== X-Received: by 2002:a17:90b:124f:b0:2c9:7e9e:70b3 with SMTP id 98e67ed59e1d1-2c99c6e49b2mr2543882a91.33.1720172590246; Fri, 05 Jul 2024 02:43:10 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a9cd133sm2958138a91.38.2024.07.05.02.43.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 02:43:10 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo , Alexander Shishkin , Ingo Molnar , Mark Rutland , Peter Zijlstra Subject: [PATCH v5 4/8] perf trace: Filter enum arguments with enum names Date: Fri, 5 Jul 2024 17:42:56 +0800 Message-ID: <20240705094300.585156-5-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705094300.585156-1-howardchu95@gmail.com> References: <20240705094300.585156-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before: perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode!=3DHRTIMER_MODE= _ABS_PINNED_HARD' --max-events=3D1 No resolver (strtoul) for "mode" in "timer:hrtimer_start", can't set filter= "(mode!=3DHRTIMER_MODE_ABS_PINNED_HARD) && (common_pid !=3D 281988)" After: perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode!=3DHRTIMER_MODE= _ABS_PINNED_HARD' --max-events=3D1 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 12351248764875, softexpires: 12351248764875, m= ode: HRTIMER_MODE_ABS) && and ||: perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode !=3D HRTIMER_MO= DE_ABS_PINNED_HARD && mode !=3D HRTIMER_MODE_ABS' --max-events=3D1 0.000 Hyprland/534 timer:hrtimer_start(hrtimer: 0xffff9497801a84d0, fu= nction: 0xffffffffc04cdbe0, expires: 12639434638458, softexpires: 126394336= 38458, mode: HRTIMER_MODE_REL) perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode =3D=3D HRTIMER_= MODE_REL || mode =3D=3D HRTIMER_MODE_PINNED' --max-events=3D1 0.000 ldlck-test/60639 timer:hrtimer_start(hrtimer: 0xffffb16404ee7bf8= , function: 0xffffffffa7790420, expires: 12772614418016, softexpires: 12772= 614368016, mode: HRTIMER_MODE_REL) Switching it up, using both enum name and integer value(--filter=3D'mode = =3D=3D HRTIMER_MODE_ABS_PINNED_HARD || mode =3D=3D 0'): perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode =3D=3D HRTIMER_= MODE_ABS_PINNED_HARD || mode =3D=3D 0' --max-events=3D3 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 12601748739825, softexpires: 12601748739825, m= ode: HRTIMER_MODE_ABS_PINNED_HARD) 0.036 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 12518758748124, softexpires: 12518758748124, m= ode: HRTIMER_MODE_ABS_PINNED_HARD) 0.172 tmux: server/41881 timer:hrtimer_start(hrtimer: 0xffffb164081e78= 38, function: 0xffffffffa7790420, expires: 12518768255836, softexpires: 125= 18768205836, mode: HRTIMER_MODE_ABS) P.S. perf $ pahole hrtimer_mode enum hrtimer_mode { HRTIMER_MODE_ABS =3D 0, HRTIMER_MODE_REL =3D 1, HRTIMER_MODE_PINNED =3D 2, HRTIMER_MODE_SOFT =3D 4, HRTIMER_MODE_HARD =3D 8, HRTIMER_MODE_ABS_PINNED =3D 2, HRTIMER_MODE_REL_PINNED =3D 3, HRTIMER_MODE_ABS_SOFT =3D 4, HRTIMER_MODE_REL_SOFT =3D 5, HRTIMER_MODE_ABS_PINNED_SOFT =3D 6, HRTIMER_MODE_REL_PINNED_SOFT =3D 7, HRTIMER_MODE_ABS_HARD =3D 8, HRTIMER_MODE_REL_HARD =3D 9, HRTIMER_MODE_ABS_PINNED_HARD =3D 10, HRTIMER_MODE_REL_PINNED_HARD =3D 11, }; Committer testing: root@x1:~# perf trace -e timer:hrtimer_start --filter=3D'mode !=3D HRTIME= R_MODE_ABS' --max-events=3D2 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff2a5050, function= : 0xffffffff9e22ddd0, expires: 241502326000000, softexpires: 24150232600000= 0, mode: HRTIMER_MODE_ABS_PINNED_HARD) 18446744073709.488 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff425050, = function: 0xffffffff9e22ddd0, expires: 241501814000000, softexpires: 241501= 814000000, mode: HRTIMER_MODE_ABS_PINNED_HARD) root@x1:~# perf trace -e timer:hrtimer_start --filter=3D'mode !=3D HRTIME= R_MODE_ABS && mode !=3D HRTIMER_MODE_ABS_PINNED_HARD' --max-events=3D2 0.000 podman/510644 timer:hrtimer_start(hrtimer: 0xffffa2024f5f7dd0,= function: 0xffffffff9e2170c0, expires: 241530497418194, softexpires: 24153= 0497368194, mode: HRTIMER_MODE_REL) 40.251 gnome-shell/2484 timer:hrtimer_start(hrtimer: 0xffff8d48bda176= 50, function: 0xffffffffc0661550, expires: 241550528619247, softexpires: 24= 1550527619247, mode: HRTIMER_MODE_REL) root@x1:~# perf trace -v -e timer:hrtimer_start --filter=3D'mode !=3D HRT= IMER_MODE_ABS && mode !=3D HRTIMER_MODE_ABS_PINNED_HARD && mode !=3D HRTIME= R_MODE_REL' --max-events=3D2 Using CPUID GenuineIntel-6-BA-3 vmlinux BTF loaded 0 0xa 0x1 New filter for timer:hrtimer_start: (mode !=3D 0 && mode !=3D 0xa && mode= !=3D 0x1) && (common_pid !=3D 524049 && common_pid !=3D 4041) mmap size 528384B ^Croot@x1:~# Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/lkml/ZnCcliuecJABD5FN@x1 Link: https://lore.kernel.org/r/20240624181345.124764-5-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo --- 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 19:03:42 2026 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (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 6D9CA148858; Fri, 5 Jul 2024 09:43:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172597; cv=none; b=AZJ+n/2mdQ8tpaJKaWJbO0RAJqxuF4VOI8HAFg+wEiGGxIEqKDjYfI+egzo3B3lyxbGvFTeonqv95ZsbUQrZu1JhmSeh5oNPLhLQLcSn/yitfpXdFM5A+8nGYUYAWE0DYSxA6d238JlYUb0jyfTqT8RqfutCb+FaT0DUJRCiefA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172597; c=relaxed/simple; bh=lEdgG0ZTYJexChkBRMuE04MIvYbrZH3QypaCc3wVyQY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=b3ruyoROikiCQyuMOLaxolDanAXOYD6LK+aFTvmk5Km+9xLpDjyRfcy22BwSERbMsvAud1NgF943Ekt2Uvpi/kNwaMRvLNOWdd24cvwzbu3OTnO4bm1qumEal+/RT4pRGqIK5WFUO2HX4kmXOOXRd7tGMXVDHpqxFJv2h85Xs4A= 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=GCtHNtK/; arc=none smtp.client-ip=209.85.215.178 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="GCtHNtK/" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-761e0f371f5so782444a12.1; Fri, 05 Jul 2024 02:43:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720172595; x=1720777395; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=c8OqZCgqHPZ3fH019qRYJYUerKLq5729V+3ETr9F91k=; b=GCtHNtK/kk0cqtQX/3oR9i1CayGjDLc7Oyz4twQbB4Rf7+WhWlw0XT+iuyEmv2fQht ixgAvZmSZZku3yUy78v2x01uZrzBIGEls3HbIiW/KArbtkez5C9H/UVxnT0mFEJZrVUa DstiAqXIToGXih8G4OjyhFbWeB6NMT00IDM19Z2Ztb9qmUI0kUExdT9VXD6z/balKWWu C+QekSjInUrNIKmpYNCNx8MIQeAXaCMjyyVWoYEztarO3u0lmN6Jh88jYBYaUhjDnwqz Q1X4mr9X5IGLWz+iMQdWmPncy908nTcXcJFHD+0Pqu4bbvpt2J35Jmg36dX16ekzLRUo FpQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720172595; x=1720777395; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=c8OqZCgqHPZ3fH019qRYJYUerKLq5729V+3ETr9F91k=; b=LQVdzUKtNQs+jtlURfRMlrvLz3qT2kmAZYl9EepXpooTIe0IypXypAY+e19eRhV33T fZt/9YZwtKwa43fABXLaeJqWJRn8UOXasAHc2AdpkMnU6ivvvDblnEV/1tEAewZ1w94x Mj2iNQ+QIMhVEfEIWdpBbur3inyVvFTBWC01bLily8bEvQAxjwTkA+ONXF2HgasPGpCp gj0qt4sAIvE//pKvL0jxD5qp5zdZRrNJV0Anf6lTi3tTmpqlSJsOrAPutBHIrMk2wp9m olvbHI6NVH1R2zDlnR4/BABbRe2Nym+TPFT45S2TpLvFIW3doFYawo/vBlnnGPWVFo2q 2tMw== X-Forwarded-Encrypted: i=1; AJvYcCXDFWbbnhHLGRp++FttoXQyRc1O8zQa87GVisSSMk24/vAQoTtiAVHe8hW66sSSPNmF70/u2LVUR8gVRRSRcvElGXJnFU8KAyPpQUEK6aBAVBgWYuoxZzqksdUQoE7FCyD62v2dt2em5W/xBM6L3A== X-Gm-Message-State: AOJu0YxrHAuSR1VqjlFXVhxbUxBdRCH3gDk+sVL5RbdzrTjsbMHB3GG2 qSeEa1psMmgXaNcZx5h0tTqZMfG54vxtLL2+EXisahQpdRLL3zJN X-Google-Smtp-Source: AGHT+IFN6hxQR4EGBW2FAHG5WSp9JhH/71knYV6MuFQG8TmxJpzZ8yEA/L9xMYiubVP5DcAjV0HOxA== X-Received: by 2002:a17:90b:90f:b0:2c3:34f4:5154 with SMTP id 98e67ed59e1d1-2c99f2f43b1mr5646660a91.1.1720172594483; Fri, 05 Jul 2024 02:43:14 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a9cd133sm2958138a91.38.2024.07.05.02.43.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 02:43:14 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v5 5/8] perf test: Add landlock workload Date: Fri, 5 Jul 2024 17:42:57 +0800 Message-ID: <20240705094300.585156-6-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705094300.585156-1-howardchu95@gmail.com> References: <20240705094300.585156-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We'll use it to add a regression test for the BTF augmentation of enum arguments for tracepoints in 'perf trace': root@x1:~# perf trace -e landlock_add_rule perf test -w landlock 0.000 ( 0.009 ms): perf/747160 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd8e258594, flags: 45) = =3D -1 EINVAL (Invalid argument) 0.011 ( 0.002 ms): perf/747160 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd8e2585a0, flags: 45) =3D -= 1 EINVAL (Invalid argument) root@x1:~# Committer notes: It was agreed on the discussion (see Link below) to shorten then name of the workload from 'landlock_add_rule' to 'landlock', and I moved it to a separate patch. Also, to address a build failure from Namhyung, I stopped loading linux/landlock.h and instead added the used defines, enums and types to make this build in older systems. All we want is to emit the syscall and intercept it. We also need to add a "CFLAGS_landlock.o =3D -Wno-attributes" line to cope with those landlock struct packed structs when building on 32-bit architectures. Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/lkml/CAH0uvohaypdTV6Z7O5QSK+va_qnhZ6BP6oSJ89s= 1c1E0CjgxDA@mail.gmail.com Link: https://lore.kernel.org/r/20240624181345.124764-1-howardchu95@gmail.c= om Link: https://lore.kernel.org/r/20240624181345.124764-6-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/builtin-test.c | 1 + tools/perf/tests/tests.h | 1 + tools/perf/tests/workloads/Build | 2 + tools/perf/tests/workloads/landlock.c | 66 +++++++++++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 tools/perf/tests/workloads/landlock.c diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-tes= t.c index c3d84b67ca8e..470a9709427d 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -152,6 +152,7 @@ static struct test_workload *workloads[] =3D { &workload__sqrtloop, &workload__brstack, &workload__datasym, + &workload__landlock, }; =20 static int num_subtests(const struct test_suite *t) diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index 3aa7701ee0e9..6ea2be86b7bf 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -205,6 +205,7 @@ DECLARE_WORKLOAD(leafloop); DECLARE_WORKLOAD(sqrtloop); DECLARE_WORKLOAD(brstack); DECLARE_WORKLOAD(datasym); +DECLARE_WORKLOAD(landlock); =20 extern const char *dso_to_test; extern const char *test_objdump_path; diff --git a/tools/perf/tests/workloads/Build b/tools/perf/tests/workloads/= Build index 48bf0d3b0f3d..3fe97e68d105 100644 --- a/tools/perf/tests/workloads/Build +++ b/tools/perf/tests/workloads/Build @@ -6,8 +6,10 @@ perf-test-y +=3D leafloop.o perf-test-y +=3D sqrtloop.o perf-test-y +=3D brstack.o perf-test-y +=3D datasym.o +perf-test-y +=3D landlock.o =20 CFLAGS_sqrtloop.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE CFLAGS_leafloop.o =3D -g -O0 -fno-inline -fno-omit-frame-pointer -= U_FORTIFY_SOURCE CFLAGS_brstack.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE CFLAGS_datasym.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE +CFLAGS_landlock.o =3D -Wno-attributes diff --git a/tools/perf/tests/workloads/landlock.c b/tools/perf/tests/workl= oads/landlock.c new file mode 100644 index 000000000000..0c2bcdaf2263 --- /dev/null +++ b/tools/perf/tests/workloads/landlock.c @@ -0,0 +1,66 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include +#include +#include +#include "../tests.h" + +/* This workload was initially added to test enum augmentation with BTF in= perf + * trace because its the only syscall that has an enum argument. Since it = is + * a recent addition to the Linux kernel (at the time of the introduction = of this + * 'perf test' workload) we just add the required types and defines here i= nstead + * of including linux/landlock, that isn't available in older systems. + * + * We are not interested in the the result of the syscall, just in interce= pting + * its arguments. + */ + +#ifndef __NR_landlock_add_rule +#define __NR_landlock_add_rule 445 +#endif + +#ifndef LANDLOCK_ACCESS_FS_READ_FILE +#define LANDLOCK_ACCESS_FS_READ_FILE (1ULL << 2) + +#define LANDLOCK_RULE_PATH_BENEATH 1 + +struct landlock_path_beneath_attr { + __u64 allowed_access; + __s32 parent_fd; +} __attribute__((packed)); +#endif + +#ifndef LANDLOCK_ACCESS_NET_CONNECT_TCP +#define LANDLOCK_ACCESS_NET_CONNECT_TCP (1ULL << 1) + +#define LANDLOCK_RULE_NET_PORT 2 + +struct landlock_net_port_attr { + __u64 allowed_access; + __u64 port; +}; +#endif + +static int landlock(int argc __maybe_unused, const char **argv __maybe_unu= sed) +{ + int fd =3D 11, flags =3D 45; + + struct landlock_path_beneath_attr path_beneath_attr =3D { + .allowed_access =3D LANDLOCK_ACCESS_FS_READ_FILE, + .parent_fd =3D 14, + }; + + struct landlock_net_port_attr net_port_attr =3D { + .port =3D 19, + .allowed_access =3D LANDLOCK_ACCESS_NET_CONNECT_TCP, + }; + + syscall(__NR_landlock_add_rule, fd, LANDLOCK_RULE_PATH_BENEATH, + &path_beneath_attr, flags); + + syscall(__NR_landlock_add_rule, fd, LANDLOCK_RULE_NET_PORT, + &net_port_attr, flags); + + return 0; +} + +DEFINE_WORKLOAD(landlock); --=20 2.45.2 From nobody Sun Feb 8 19:03:42 2026 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 34AF5149006; Fri, 5 Jul 2024 09:43:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172600; cv=none; b=ijQMK/BfnPDIVPbwnqe5oIAbInKcvpuOLFyQ9Ae5M11vH+b9VChmSNqbmoqU3GNBgI97lTXx5FzPC5Dcbht/zIAx9QKTY3PGEwQnlJNC5vgXmTxRgeYAepccMhn153vcdSi+TGsLLFP3cqeLQrd8+U8YvJcqxeONR6cY0wZreWA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172600; c=relaxed/simple; bh=CpvgJue7O4MWaSyHmJCoq1ukXf1YzFWD1+T3USR8SlI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PVkKEPsoKTFX1+eNiyqTBWm5OX7ydCZNHOPkflRz25aoIEfB+029r9pWB7s29cLUkOEZQYlwPYEcc3u0qOT1LI4yF9irYDxF7UEgBXPXMI9dYzEP86DaUU0M3axpeaNE469eoVFGxXg6CiPpUqRFrkYQjmTggoKJJL67FGSmmUY= 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=JduqxKjp; arc=none smtp.client-ip=209.85.216.41 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="JduqxKjp" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-2c9a8313984so670642a91.2; Fri, 05 Jul 2024 02:43:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720172598; x=1720777398; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=pDEfGupzV1QZZP9bDVKEPg1EQ2BMXRdRN/4z4Ft9J/0=; b=JduqxKjp+PzzA7J1e3Q9lXaAGBZJHL1sXGKi/q0UJBWOBAs7i5DQn3WQ45s7cgRhsr tzHKfIKwgP2bM8JM9Km2GQmtwD0OjfwFyOUsyzA0Ark4oMC2vay7k2u+F7HdQx0CpzSd SdM/G+fH0Fm0MdZXdnaCkiKROiH3IWz4pnp65tlccg3PWWqkU3OJjXIZkHKPQ+dm/9Kz TUGLo/nJ3ZES0Ll847+bIzsTh+mz329MEh/Zx9jjQ7l14PigvX8s6Spp/PBKLu8N5IXs RbvFhAufmRQ3sfHd3zUOMHUODiYDNrQGQZ+3movAq69OFQOmxJX7yCDpfUYbuS3vIa6K Zuig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720172598; x=1720777398; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pDEfGupzV1QZZP9bDVKEPg1EQ2BMXRdRN/4z4Ft9J/0=; b=UvO3g5ryrzpTuWpJHh2WRA0963v9biBPTCPCpZ94Dh8VS8ZllIpbQMjQq6B/q4EwHa dxxwk9zSW73egMaER5R4Nk3RASL4Yv4tnkrEZCC9EdGS/cep1y8HnZxd3HwFXLVmuA9N RvuIOJ/xbGnn6IPUfmR6C9DE3mZkthZwL/xyZzseJDZDcQ0G/3EItPyFz5xTketlIuYX 2+lRmdto/HfA3f9wSx0gdy5tF7deAEikD599VfjLXGrK+f2qp9B3Auldx1GwwmroAO6F 4JwllrcIDEHha2iNtsSd9H7xIwlUnG+SknfjaGTpkWK2Ll7GI30QRhgJlN2o/I5WdZvc dlsA== X-Forwarded-Encrypted: i=1; AJvYcCUhT5o7B2cNCFiocWYtNPoAdCcowq3E8ZhYS2mp54Xi6Di/UtPAZJiTwVaKrhoMLPa2g+XXhfVwYLc+i19fEtV3DD9o7zXM+CiOzDKAoNpoLgpunpyvf97sFEfptYzL+OFQa6przK/KFm4ySVKwVw== X-Gm-Message-State: AOJu0Yy9XyZeFqvs7G4bddry56ENP7Q0ORuV9b94w57iFwNWZiYHf0I+ LDm3HhQcxNX9v402devTMQswxxG4Y/+AMbbG+XrjbMk+9hA/s9l8 X-Google-Smtp-Source: AGHT+IFzOurEbabGnGBT/WpDtvo44CVzKyRva2rHCUUjx1stBQVbaqa1Jd149Bqbqw1xGuk4/Q6fmw== X-Received: by 2002:a17:90a:17ca:b0:2c3:cc6:636e with SMTP id 98e67ed59e1d1-2c99c5057c0mr3039248a91.2.1720172598566; Fri, 05 Jul 2024 02:43:18 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a9cd133sm2958138a91.38.2024.07.05.02.43.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 02:43:18 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v5 6/8] perf test trace_btf_enum: Add regression test for the BTF augmentation of enums in 'perf trace' Date: Fri, 5 Jul 2024 17:42:58 +0800 Message-ID: <20240705094300.585156-7-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705094300.585156-1-howardchu95@gmail.com> References: <20240705094300.585156-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Trace landlock_add_rule syscall to see if the output is desirable. Trace the non-syscall tracepoint 'timer:hrtimer_init' and 'timer:hrtimer_start', see if the 'mode' argument is augmented, the 'mode' enum argument has the prefix of 'HRTIMER_MODE_' in its name. Committer testing: root@x1:~# perf test enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf trace -e landlock_add_rule perf test -v enum 0.000 ( 0.010 ms): perf/749827 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd324171d4, flags: 45) = =3D -1 EINVAL (Invalid argument) 0.012 ( 0.002 ms): perf/749827 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd324171e0, flags: 45) =3D -= 1 EINVAL (Invalid argument) 457.821 ( 0.007 ms): perf/749830 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd4acd31e4, flags: 45) = =3D -1 EINVAL (Invalid argument) 457.832 ( 0.003 ms): perf/749830 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd4acd31f0, flags: 45) =3D -= 1 EINVAL (Invalid argument) 124: perf trace enum augmentation tests : Ok root@x1:~# Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/lkml/20240619082042.4173621-6-howardchu95@gma= il.com Link: https://lore.kernel.org/r/20240624181345.124764-7-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo --- 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 19:03:42 2026 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (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 6BA4C1494BA; Fri, 5 Jul 2024 09:43:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172604; cv=none; b=VdI8XAbbMJmwqou0ZbmdKl4DqN7H68B2btJVcSkCNF4xl6x92ZU7V9CZP3TBnPwNclU1cp2BxAdVCvACQ3cAHtALO8yAaxOahADQlUfwX663l7AecSA5fZLusxeaWK6K07bys6Jw+chQe9HIVSg4Ix2QeFUK7lFt2UpHaD/8B7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172604; c=relaxed/simple; bh=zpCwz5WJUp6bdiwz/dL0kF9VkHkjT2zu8ODJeCDRUY4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QAXDAba2/jYv9XQg7+TYR3GlPbuShUoSDK7lMji14wv4+hptHbG7MlKcdbCoX5/Q65ZHRfzPHHpmbiQtOHpOdUL5QQw84mus1M5R+Nv+RHjZF0vmPwdll0Xz47sy7mlyc+QJAiCJcmWxckU7WU5BOQfOhQRNLIJOK0BhjyqtTKI= 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=eQTGHH3U; arc=none smtp.client-ip=209.85.216.46 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="eQTGHH3U" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-2c964f5a037so959995a91.0; Fri, 05 Jul 2024 02:43:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720172603; x=1720777403; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=76lmvuOrrkN7Lw4Dwyrz4F1r/Om3MtfOcN897FaxN6s=; b=eQTGHH3UrN/SJBKvzw+twZUz3hWwGhJT2lg7Pn8bk5spzDQq33ZZ5zvBh2DIbsBzFq oFeL+GajoYSHv5sl+6DhNfDQ5x0XdNpUF1/0oEsrcaIpatkGzvJBXo5DGua6tCW1Kyh1 YkkfGERmfQr4jRoPoPll4nWoDcNfbjOn7+lAjOrZGrnN+QrwADtTFzsMWXRGBBoHumeV VAqihnhQ/lWoFzvv7zA+vRTG7/MKduo55/Qks9a7i5VTakxo8K1XwXtN3yjNpcGBDXAH rHqUbTjLphQAYugfMiGUmvuNQBixCxBs3qiTWPdje9K80cs6O3p6mpMwv9DGGdQjeyXW F6QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720172603; x=1720777403; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=76lmvuOrrkN7Lw4Dwyrz4F1r/Om3MtfOcN897FaxN6s=; b=E9AN6O/Ujj+3vAj/pDnzSHKleeNddUbEW11gUPRoFU1pJT4bp6BZoK90tzewTp3m5x 70e4OALbBi4e3u3aw6/u6Wy6II76kM9YrkV2UPtq81oGe7lB+S3dHJesPG8zRSSf35Cc UpFHW94Dsf1GMyCwK5GGIAHPKRDAhydECjiAOZtgZHk1u487r0oNOHFJbakGNYG9WzSB mQJEf8h5j136LfvkTIBlxAigrTdniuLFDGn42CalWkuiTs2UeYAl7J0/6xAoGKWmFkzO UK64alKNzR0vtpIX+7aixbwrm6JBIB8uCTpc5EoBVdYsv9u/4RtuImdZMDqrEBBrJj+5 pWew== X-Forwarded-Encrypted: i=1; AJvYcCVynP0XawLB9/mvU05w26EpF0sVuOxNRUJca3YQvSWDUknHbXdU3CzuN2LDuKDEwk64FxkIv2f8ihPDGJlkCLVZXVHfxJBjgDtpV7R79qDFgAmMwbnV8mSwwg/M8lxkswOQICMvIuj5QEAKihpUdA== X-Gm-Message-State: AOJu0Ywmw0OlxC5B+jCeaZzV03g0JDFCAUdbequllLzDUcD59zkalF5+ bp0z8V5+5uj61jDKP6ukSzjNsu8GCOnWmFfsvD4zOMvntGvcLQj+ X-Google-Smtp-Source: AGHT+IGM+SSUEheCvBpqRiT5IPf8pd6w/1V9uU9akrVqeZwQfHfW/Wsau+7MUKFJp2qx0kuMemyhSA== X-Received: by 2002:a17:90a:6007:b0:2c9:98bb:b9fb with SMTP id 98e67ed59e1d1-2c99c5418fbmr2894841a91.10.1720172602711; Fri, 05 Jul 2024 02:43:22 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a9cd133sm2958138a91.38.2024.07.05.02.43.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 02:43:22 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v5 7/8] perf trace: Introduce trace__btf_scnprintf() Date: Fri, 5 Jul 2024 17:42:59 +0800 Message-ID: <20240705094300.585156-8-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705094300.585156-1-howardchu95@gmail.com> References: <20240705094300.585156-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo To have a central place that will look at the BTF type and call the right scnprintf routine or return zero, meaning BTF pretty printing isn't available or not implemented for a specific type. Signed-off-by: Howard Chu Tested-by: Howard Chu Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/r/20240624181345.124764-8-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo --- 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 19:03:42 2026 Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C53241494DC; Fri, 5 Jul 2024 09:43:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172609; cv=none; b=NrmyEMa4GTQecK34KGpcMaXwOzi6RwgDqez9jblRyUHRjaC4YR6qFxIQl6rf1QebpKSDJ+T4ZZ5vs6HOlX3U3a4T2+loY4QznJ4b4hrrVNpbPc0lWpp1U8+8jXOFhajL0NZgE/fsG5WtcjqM6wW4xEXk6Ur9J22A9UvUF98AqfY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720172609; c=relaxed/simple; bh=9LVGdFIrTGDbjOh+XA8Z0YC/ZXcuGb1K9vsLn965MHI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mmiJ62QDBa03uNfW05kJ3/fuGzAppz4sPugYljRKe+F3+ZfeuRbOK4GZRk0aIwTbkQbBeB4FXk+M5Ku3TKIC6V0pr4McQh+WDWoU39tbSehTBUsGo8HZTlpcN+LEcD4qeYJvem5sGiIveXZkuHd0VXkIg/hSZR9EGBZUKMRSuv0= 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=nTshqfOv; arc=none smtp.client-ip=209.85.215.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nTshqfOv" Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-75c3acf90f0so854151a12.2; Fri, 05 Jul 2024 02:43:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720172607; x=1720777407; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jFnq702W1wouPPtmwM6wErXmz26QeU/F3Y7O+wXoTK0=; b=nTshqfOv3uEdt4evhoAWi62geGaClDD9hfzlgFy0rud1DIyGaUVr9JxpwJrDN7ci5f hxTIE3QZLkQk2R+FXHptwYSQK6xptS2oH03upzlrdB5dxGQ7vtzW5cblTLXJQmy4RDVZ fS5sF0utIzATLYuK16JkP5DMtLdW+GRg3DnmNb4EjK7wp9CK9xQ/hNyY2tk6ZLnFQO/w LzqHJnFoSKJ6ilVpdnVyfeFfX3/CjKTEaSq1xxkxe9s8U7gEziw6/SyJWa2KR8juktJr lc7ma9a4a/UcDMHN1+Ptmsba7P2P5/XwjfG8abvuzTVQJv7ZO+YLlriZbXYKMzzpLSXN pljw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720172607; x=1720777407; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jFnq702W1wouPPtmwM6wErXmz26QeU/F3Y7O+wXoTK0=; b=tQf46H0HpkSEH5Ejd49HwmgQxgL2gv3Zzf6bOH3gL1OYLI2OeXM87mYfRSGLINo3ry NpJL1z/p6CZdKF96qvg0t/Ui1byjnJS3Ph+BVfBz0DTqlSSRdEKegHL18meVHMLw3kbZ Vw4VS1/+g11R02dhClVTwiwPMcPmBFkhwYUKGyt2/wqoNZM9rc0KNfZtVoueVtkJXQuH 15wKpe4aBwveOBQwazLFvW33hTA2MOJpBOkogJmi2PQrpkORafnVfKvXxlALfEXQ63YA R8GCmMHKqcfpBr3TYOw4YdG2+hZtiDeiSBlkFtlBfJLwGpofAfFO1EudbbcAiJmjAnE/ sgWw== X-Forwarded-Encrypted: i=1; AJvYcCXLD2EjpXmLqN0M0nJmRAIt5dU8y5cnQQR/XAxqibyPKPdttUZpMXIYtLWAYYSQUAYeQ3o1r8Wp7/APJ9NQpC/GtLMx/Zl9v7ilQkB3cxEhUXmyuF0obcubaEQ5WNSMSxZSJYOYHRCOZ3z0ZyJPOg== X-Gm-Message-State: AOJu0Yyt/VASyJBNw4xz0zoQ4FVjxku5i5PyPSsqzwZlMy/KO9YMvvdU iIxEpwmHf8pY1GAGocODWThc8KmXVQA0SKQ8MhmkssqVgOQesb+t X-Google-Smtp-Source: AGHT+IGe2OCJaquwbP/OchP9XmBylQc7QiFzIbAEjbHOCU9+P+bDhi8+i+8I+UPNZ1t8iGvJeG3fgw== X-Received: by 2002:a05:6a20:9189:b0:1bf:d90:4665 with SMTP id adf61e73a8af0-1c0cc75d552mr3571074637.36.1720172607039; Fri, 05 Jul 2024 02:43:27 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.88]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2c99a9cd133sm2958138a91.38.2024.07.05.02.43.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 02:43:26 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v5 8/8] perf trace: Remove arg_fmt->is_enum, we can get that from the BTF type Date: Fri, 5 Jul 2024 17:43:00 +0800 Message-ID: <20240705094300.585156-9-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240705094300.585156-1-howardchu95@gmail.com> References: <20240705094300.585156-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo This is to pave the way for other BTF types, i.e. we try to find BTF type then use things like btf_is_enum(btf_type) that we cached to find the right strtoul and scnprintf routines. For now only enum is supported, all the other types simple return zero for scnprintf which makes it have the same behaviour as when BTF isn't available, i.e. fallback to no pretty printing. Ditto for strtoul. root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# Signed-off-by: Howard Chu Tested-by: Howard Chu Cc: Adrian Hunter Cc: Howard Chu Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/r/20240624181345.124764-9-howardchu95@gmail.c= om Signed-off-by: Arnaldo Carvalho de Melo --- 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