From nobody Wed Feb 11 14:01:05 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 047461A00F9; Mon, 24 Jun 2024 18:12:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252732; cv=none; b=KfXAUqvD4vAzHux6QpNfWuSxp2HoZ0qosi4+FfrW4rZBBLvoX91mob5ZdS2aeSxKZoOsld+EKEvGlOMiQ7oRJEGsjZ2SI5MesAXl3FE+cBkBIkXLItrIDgZ53KaJ/+MJ2g2bnDZ2fqPgltmkYSWPyPdts1/Y7eK86lP8xxgVZwo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252732; c=relaxed/simple; bh=GPYYtacLEM3yqElaCBzMe4/DGGia7xVwg4cZbV/pbSE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GkGgkfR/y9MkBzKu+VCS3NFGMfMxG061rctnPYIzlpXc9/u2nzLp05XNkrawfsyqv9/lO89ncvrvBToyhKUcdyk1O0Zz06ReyximIIfmN5/RfDWngsUM9hRlwu8WTQkShSThLDdbNJjjYCiBQ/0rS+tbq3HPCddDoPecS9znEq0= 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=UQDPtl+K; arc=none smtp.client-ip=209.85.210.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UQDPtl+K" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-7066c9741b7so1370828b3a.1; Mon, 24 Jun 2024 11:12:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719252730; x=1719857530; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=r0Vd/De1J9Bo8JQWZ7RX5Hl6z5NNgyu4XF00AImPHKw=; b=UQDPtl+Kwm/I7mHwrivbshsF2yXgXbXgJy2+2bmeEkCocCyJ69liD+S8KmWSgANNxt APZ3q9Tf1P5Qxx7a3fC8Mp4MXIuKkUtdChLKNlKBKXFhU0zHRPxArfh3Yh+sztY6ctTB UbzKqZg7ONmP4f0Vj7LlRy1gocLiw0P85D3t6VPh5tD2jaeaTfYwc8k+AzyI+/cPkJeb 6vUFq4rp9N+zzA4qCC9paEruyd1C1ztaCWWLhJ5utolZFy5OaNu4lXBgi4K/S+l2/A/u tWXlupng7OrXqO/bP8+zwi5+fwksurwdJCsVGc4vqs8c9zDqZIM1/wvsotjinjl3x7ye 0L0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719252730; x=1719857530; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=r0Vd/De1J9Bo8JQWZ7RX5Hl6z5NNgyu4XF00AImPHKw=; b=qSx7o4xKqr6sI6/uPWNh26/N/vepu3qRo+wEetX50r59UquhUKDWi5mUQ0VxslcLSU DDWRpZf3tH3tvxq8YmYy0lZnUUpPu1cBBTZ+ZfWlEoMZbNLrAHJJreIhQdE5udBqEK/5 0H4veR+1ox8pOtNUb6Ixk5Ul8DYA1ZUAXte69sTrbeze1Tfpc2jKHXG/m0znGn9InuYt ywOreK8fZDhPEE/IK3k169INvOCRIRIL7oCchl1U9nV2crflSmYIzEnXaiZYaFOTO5z7 qH+l8z02XzqXCoA9SjWqYNvp/HC5xQWiB8GvSIXeBpzKjH/lNQgFOl4PlngbCe5XvqZo dqPQ== X-Forwarded-Encrypted: i=1; AJvYcCWij2GM3H3lSaC0syECKrRBCmIZEj3mmfbDtQtsNAMNoy3WuHYFUPeIE/tSgi05RU4SBhLVONm9KHqaNumG2mMnEOXSDxMrwyyxCwRbloaAcoffLNNphliehU68wpweL96630a/vkWj0mn1/AP2YQ== X-Gm-Message-State: AOJu0YxILapAUpxtfiHQ1MjLZJQlgDptQxqFTwho7W+eyJquaMAtU11D oGKVmcUify3PE4sqsKYSM3aXYRiU22I3V/jzQyuMZY2PK8XB40z9 X-Google-Smtp-Source: AGHT+IG+A+QXvtugKJwhq+Q4EItWEpG+ZE+9YyXl2lHa2Nu3D+AAGbkM5di8Ac7Bn+qnVQm+WXY8aA== X-Received: by 2002:a05:6a00:2195:b0:706:6c38:31f3 with SMTP id d2e1a72fcca58-706745830e0mr5105490b3a.8.1719252730098; Mon, 24 Jun 2024 11:12:10 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.45]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70651290157sm6525157b3a.150.2024.06.24.11.12.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Jun 2024 11:12:09 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH v3 1/8] perf trace: Fix iteration of syscall ids in syscalltbl->entries Date: Tue, 25 Jun 2024 02:13:38 +0800 Message-ID: <20240624181345.124764-2-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240624181345.124764-1-howardchu95@gmail.com> References: <20240624181345.124764-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This is a bug found when implementing pretty-printing for the landlock_add_rule system call, I decided to send this patch separately because this is a serious bug that should be fixed fast. I wrote a test program to do landlock_add_rule syscall in a loop, yet perf trace -e landlock_add_rule freezes, giving no output. This bug is introduced by the false understanding of the variable "key" below: ``` for (key =3D 0; key < trace->sctbl->syscalls.nr_entries; ++key) { struct syscall *sc =3D trace__syscall_info(trace, NULL, key); ... } ``` The code above seems right at the beginning, but when looking at syscalltbl.c, I found these lines: ``` for (i =3D 0; i <=3D syscalltbl_native_max_id; ++i) if (syscalltbl_native[i]) ++nr_entries; entries =3D tbl->syscalls.entries =3D malloc(sizeof(struct syscall) * nr_en= tries); ... for (i =3D 0, j =3D 0; i <=3D syscalltbl_native_max_id; ++i) { if (syscalltbl_native[i]) { entries[j].name =3D syscalltbl_native[i]; entries[j].id =3D i; ++j; } } ``` meaning the key is merely an index to traverse the syscall table, instead of the actual syscall id for this particular syscall. So if one uses key to do trace__syscall_info(trace, NULL, key), because key only goes up to trace->sctbl->syscalls.nr_entries, for example, on my X86_64 machine, this number is 373, it will end up neglecting all the rest of the syscall, in my case, everything after `rseq`, because the traversal will stop at 373, and `rseq` is the last syscall whose id is lower than 373 in tools/perf/arch/x86/include/generated/asm/syscalls_64.c: ``` ... [334] =3D "rseq", [424] =3D "pidfd_send_signal", ... ``` The reason why the key is scrambled but perf trace works well is that key is used in trace__syscall_info(trace, NULL, key) to do trace->syscalls.table[id], this makes sure that the struct syscall returned actually has an id the same value as key, making the later bpf_prog matching all correct. After fixing this bug, I can do perf trace on 38 more syscalls, and because more syscalls are visible, we get 8 more syscalls that can be augmented. before: perf $ perf trace -vv --max-events=3D1 |& grep Reusing Reusing "open" BPF sys_enter augmenter for "stat" Reusing "open" BPF sys_enter augmenter for "lstat" Reusing "open" BPF sys_enter augmenter for "access" Reusing "connect" BPF sys_enter augmenter for "accept" Reusing "sendto" BPF sys_enter augmenter for "recvfrom" Reusing "connect" BPF sys_enter augmenter for "bind" Reusing "connect" BPF sys_enter augmenter for "getsockname" Reusing "connect" BPF sys_enter augmenter for "getpeername" Reusing "open" BPF sys_enter augmenter for "execve" Reusing "open" BPF sys_enter augmenter for "truncate" Reusing "open" BPF sys_enter augmenter for "chdir" Reusing "open" BPF sys_enter augmenter for "mkdir" Reusing "open" BPF sys_enter augmenter for "rmdir" Reusing "open" BPF sys_enter augmenter for "creat" Reusing "open" BPF sys_enter augmenter for "link" Reusing "open" BPF sys_enter augmenter for "unlink" Reusing "open" BPF sys_enter augmenter for "symlink" Reusing "open" BPF sys_enter augmenter for "readlink" Reusing "open" BPF sys_enter augmenter for "chmod" Reusing "open" BPF sys_enter augmenter for "chown" Reusing "open" BPF sys_enter augmenter for "lchown" Reusing "open" BPF sys_enter augmenter for "mknod" Reusing "open" BPF sys_enter augmenter for "statfs" Reusing "open" BPF sys_enter augmenter for "pivot_root" Reusing "open" BPF sys_enter augmenter for "chroot" Reusing "open" BPF sys_enter augmenter for "acct" Reusing "open" BPF sys_enter augmenter for "swapon" Reusing "open" BPF sys_enter augmenter for "swapoff" Reusing "open" BPF sys_enter augmenter for "delete_module" Reusing "open" BPF sys_enter augmenter for "setxattr" Reusing "open" BPF sys_enter augmenter for "lsetxattr" Reusing "openat" BPF sys_enter augmenter for "fsetxattr" Reusing "open" BPF sys_enter augmenter for "getxattr" Reusing "open" BPF sys_enter augmenter for "lgetxattr" Reusing "openat" BPF sys_enter augmenter for "fgetxattr" Reusing "open" BPF sys_enter augmenter for "listxattr" Reusing "open" BPF sys_enter augmenter for "llistxattr" Reusing "open" BPF sys_enter augmenter for "removexattr" Reusing "open" BPF sys_enter augmenter for "lremovexattr" Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr" Reusing "open" BPF sys_enter augmenter for "mq_open" Reusing "open" BPF sys_enter augmenter for "mq_unlink" Reusing "fsetxattr" BPF sys_enter augmenter for "add_key" Reusing "fremovexattr" BPF sys_enter augmenter for "request_key" Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch" Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat" Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat" Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat" Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat" Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "linkat" Reusing "open" BPF sys_enter augmenter for "symlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat" Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat" Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat" Reusing "connect" BPF sys_enter augmenter for "accept4" Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at" Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2" Reusing "open" BPF sys_enter augmenter for "memfd_create" Reusing "fremovexattr" BPF sys_enter augmenter for "execveat" Reusing "fremovexattr" BPF sys_enter augmenter for "statx" after perf $ perf trace -vv --max-events=3D1 |& grep Reusing Reusing "open" BPF sys_enter augmenter for "stat" Reusing "open" BPF sys_enter augmenter for "lstat" Reusing "open" BPF sys_enter augmenter for "access" Reusing "connect" BPF sys_enter augmenter for "accept" Reusing "sendto" BPF sys_enter augmenter for "recvfrom" Reusing "connect" BPF sys_enter augmenter for "bind" Reusing "connect" BPF sys_enter augmenter for "getsockname" Reusing "connect" BPF sys_enter augmenter for "getpeername" Reusing "open" BPF sys_enter augmenter for "execve" Reusing "open" BPF sys_enter augmenter for "truncate" Reusing "open" BPF sys_enter augmenter for "chdir" Reusing "open" BPF sys_enter augmenter for "mkdir" Reusing "open" BPF sys_enter augmenter for "rmdir" Reusing "open" BPF sys_enter augmenter for "creat" Reusing "open" BPF sys_enter augmenter for "link" Reusing "open" BPF sys_enter augmenter for "unlink" Reusing "open" BPF sys_enter augmenter for "symlink" Reusing "open" BPF sys_enter augmenter for "readlink" Reusing "open" BPF sys_enter augmenter for "chmod" Reusing "open" BPF sys_enter augmenter for "chown" Reusing "open" BPF sys_enter augmenter for "lchown" Reusing "open" BPF sys_enter augmenter for "mknod" Reusing "open" BPF sys_enter augmenter for "statfs" Reusing "open" BPF sys_enter augmenter for "pivot_root" Reusing "open" BPF sys_enter augmenter for "chroot" Reusing "open" BPF sys_enter augmenter for "acct" Reusing "open" BPF sys_enter augmenter for "swapon" Reusing "open" BPF sys_enter augmenter for "swapoff" Reusing "open" BPF sys_enter augmenter for "delete_module" Reusing "open" BPF sys_enter augmenter for "setxattr" Reusing "open" BPF sys_enter augmenter for "lsetxattr" Reusing "openat" BPF sys_enter augmenter for "fsetxattr" Reusing "open" BPF sys_enter augmenter for "getxattr" Reusing "open" BPF sys_enter augmenter for "lgetxattr" Reusing "openat" BPF sys_enter augmenter for "fgetxattr" Reusing "open" BPF sys_enter augmenter for "listxattr" Reusing "open" BPF sys_enter augmenter for "llistxattr" Reusing "open" BPF sys_enter augmenter for "removexattr" Reusing "open" BPF sys_enter augmenter for "lremovexattr" Reusing "fsetxattr" BPF sys_enter augmenter for "fremovexattr" Reusing "open" BPF sys_enter augmenter for "mq_open" Reusing "open" BPF sys_enter augmenter for "mq_unlink" Reusing "fsetxattr" BPF sys_enter augmenter for "add_key" Reusing "fremovexattr" BPF sys_enter augmenter for "request_key" Reusing "fremovexattr" BPF sys_enter augmenter for "inotify_add_watch" Reusing "fremovexattr" BPF sys_enter augmenter for "mkdirat" Reusing "fremovexattr" BPF sys_enter augmenter for "mknodat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchownat" Reusing "fremovexattr" BPF sys_enter augmenter for "futimesat" Reusing "fremovexattr" BPF sys_enter augmenter for "newfstatat" Reusing "fremovexattr" BPF sys_enter augmenter for "unlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "linkat" Reusing "open" BPF sys_enter augmenter for "symlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "readlinkat" Reusing "fremovexattr" BPF sys_enter augmenter for "fchmodat" Reusing "fremovexattr" BPF sys_enter augmenter for "faccessat" Reusing "fremovexattr" BPF sys_enter augmenter for "utimensat" Reusing "connect" BPF sys_enter augmenter for "accept4" Reusing "fremovexattr" BPF sys_enter augmenter for "name_to_handle_at" Reusing "fremovexattr" BPF sys_enter augmenter for "renameat2" Reusing "open" BPF sys_enter augmenter for "memfd_create" Reusing "fremovexattr" BPF sys_enter augmenter for "execveat" Reusing "fremovexattr" BPF sys_enter augmenter for "statx" TL;DR: These are the new syscalls that can be augmented Reusing "openat" BPF sys_enter augmenter for "open_tree" Reusing "openat" BPF sys_enter augmenter for "openat2" Reusing "openat" BPF sys_enter augmenter for "mount_setattr" Reusing "openat" BPF sys_enter augmenter for "move_mount" Reusing "open" BPF sys_enter augmenter for "fsopen" Reusing "openat" BPF sys_enter augmenter for "fspick" Reusing "openat" BPF sys_enter augmenter for "faccessat2" Reusing "openat" BPF sys_enter augmenter for "fchmodat2" as for the perf trace output: before perf $ perf trace -e faccessat2 --max-events=3D1 [no output] after perf $ ./perf trace -e faccessat2 --max-events=3D1 0.000 ( 0.037 ms): waybar/958 faccessat2(dfd: 40, filename: "uevent") = =3D 0 P.S. The reason why this bug was not found in the past five years is probably because it only happens to the newer syscalls whose id is greater, for instance, faccessat2 of id 439, which not a lot of people care about when using perf trace. Commiter notes: That and the fact that the BPF code was hidden before having to use -e, that got changed kinda recently when we switched to using BPF skels for augmenting syscalls in 'perf trace': =E2=AC=A2[acme@toolbox perf-tools-next]$ git log --oneline tools/perf/util/= bpf_skel/augmented_raw_syscalls.bpf.c a9f4c6c999008c92 perf trace: Collect sys_nanosleep first argument 29d16de26df17e94 perf augmented_raw_syscalls.bpf: Move 'struct timespec64' = to vmlinux.h 5069211e2f0b47e7 perf trace: Use the right bpf_probe_read(_str) variant for= reading user data 33b725ce7b988756 perf trace: Avoid compile error wrt redefining bool 7d9642311b6d9d31 perf bpf augmented_raw_syscalls: Add an assert to make sur= e sizeof(augmented_arg->value) is a power of two. 262b54b6c9396823 perf bpf augmented_raw_syscalls: Add an assert to make sur= e sizeof(saddr) is a power of two. 1836480429d173c0 perf bpf_skel augmented_raw_syscalls: Cap the socklen para= meter using &=3D sizeof(saddr) cd2cece61ac5f900 perf trace: Tidy comments related to BPF + syscall augment= ation 5e6da6be3082f77b perf trace: Migrate BPF augmentation to use a skeleton =E2=AC=A2[acme@toolbox perf-tools-next]$ =E2=AC=A2[acme@toolbox perf-tools-next]$ git show --oneline --pretty=3Drefe= rence 5e6da6be3082f77b | head -1 5e6da6be3082f77b (perf trace: Migrate BPF augmentation to use a skeleton, 2= 023-08-10) =E2=AC=A2[acme@toolbox perf-tools-next]$ I.e. from August, 2023. One had as well to ask for BUILD_BPF_SKEL=3D1, which now is default if all it needs is available on the system. I simplified the code to not expose the 'struct syscall' outside of tools/perf/util/syscalltbl.c, instead providing a function to go from the index to the syscall id: int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx); Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/lkml/ZmhlAxbVcAKoPTg8@x1 Signed-off-by: Howard Chu --- tools/perf/builtin-trace.c | 14 +++++++------- tools/perf/util/syscalltbl.c | 7 +++++++ tools/perf/util/syscalltbl.h | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index c42bc608954e..c4fa8191253d 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -3354,8 +3354,6 @@ static int trace__bpf_prog_sys_exit_fd(struct trace *= trace, int id) static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace = *trace, struct syscall *sc) { struct tep_format_field *field, *candidate_field; - int id; - /* * We're only interested in syscalls that have a pointer: */ @@ -3367,7 +3365,8 @@ static struct bpf_program *trace__find_usable_bpf_pro= g_entry(struct trace *trace return NULL; =20 try_to_find_pair: - for (id =3D 0; id < trace->sctbl->syscalls.nr_entries; ++id) { + for (int i =3D 0; i < trace->sctbl->syscalls.nr_entries; ++i) { + int id =3D syscalltbl__id_at_idx(trace->sctbl, i); struct syscall *pair =3D trace__syscall_info(trace, NULL, id); struct bpf_program *pair_prog; bool is_candidate =3D false; @@ -3456,10 +3455,10 @@ static int trace__init_syscalls_bpf_prog_array_maps= (struct trace *trace) { int map_enter_fd =3D bpf_map__fd(trace->skel->maps.syscalls_sys_enter); int map_exit_fd =3D bpf_map__fd(trace->skel->maps.syscalls_sys_exit); - int err =3D 0, key; + int err =3D 0; =20 - for (key =3D 0; key < trace->sctbl->syscalls.nr_entries; ++key) { - int prog_fd; + for (int i =3D 0; i < trace->sctbl->syscalls.nr_entries; ++i) { + int prog_fd, key =3D syscalltbl__id_at_idx(trace->sctbl, i); =20 if (!trace__syscall_enabled(trace, key)) continue; @@ -3505,7 +3504,8 @@ static int trace__init_syscalls_bpf_prog_array_maps(s= truct trace *trace) * first and second arg (this one on the raw_syscalls:sys_exit prog * array tail call, then that one will be used. */ - for (key =3D 0; key < trace->sctbl->syscalls.nr_entries; ++key) { + for (int i =3D 0; i < trace->sctbl->syscalls.nr_entries; ++i) { + int key =3D syscalltbl__id_at_idx(trace->sctbl, i); struct syscall *sc =3D trace__syscall_info(trace, NULL, key); struct bpf_program *pair_prog; int prog_fd; diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c index 63be7b58761d..0dd26b991b3f 100644 --- a/tools/perf/util/syscalltbl.c +++ b/tools/perf/util/syscalltbl.c @@ -123,6 +123,13 @@ int syscalltbl__id(struct syscalltbl *tbl, const char = *name) return sc ? sc->id : -1; } =20 +int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx) +{ + struct syscall *syscalls =3D tbl->syscalls.entries; + + return idx < tbl->syscalls.nr_entries ? syscalls[idx].id : -1; +} + int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *sysc= all_glob, int *idx) { int i; diff --git a/tools/perf/util/syscalltbl.h b/tools/perf/util/syscalltbl.h index a41d2ca9e4ae..2b53b7ed25a6 100644 --- a/tools/perf/util/syscalltbl.h +++ b/tools/perf/util/syscalltbl.h @@ -16,6 +16,7 @@ void syscalltbl__delete(struct syscalltbl *tbl); =20 const char *syscalltbl__name(const struct syscalltbl *tbl, int id); int syscalltbl__id(struct syscalltbl *tbl, const char *name); +int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx); =20 int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *sys= call_glob, int *idx); int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *sysc= all_glob, int *idx); --=20 2.45.2 From nobody Wed Feb 11 14:01:05 2026 Received: from mail-pg1-f172.google.com (mail-pg1-f172.google.com [209.85.215.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1A651A01C8; Mon, 24 Jun 2024 18:12:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252736; cv=none; b=aR17g0+vYLtwbaCfAeA3iEKfJ4mUDwFVeeRHoO//sjgt2/CVN89EAvoV+miwG31FAX01IqsiTeTIiVkVQ+1Df2NCTspeXoHlxuGWV3lZujG/sbVHqMWuXV+riMpqcQCen0HauoAmsts4IOJOiTg/fjySwke1vizm8yrp6dxFIf0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252736; c=relaxed/simple; bh=gY0vqIVyUSNtrEY12S2m/VtNGGIyLvl7wC5AjoLQHc4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uyAMg0xva9Yc8WZ6SISxqrl2O1ukrzbuuVZ8Yefbsyr/l2O+6FphiUYEZ0G7UoKpUC1QjcVUwcnKDJ89dNczjfaR61LgqJrPXA1J8YPuIHMZGUnJ30vOikNNEbT4eSMXtNnpfsyn5AnujfZOPuWyOCV0keH67eRy0bSzHpi0QXY= 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=EkBBlo32; arc=none smtp.client-ip=209.85.215.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EkBBlo32" Received: by mail-pg1-f172.google.com with SMTP id 41be03b00d2f7-6eab07ae82bso3231886a12.3; Mon, 24 Jun 2024 11:12:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719252734; x=1719857534; 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=0dallcXeut594oIefpaki2C5DN0vhvYg7qZx87rwFjg=; b=EkBBlo32vO0nTdNO5pOSxIA/txX6bpcRWF0Kt0XlYevVhenseUa6uzQonvfORq770U xFDlkvOG+TZ8jJ8keE6CTD8sQ5wHqEH6Bdr+Lj7vp27zBYao2cfkvvh+Uf3uLEQZrIQP hiUe1yJTwoTkWcymAKIrNYnB/6XTk++A7hevdGetCFmB+QWAorDIFy4b1igQQuGu1dyL mfSRWlIZoA6SG9afHM5jKNuVeqKU8rdkpAukh90yhyA3b/gplk932HeKV6Q8DEwYM1zm BSmlunz88ZIIDkXNmAd+g/cAV1Sq+DNEf7PIrwWZIIuK1SbNK/DNI7qwXQpciAMhzmSc sk/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719252734; x=1719857534; 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=0dallcXeut594oIefpaki2C5DN0vhvYg7qZx87rwFjg=; b=PJ2WvQkez31kZbG9iK8hnhF1xqghP7G2Eu8viELmdGnKN9kf5p6Mm5p/Y+1JjHP/Ny 8Eh3rbNKnmyJfZ5d18lknGcD8M7qtr1hj8UL2qQ5GOlr9G4rYNVvzX1Cfr61U1sAVH5i kPRzkkNrz2pV0ZiSqFyHq3RFM2XJugBX0R4Ov58GJYxPqX15HHP9la8QiEGy7ej8VoqB INCxknv6fXA9lPrOrkjsXs8/9mEVu6pfcJMFWaYjR0twMoY8qI13Q2TmwzHrEFd+TUbn MbWAT7V5wfDj+CNVnd2OzDtlae7pKFS9Z73pDaudQO5cSdEGFtZtdVujJJu/IRqDDBW8 Wgwg== X-Forwarded-Encrypted: i=1; AJvYcCWBJpyQKMMAstJUj/wkhbvGu+AOg48T96pwMblL+J0jNMMqqhQ03uHCc+y5sNizKbgJjxNwbCg2PHCexy7o43z9+7j0xRQMF/HurvzXUpZZui7WzJIQqxFQr9pR400dj5zKGG54g4uVzKwLMQJGUw== X-Gm-Message-State: AOJu0Ywirl2RGMcn8Xsyudw+p6CcbN/vQVJbeG1WxiQFC90/t3v0s7W7 ExzB0QMH/ZjApc5lEqL1GDwpbloSDKlQ5Rr/8mSYyuXDWtQkxHHO X-Google-Smtp-Source: AGHT+IHSmQIeHhBpZxfTj3BhjA8mR0xQdxu+b7cyDgGOlG7NcvatuMtuM9KCPUYcVbh0nOVaTsr0UA== X-Received: by 2002:a05:6a20:7517:b0:1af:cecb:b64a with SMTP id adf61e73a8af0-1bcf7e6f8c1mr3801959637.9.1719252733828; Mon, 24 Jun 2024 11:12:13 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.45]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70651290157sm6525157b3a.150.2024.06.24.11.12.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Jun 2024 11:12:13 -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 v3 2/8] perf trace: BTF-based enum pretty printing for syscall args Date: Tue, 25 Jun 2024 02:13:39 +0800 Message-ID: <20240624181345.124764-3-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240624181345.124764-1-howardchu95@gmail.com> References: <20240624181345.124764-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable In this patch, BTF is used to turn enum value to the corresponding name. There is only one system call that uses enum value as its argument, that is `landlock_add_rule()`. The vmlinux btf is loaded lazily, when user decided to trace the `landlock_add_rule` syscall. But if one decide to run `perf trace` without any arguments, the behaviour is to trace `landlock_add_rule`, so vmlinux btf will be loaded by default. The laziest behaviour is to load vmlinux btf when a `landlock_add_rule` syscall hits. But I think you could lose some samples when loading vmlinux btf at run time, for it can delay the handling of other samples. I might need your precious opinions on this... before: ``` perf $ ./perf trace -e landlock_add_rule 0.000 ( 0.008 ms): ldlck-test/438194 landlock_add_rule(rule_type: 2) = =3D -1 EBADFD (File descriptor in bad state) 0.010 ( 0.001 ms): ldlck-test/438194 landlock_add_rule(rule_type: 1) = =3D -1 EBADFD (File descriptor in bad state) ``` after: ``` perf $ ./perf trace -e landlock_add_rule 0.000 ( 0.029 ms): ldlck-test/438194 landlock_add_rule(rule_type: LAND= LOCK_RULE_NET_PORT) =3D -1 EBADFD (File descriptor in bad state) 0.036 ( 0.004 ms): ldlck-test/438194 landlock_add_rule(rule_type: LAND= LOCK_RULE_PATH_BENEATH) =3D -1 EBADFD (File descriptor in bad state) ``` Committer notes: Made it build with NO_LIBBPF=3D1, simplified btf_enum_fprintf(), see [1] for the discussion. Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Alexander Shishkin Cc: G=C3=BCnther Noack Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Micka=C3=ABl Sala=C3=BCn Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/lkml/20240613022757.3589783-1-howardchu95@gma= il.com Link: https://lore.kernel.org/lkml/ZnXAhFflUl_LV1QY@x1 # [1] Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-trace.c | 110 +++++++++++++++++++++++++++++++++++-- 1 file changed, 106 insertions(+), 4 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index c4fa8191253d..24e751bc0ecd 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 Wed Feb 11 14:01:05 2026 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1AD701A0710; Mon, 24 Jun 2024 18:12:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252739; cv=none; b=o6Gkxeejq/jzzfhe1UUc0T88WZjyF9adcX8XLI6HUhROt7TjuCNdlSX/v6S0P0mwyV/lHxQeJdXWQqKuNulWkmZ8dJdywN3mDoC+erUBq8vcpbEBEJ0EtZspVNNpRtwhc1/OlVbqX71AIgXKFThSxLz5o+dnDAtfu3h5g93GHQM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252739; c=relaxed/simple; bh=/Ajx0uxM/ZDX+C1rZktaJOE+lFQBPNz406x3FOep1Wg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ns6s+7zwwq9p09hujiB7I8K+/o7Rq7cljvgw/5VhKHPs2MLHy5ZXP5XLgRHMBQ/wxJO3PnNl5DoZj3AGanra9LzVIyB+EfzADOeRowcVCvd2GClVkIvnNgKSthOL2lKxWGckNd/liwsfmJzgj2kZQ7F+alHBVJWqeWBto/H2xkE= 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=COvCnqZs; arc=none smtp.client-ip=209.85.210.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="COvCnqZs" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-706680d3a25so1532994b3a.0; Mon, 24 Jun 2024 11:12:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719252737; x=1719857537; 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=+6TDj6IarO7f2nH3K+oeFTN1hONdWrft+X+VmD1Ka3k=; b=COvCnqZsqePHj40EkHnR0cuH1ugVn37DSORMB0v7oLzYi666zTBk2rwSGO0pDZtQVH 9dpXTnBlQE+pxCD+IO2b6Je/KJE9pfqTxlbFHFS8pk6bpcEC0I6eweV9cjJr6Rr6Q7BH 0xz6JLW1gyL5iVLNZuP7ULsUhEkBnp9rr4JE9N+IoXhaT/gcRhoVMxwySqdOtqo4shS8 i73oL88+BmpHXsltScMvOqkXp0C+WyDC0kXDnE2J7Gaa4Mmxy/Q8sMRtx+HDXeGAmzJv Iq7oJ9Pm8zjNhBPd+ym6MzIPIzQjUdRB0ONQrM51BBFoo4sTWlRjSWqOWTY4RXTp0Jio Rc9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719252737; x=1719857537; 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=+6TDj6IarO7f2nH3K+oeFTN1hONdWrft+X+VmD1Ka3k=; b=F778uTEElk+5XGsu7AiOY76lN+I+S7ltC9VfANUOvdVGkS0XNbgbY9ZOT5kDwCq6Mb 8xcgzGm5OYIZpBmugUtoXLwOLX1mSedEAnZqeB4KSbJEiLOrMYxiyF83+m/xb0FfWUzj oHxCQovsMPJSIdnC6vGKuxMngZv83iUpz6e2naVnVuHoCe1yT+PV28/miL1tvvB/fbbe 0pxIBg74oJtprLxUYxkMlZYwLlMn8iNkx8E8/WplJwKmmcTuEulQeH6lz9Tc6vXUISvJ srmG0aYV56JGkNISU/9smIhv3XM004TwVqjyqGOVvAtDolGllCx4w3d32LK7U2NUvV9A fQnw== X-Forwarded-Encrypted: i=1; AJvYcCXdI2QfFiWx0CX3uShBU+6INoS63vzBYxxzYF7I5LlDCCIf1vxEP2jgF5m3JkFTmHLOfGH/JdWQgEsLGynXr6GMM82vF5o6RcM9SL0fJQU8JFCQwFuVabimxiOQfoLiEEQ6Cgj7IvEAwqJpQa7D0A== X-Gm-Message-State: AOJu0YxAy115c7LPAhH9leArWMUQ2ynmqSM7GAfhurKdnjdTxAB0pm3I baPjJf7uoLwaaWBGEK1t8tVPTPhXW1d2RfDYvnoc2Ucnh5viK9Qs X-Google-Smtp-Source: AGHT+IF1VRhfz6Zu9zzvAsqhmWOhYwj1ZG4NJZwxJIgW+i4CqA0zJuZqq5WLJxNkRA37Bn+fbjfCyw== X-Received: by 2002:a05:6a00:b93:b0:706:616d:2215 with SMTP id d2e1a72fcca58-70670fd1f3dmr7804045b3a.21.1719252737419; Mon, 24 Jun 2024 11:12:17 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.45]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70651290157sm6525157b3a.150.2024.06.24.11.12.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Jun 2024 11:12:16 -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 v3 3/8] perf trace: Augment non-syscall tracepoints with enum arguments with BTF Date: Tue, 25 Jun 2024 02:13:40 +0800 Message-ID: <20240624181345.124764-4-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240624181345.124764-1-howardchu95@gmail.com> References: <20240624181345.124764-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before: perf $ ./perf trace -e timer:hrtimer_start --max-events=3D1 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff974466c25f18, function: = 0xffffffff89da5be0, expires: 377432432256753, softexpires: 377432432256753,= mode: 10) After: perf $ ./perf trace -e timer:hrtimer_start --max-events=3D1 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 4382442895089, softexpires: 4382442895089, mod= e: HRTIMER_MODE_ABS_PINNED_HARD) in which HRTIMER_MODE_ABS_PINNED_HARD is: perf $ pahole hrtimer_mode enum hrtimer_mode { HRTIMER_MODE_ABS =3D 0, HRTIMER_MODE_REL =3D 1, HRTIMER_MODE_PINNED =3D 2, HRTIMER_MODE_SOFT =3D 4, HRTIMER_MODE_HARD =3D 8, HRTIMER_MODE_ABS_PINNED =3D 2, HRTIMER_MODE_REL_PINNED =3D 3, HRTIMER_MODE_ABS_SOFT =3D 4, HRTIMER_MODE_REL_SOFT =3D 5, HRTIMER_MODE_ABS_PINNED_SOFT =3D 6, HRTIMER_MODE_REL_PINNED_SOFT =3D 7, HRTIMER_MODE_ABS_HARD =3D 8, HRTIMER_MODE_REL_HARD =3D 9, HRTIMER_MODE_ABS_PINNED_HARD =3D 10, HRTIMER_MODE_REL_PINNED_HARD =3D 11, }; Can also be tested by ./perf trace -e pagemap:mm_lru_insertion,timer:hrtimer_start,timer:hrtimer_= init,skb:kfree_skb --max-events=3D10 (Chose these 4 events because they happen quite frequently.) However some enum arguments may not be contained in vmlinux BTF. To see what enum arguments are supported, use: vmlinux_dir $ bpftool btf dump file /sys/kernel/btf/vmlinux > vmlinux vmlinux_dir $ while read l; do grep "ENUM '$l'" vmlinux; done < <(grep fie= ld:enum /sys/kernel/tracing/events/*/*/format | awk '{print $3}' | sort | u= niq) | awk '{print $3}' | sed "s/'\(.*\)'/\1/g" dev_pm_qos_req_type error_detector hrtimer_mode i2c_slave_event ieee80211_bss_type lru_list migrate_mode nl80211_auth_type nl80211_band nl80211_iftype numa_vmaskip_reason pm_qos_req_action pwm_polarity skb_drop_reason thermal_trip_type xen_lazy_mode xen_mc_extend_args xen_mc_flush_reason zone_type And what tracepoints have these enum types as their arguments: vmlinux_dir $ while read l; do grep "ENUM '$l'" vmlinux; done < <(grep fiel= d:enum /sys/kernel/tracing/events/*/*/format | awk '{print $3}' | sort | un= iq) | awk '{print $3}' | sed "s/'\(.*\)'/\1/g" > good_enums vmlinux_dir $ cat good_enums dev_pm_qos_req_type error_detector hrtimer_mode i2c_slave_event ieee80211_bss_type lru_list migrate_mode nl80211_auth_type nl80211_band nl80211_iftype numa_vmaskip_reason pm_qos_req_action pwm_polarity skb_drop_reason thermal_trip_type xen_lazy_mode xen_mc_extend_args xen_mc_flush_reason zone_type vmlinux_dir $ grep -f good_enums -l /sys/kernel/tracing/events/*/*/format /sys/kernel/tracing/events/cfg80211/cfg80211_chandef_dfs_required/format /sys/kernel/tracing/events/cfg80211/cfg80211_ch_switch_notify/format /sys/kernel/tracing/events/cfg80211/cfg80211_ch_switch_started_notify/format /sys/kernel/tracing/events/cfg80211/cfg80211_get_bss/format /sys/kernel/tracing/events/cfg80211/cfg80211_ibss_joined/format /sys/kernel/tracing/events/cfg80211/cfg80211_inform_bss_frame/format /sys/kernel/tracing/events/cfg80211/cfg80211_radar_event/format /sys/kernel/tracing/events/cfg80211/cfg80211_ready_on_channel_expired/format /sys/kernel/tracing/events/cfg80211/cfg80211_ready_on_channel/format /sys/kernel/tracing/events/cfg80211/cfg80211_reg_can_beacon/format /sys/kernel/tracing/events/cfg80211/cfg80211_return_bss/format /sys/kernel/tracing/events/cfg80211/cfg80211_tx_mgmt_expired/format /sys/kernel/tracing/events/cfg80211/rdev_add_virtual_intf/format /sys/kernel/tracing/events/cfg80211/rdev_auth/format /sys/kernel/tracing/events/cfg80211/rdev_change_virtual_intf/format /sys/kernel/tracing/events/cfg80211/rdev_channel_switch/format /sys/kernel/tracing/events/cfg80211/rdev_connect/format /sys/kernel/tracing/events/cfg80211/rdev_inform_bss/format /sys/kernel/tracing/events/cfg80211/rdev_libertas_set_mesh_channel/format /sys/kernel/tracing/events/cfg80211/rdev_mgmt_tx/format /sys/kernel/tracing/events/cfg80211/rdev_remain_on_channel/format /sys/kernel/tracing/events/cfg80211/rdev_return_chandef/format /sys/kernel/tracing/events/cfg80211/rdev_return_int_survey_info/format /sys/kernel/tracing/events/cfg80211/rdev_set_ap_chanwidth/format /sys/kernel/tracing/events/cfg80211/rdev_set_monitor_channel/format /sys/kernel/tracing/events/cfg80211/rdev_set_radar_background/format /sys/kernel/tracing/events/cfg80211/rdev_start_ap/format /sys/kernel/tracing/events/cfg80211/rdev_start_radar_detection/format /sys/kernel/tracing/events/cfg80211/rdev_tdls_channel_switch/format /sys/kernel/tracing/events/compaction/mm_compaction_defer_compaction/format /sys/kernel/tracing/events/compaction/mm_compaction_deferred/format /sys/kernel/tracing/events/compaction/mm_compaction_defer_reset/format /sys/kernel/tracing/events/compaction/mm_compaction_finished/format /sys/kernel/tracing/events/compaction/mm_compaction_kcompactd_wake/format /sys/kernel/tracing/events/compaction/mm_compaction_suitable/format /sys/kernel/tracing/events/compaction/mm_compaction_wakeup_kcompactd/format /sys/kernel/tracing/events/error_report/error_report_end/format /sys/kernel/tracing/events/i2c_slave/i2c_slave/format /sys/kernel/tracing/events/migrate/mm_migrate_pages/format /sys/kernel/tracing/events/migrate/mm_migrate_pages_start/format /sys/kernel/tracing/events/pagemap/mm_lru_insertion/format /sys/kernel/tracing/events/power/dev_pm_qos_add_request/format /sys/kernel/tracing/events/power/dev_pm_qos_remove_request/format /sys/kernel/tracing/events/power/dev_pm_qos_update_request/format /sys/kernel/tracing/events/power/pm_qos_update_flags/format /sys/kernel/tracing/events/power/pm_qos_update_target/format /sys/kernel/tracing/events/pwm/pwm_apply/format /sys/kernel/tracing/events/pwm/pwm_get/format /sys/kernel/tracing/events/sched/sched_skip_vma_numa/format /sys/kernel/tracing/events/skb/kfree_skb/format /sys/kernel/tracing/events/thermal/thermal_zone_trip/format /sys/kernel/tracing/events/timer/hrtimer_init/format /sys/kernel/tracing/events/timer/hrtimer_start/format /sys/kernel/tracing/events/xen/xen_mc_batch/format /sys/kernel/tracing/events/xen/xen_mc_extend_args/format /sys/kernel/tracing/events/xen/xen_mc_flush_reason/format /sys/kernel/tracing/events/xen/xen_mc_issue/format Committer testing: root@x1:~# perf trace -e timer:hrtimer_start --max-events=3D2 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff225050, function= : 0xffffffff9e22ddd0, expires: 241152380000000, softexpires: 24115238000000= 0, mode: HRTIMER_MODE_ABS) 0.028 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff225050, function= : 0xffffffff9e22ddd0, expires: 241153654000000, softexpires: 24115365400000= 0, mode: HRTIMER_MODE_ABS_PINNED_HARD) root@x1:~# Suggested-by: Arnaldo Carvalho de Melo Reviewed-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/lkml/20240615032743.112750-1-howardchu95@gmai= l.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-trace.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 24e751bc0ecd..b75d96a4ad55 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 Wed Feb 11 14:01:05 2026 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8B5981A0737; Mon, 24 Jun 2024 18:12:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252743; cv=none; b=rJW5+aY+Rb/kkSlu3V4r4rMjckJ2hXvnLinjqNd1ZSiwzg1Of0++qBeVBPP/XF0pGPU6xfLc50eOicAryS46hYeV7QML3xT2hvnrE0bw1xOF1BglNXSUVLyDnxUw6bQC5J6xRzII8FroYE/te8Dyv/fOGz1YJ4JCqc7sowlGyDE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252743; c=relaxed/simple; bh=FCflzXRfIBkmPrsJBiVLv4B/Bs+p5pIjpGSmNemb7DU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sH5yUikaVtQxBrM1muJKraniIlsV2IuZDTiNetDWj4SC4GF0L19wbEoidHXw8WDypS/jxfwBTBHjgLVaY41JaIix+ul0x4C+7wRXtmeCO8dfzVIuRaeyzGRXs85lzrqNOiadjkqrKm+WDR/KrnWcOdPIYQGGNOn7UbP2t4VrgM8= 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=OV6dsw/A; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OV6dsw/A" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-70670188420so1499968b3a.2; Mon, 24 Jun 2024 11:12:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719252741; x=1719857541; 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=lfFvNRUd3k0l2BbDbdovkMoUJ9munmVB6DMhjUi2umk=; b=OV6dsw/ASJZ8EMiFg4NhLBlONfxt7qhYvXnQhTI2d9sZv17MS2/3Rk9gzH8pZx0CvJ aEDZKl8yLtCuJeTp+iaAEEneLNZQPdL2oOKqd0PeeC8AF7pGZAMlDKKq63qODR3lA+5U bhwPljZOVKvoqfT6y4hWn7EksX9rZAmDSIzRmU9L5jxyQIRR+/HCOVleN75IW+PNPYBS D5haAwoLUxAYuwZTvgcmLHgN39CQUb0ZaYCZQ7Tf+kYqKX7WgESn0GKR/F4VUXy0SBEq 5ilzkImyPLEDSMY0fXbAxJP0B94YkLPkQ6Z7LHCzAnFkz1TtNJH0ylSV+7zvkL+HaCiq 3PKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719252741; x=1719857541; 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=lfFvNRUd3k0l2BbDbdovkMoUJ9munmVB6DMhjUi2umk=; b=Pw693KZTh1fEYp8YZvm7Lc4qQdVxdvCE11ZyRi3/4heVScXfRWxbUFsPmi4DSS1fO7 /arNEx4iBYZDAcGNtY3iw09Y0WAsPICUE7Zn+mWAoKJ8bDnyw6rUcfYTuWvT0Gl71rVV bh99NOQEET6o41MC4pxPqpsdwKx1PlCHuMvob5bUau8BU0mtpltB464OZzk9IYoNJpq+ jv1W7oFuM9rqy+whX7zKkIsnl/0QnOCgdpF1E1rL6Qhwsxt16o5J1x5Lfj19MkTpB1y/ L3j4b1Jv5633aCNtEhFCgo3wOi+x+tP35E0ZTttUp9eMmp+stlVCQz1yUkKSFRlANjDH pApg== X-Forwarded-Encrypted: i=1; AJvYcCWJGDxiGosxhkovWK3fqO7CDvtZEiCEcKyh5/955ePgheEbduayeRh5hwewi/5mEUAfi1QvVsnIVXV/HU0jgXYVZuOYsSWaDCwVt8u/5YB8x4p+/+6lyfGN/ZWW0/ohCAQbPaAKc9YgfUkgCUnT9g== X-Gm-Message-State: AOJu0YzPuIVzYjIjS5UrWW9q3cqa6R3X4Uxu9DICqy9stw8h9S8nuXRv XAtcHrjILtueBAU2AGX0WVfwuPnDaC9cIZ8hiKzsGnov4vUbRObc X-Google-Smtp-Source: AGHT+IHClCSMjxca4Uj2fkM9yj5SluBqQMZN7gbvGZOiuuo91xhHQxe957FhV91D0R3Typ/ET3J6IA== X-Received: by 2002:aa7:93cb:0:b0:706:65f6:3ab9 with SMTP id d2e1a72fcca58-7066e55590bmr4947056b3a.20.1719252740753; Mon, 24 Jun 2024 11:12:20 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.45]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70651290157sm6525157b3a.150.2024.06.24.11.12.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Jun 2024 11:12:20 -0700 (PDT) From: Howard Chu To: acme@kernel.org Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org, kan.liang@linux.intel.com, namhyung@kernel.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo , Alexander Shishkin , Ingo Molnar , Mark Rutland , Peter Zijlstra Subject: [PATCH v3 4/8] perf trace: Filter enum arguments with enum names Date: Tue, 25 Jun 2024 02:13:41 +0800 Message-ID: <20240624181345.124764-5-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240624181345.124764-1-howardchu95@gmail.com> References: <20240624181345.124764-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before: perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode!=3DHRTIMER_MODE= _ABS_PINNED_HARD' --max-events=3D1 No resolver (strtoul) for "mode" in "timer:hrtimer_start", can't set filter= "(mode!=3DHRTIMER_MODE_ABS_PINNED_HARD) && (common_pid !=3D 281988)" After: perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode!=3DHRTIMER_MODE= _ABS_PINNED_HARD' --max-events=3D1 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 12351248764875, softexpires: 12351248764875, m= ode: HRTIMER_MODE_ABS) && and ||: perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode !=3D HRTIMER_MO= DE_ABS_PINNED_HARD && mode !=3D HRTIMER_MODE_ABS' --max-events=3D1 0.000 Hyprland/534 timer:hrtimer_start(hrtimer: 0xffff9497801a84d0, fu= nction: 0xffffffffc04cdbe0, expires: 12639434638458, softexpires: 126394336= 38458, mode: HRTIMER_MODE_REL) perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode =3D=3D HRTIMER_= MODE_REL || mode =3D=3D HRTIMER_MODE_PINNED' --max-events=3D1 0.000 ldlck-test/60639 timer:hrtimer_start(hrtimer: 0xffffb16404ee7bf8= , function: 0xffffffffa7790420, expires: 12772614418016, softexpires: 12772= 614368016, mode: HRTIMER_MODE_REL) Switching it up, using both enum name and integer value(--filter=3D'mode = =3D=3D HRTIMER_MODE_ABS_PINNED_HARD || mode =3D=3D 0'): perf $ ./perf trace -e timer:hrtimer_start --filter=3D'mode =3D=3D HRTIMER_= MODE_ABS_PINNED_HARD || mode =3D=3D 0' --max-events=3D3 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 12601748739825, softexpires: 12601748739825, m= ode: HRTIMER_MODE_ABS_PINNED_HARD) 0.036 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: = 0xffffffffa77a5be0, expires: 12518758748124, softexpires: 12518758748124, m= ode: HRTIMER_MODE_ABS_PINNED_HARD) 0.172 tmux: server/41881 timer:hrtimer_start(hrtimer: 0xffffb164081e78= 38, function: 0xffffffffa7790420, expires: 12518768255836, softexpires: 125= 18768205836, mode: HRTIMER_MODE_ABS) P.S. perf $ pahole hrtimer_mode enum hrtimer_mode { HRTIMER_MODE_ABS =3D 0, HRTIMER_MODE_REL =3D 1, HRTIMER_MODE_PINNED =3D 2, HRTIMER_MODE_SOFT =3D 4, HRTIMER_MODE_HARD =3D 8, HRTIMER_MODE_ABS_PINNED =3D 2, HRTIMER_MODE_REL_PINNED =3D 3, HRTIMER_MODE_ABS_SOFT =3D 4, HRTIMER_MODE_REL_SOFT =3D 5, HRTIMER_MODE_ABS_PINNED_SOFT =3D 6, HRTIMER_MODE_REL_PINNED_SOFT =3D 7, HRTIMER_MODE_ABS_HARD =3D 8, HRTIMER_MODE_REL_HARD =3D 9, HRTIMER_MODE_ABS_PINNED_HARD =3D 10, HRTIMER_MODE_REL_PINNED_HARD =3D 11, }; Committer testing: root@x1:~# perf trace -e timer:hrtimer_start --filter=3D'mode !=3D HRTIME= R_MODE_ABS' --max-events=3D2 0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff2a5050, function= : 0xffffffff9e22ddd0, expires: 241502326000000, softexpires: 24150232600000= 0, mode: HRTIMER_MODE_ABS_PINNED_HARD) 18446744073709.488 :0/0 timer:hrtimer_start(hrtimer: 0xffff8d4eff425050, = function: 0xffffffff9e22ddd0, expires: 241501814000000, softexpires: 241501= 814000000, mode: HRTIMER_MODE_ABS_PINNED_HARD) root@x1:~# perf trace -e timer:hrtimer_start --filter=3D'mode !=3D HRTIME= R_MODE_ABS && mode !=3D HRTIMER_MODE_ABS_PINNED_HARD' --max-events=3D2 0.000 podman/510644 timer:hrtimer_start(hrtimer: 0xffffa2024f5f7dd0,= function: 0xffffffff9e2170c0, expires: 241530497418194, softexpires: 24153= 0497368194, mode: HRTIMER_MODE_REL) 40.251 gnome-shell/2484 timer:hrtimer_start(hrtimer: 0xffff8d48bda176= 50, function: 0xffffffffc0661550, expires: 241550528619247, softexpires: 24= 1550527619247, mode: HRTIMER_MODE_REL) root@x1:~# perf trace -v -e timer:hrtimer_start --filter=3D'mode !=3D HRT= IMER_MODE_ABS && mode !=3D HRTIMER_MODE_ABS_PINNED_HARD && mode !=3D HRTIME= R_MODE_REL' --max-events=3D2 Using CPUID GenuineIntel-6-BA-3 vmlinux BTF loaded 0 0xa 0x1 New filter for timer:hrtimer_start: (mode !=3D 0 && mode !=3D 0xa && mode= !=3D 0x1) && (common_pid !=3D 524049 && common_pid !=3D 4041) mmap size 528384B ^Croot@x1:~# Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/lkml/ZnCcliuecJABD5FN@x1 Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-trace.c | 62 ++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index b75d96a4ad55..774bb3534df4 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 Wed Feb 11 14:01:05 2026 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 1E9021A08A8; Mon, 24 Jun 2024 18:12:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252745; cv=none; b=cpfYUnwh7jUmAia6FqhnM/2xOEhzZGfpZ8sqs9DSE/ZD2UjSg2HeAHKNq/t5stVU+Zkz6WPLuEgnvOpGU7kE57tFVu3fhhTS5KkH+j5ov6K598QOlPDnRWYd6frgintVfQnyIggUA0Jwp4VKHQYb6e7Kf5DRCslffSdUXIBuHCA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252745; c=relaxed/simple; bh=Xxu2cF1DYbOothRmHz4eQa19j0TXjNAHN20rKPtH7v8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UKLFtxMevrgdK9ZqhXBmjky+5RfhnPuBpMp0a/GlfbQWg0qzGxWs5tTE1ORQmCtIFWJ/hdd0FzqBNqN+IZfbDaG3pdFRlnLMgS8M0h5zU8XaNC6CL2mYTHrYT3wo54mtqHNe3cVDgYbiaut4AdjhPOyYE7hJMbgbpI6vv+t+YsA= 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=NoiSsye2; arc=none smtp.client-ip=209.85.210.179 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="NoiSsye2" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-706738c209bso1147400b3a.3; Mon, 24 Jun 2024 11:12:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719252743; x=1719857543; 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=y3AUz69t4q5Dyd9Jj2leluDE0X4TKCDyQHDmDKxMG9Q=; b=NoiSsye2krW5ASIkskHhhtAW8F71DReQOs+pdxFcyKQxblNITdp5VgQ0k6n6Lbs7OX oTF+FEUWqsRI5cHiwnzQzdSUbp4R+M5D/2eoZKAvyV+s2M9fuvt1QIhAhPrIcSW6cVzz yNbYEBQe67XMZJKtsgYJGjSMyM7lGUgZCyN/JIdjm0wBJUQO9XvzE9lLkR6UJ0o2g3Ln rozVd+3pX+QmJqipYvi0wRAqHX8+K9JqIl24bMxd0ylY4utxu6C/VBaaNYHB2/9es7J4 OyTimegU3hy43ClhyRBBSsv+j+RegaE0rF8ljojBBcOWSXnRK6VlQQA7W59ABO8KFZu5 IG0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719252743; x=1719857543; 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=y3AUz69t4q5Dyd9Jj2leluDE0X4TKCDyQHDmDKxMG9Q=; b=XxmjSmXdOVWpDwlw4iXhX5+WsFGkJoL1KA/SOIljMQYiwuwCzki1UHIBf0GVK3wLbF stkGn9Hf2v1uxYwaf3dmc1MH16vvV02rmSdgXIjZfQS4JoFcYv9t9HurQUdKtWT6kR5m Eilq3fdFbuwwLgMhJw2KX3vyaKm0KMnOKt8ciKPqQFfXJ7iqkcaNxyliWxj1F+AWDKg9 F8esnGp7U3yf/b/F2KVVtAz56q8e0J8Yo7UoZGUlSSzomV7nBAnBVouondUV8g4zdVi7 5vq2gccYQe9E82LQ0EmvTZw87JnEam4l8tbu3DOLGL/x5LCzyFUcwS4dTh/AQEHEvuTS D/kQ== X-Forwarded-Encrypted: i=1; AJvYcCV4j0t6K3ZTZVsxwqgsVvjoVcO+OO6ZgrLCVNRGYzsLcH3QkrZJ0XN65aQViSIJxguYNDZnyk33/SVbkLdSq4kLTpEMCV8k0gsQcaX3pdg8bsAzCVWi8PCNiScYwwoHrubGIKGb/x3hyXWuwUoajg== X-Gm-Message-State: AOJu0YxK4slTfL5tvN4w9ovCoxMJqfbTo9zOJCr8/YdYHUtSK9y/fw+q wR4DdFOx/8TiSRnoLSLFjNwtcwVmDPFjSs5sp66lVvelPKXjB+ZQ X-Google-Smtp-Source: AGHT+IFK4472nMsShIiuGhiBpceHsqJysW4TWrwb21FB1ql+3SBsjlvv+8J8BparUTpRQ/sCUy94MQ== X-Received: by 2002:a05:6a00:c8e:b0:704:2811:62 with SMTP id d2e1a72fcca58-706745be4c5mr6286194b3a.13.1719252743330; Mon, 24 Jun 2024 11:12:23 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.45]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70651290157sm6525157b3a.150.2024.06.24.11.12.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Jun 2024 11:12:23 -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 v3 5/8] perf test: Add landlock workload Date: Tue, 25 Jun 2024 02:13:42 +0800 Message-ID: <20240624181345.124764-6-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240624181345.124764-1-howardchu95@gmail.com> References: <20240624181345.124764-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. 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 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 | 1 + tools/perf/tests/workloads/landlock.c | 39 +++++++++++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 tools/perf/tests/workloads/landlock.c diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-tes= t.c index c3d84b67ca8e..470a9709427d 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -152,6 +152,7 @@ static struct test_workload *workloads[] =3D { &workload__sqrtloop, &workload__brstack, &workload__datasym, + &workload__landlock, }; =20 static int num_subtests(const struct test_suite *t) diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index 3aa7701ee0e9..6ea2be86b7bf 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -205,6 +205,7 @@ DECLARE_WORKLOAD(leafloop); DECLARE_WORKLOAD(sqrtloop); DECLARE_WORKLOAD(brstack); DECLARE_WORKLOAD(datasym); +DECLARE_WORKLOAD(landlock); =20 extern const char *dso_to_test; extern const char *test_objdump_path; diff --git a/tools/perf/tests/workloads/Build b/tools/perf/tests/workloads/= Build index a1f34d5861e3..cc5cbf5909ea 100644 --- a/tools/perf/tests/workloads/Build +++ b/tools/perf/tests/workloads/Build @@ -6,6 +6,7 @@ perf-y +=3D leafloop.o perf-y +=3D sqrtloop.o perf-y +=3D brstack.o perf-y +=3D datasym.o +perf-y +=3D landlock.o =20 CFLAGS_sqrtloop.o =3D -g -O0 -fno-inline -U_FORTIFY_SOURCE CFLAGS_leafloop.o =3D -g -O0 -fno-inline -fno-omit-frame-pointer -= U_FORTIFY_SOURCE diff --git a/tools/perf/tests/workloads/landlock.c b/tools/perf/tests/workl= oads/landlock.c new file mode 100644 index 000000000000..35df2389155a --- /dev/null +++ b/tools/perf/tests/workloads/landlock.c @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include +#include // for __NR_landlock_add_rule +#include +#include "../tests.h" +#include +#ifdef __NR_landlock_add_rule +#include +#endif + +/* This workload is used only to test enum augmentation with BTF in perf t= race */ +static int landlock(int argc __maybe_unused, const char **argv __maybe_unu= sed) +{ +#if defined(__NR_landlock_add_rule) && defined(HAVE_LIBBPF_SUPPORT) + int fd =3D 11, flags =3D 45; + + struct landlock_path_beneath_attr path_beneath_attr =3D { + .allowed_access =3D LANDLOCK_ACCESS_FS_READ_FILE, + .parent_fd =3D 14, + }; + + struct landlock_net_port_attr net_port_attr =3D { + .port =3D 19, + .allowed_access =3D LANDLOCK_ACCESS_NET_CONNECT_TCP, + }; + + syscall(__NR_landlock_add_rule, fd, LANDLOCK_RULE_PATH_BENEATH, + &path_beneath_attr, flags); + + syscall(__NR_landlock_add_rule, fd, LANDLOCK_RULE_NET_PORT, + &net_port_attr, flags); + + return 0; +#else + return 2; +#endif +} + +DEFINE_WORKLOAD(landlock); --=20 2.45.2 From nobody Wed Feb 11 14:01:05 2026 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B04D81A08D3; Mon, 24 Jun 2024 18:12:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252748; cv=none; b=DwMIxlxOJr+6L4/2x79Ws6acikj4SJtnCTKA25u5KRKoe9wjneqD5G/vyybGR4JSwdZJVsKcbhyMlGBpPKHG1aGjEGF9iOxphVDVzk+C0d8mJu0VrBb15gqQNigdA+dZiQ5T7bBGAYs18/ockdYupu0YuSw/qrsomKQEt5tL1pQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252748; c=relaxed/simple; bh=BEB58jmhgFBt8hBVpkDwswlsxmcPeMe5P4dNnOzglMw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PRwqNhIxc8+Ku0CKRBQF5cckCqU5iwpn3ixgJRhj300j1lINQG6chOF9SQAbj1dvza9Me4Zndel13+Lsut5V+pERaLzhB/KT3oMYU0dYu8F+i1tB/SauKp5VPElI8a6FtuiNnJ34ZQTCShBBm+pP0UZUAOrIUI8XM94Vf+sdOgQ= 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=PSkYDhIo; arc=none smtp.client-ip=209.85.210.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PSkYDhIo" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-70675977d0eso1566792b3a.0; Mon, 24 Jun 2024 11:12:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719252746; x=1719857546; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lkbwA9Ypz3p6Kbh2EzTzzipYEVc7UpegE9m4rYBdh/I=; b=PSkYDhIo33unuX0h5PVh/sOk4nWvVoFg6WECpheidf4PpiKKNQ90Wa+7TCPNtz9596 DIx9SNXHlVRWwAgSBkhE85TjtS4xhshEABGWkpNYBjrb9HDRmJnhmRb/QUprusvkmGeq TKya0/F5N/ahGSgxsaJZpGSQbU1Szri4fwhhLlG9y0qUOJy+ZT8c/KEa6qxS5GX1+cA3 /MSq/HmKNAvqpOxLYkNY63s1VE9EOeaUSojueSVWJP4yStU12C69ZcLtsxQGunrCP8V2 Vrb+/vWLytdIgLPC7azCOpoWOzSdx/Iwq/KUE0mrkRoTFTjKckuZbEJDBk7n+5w0oAx3 sowg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719252746; x=1719857546; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lkbwA9Ypz3p6Kbh2EzTzzipYEVc7UpegE9m4rYBdh/I=; b=u32VGGIY2b4dlDysBWuOYBgZkYdZzyzWIZGei/UWyDNFiNtFSu8G/oxqYJh2uY68K3 nc2mestWIlgFos4y37ejaeArf+qp3EHIgYINzVJ62O5pUhGPE/dLmzIhNf6dLt4wLuYl tufvKvmmi5n8AeU7xV9hewbG/RBbOlgxLZr0g3oplR0hj8Kfb8btW4petllgV8DeI0dk N9cIfWFQfMY55PkSD7iPRnuC4SNY+YqEy6YP2mNXoXV8s903T6QeMkuBndHMGkniO5Z0 QA45IpL735QOU+1pjrrjTiFr/oASxs519/486ej5/dTzWf7BA9YvevODFEsxaAtIDpqb HzNQ== X-Forwarded-Encrypted: i=1; AJvYcCWTEiEpx4j2hzRlxHZbyBhx7NiRceIEOLIJ0Y4veWpZul/N4tBE7im5HtxHffZRCh4PXWEm70Yzu33FiFyYytIvjIfqY7qk9dI2QdHDk5AKMETOO+Ni9PxKhMmoB9P/ST8lXeRh5gYk5a0pZR5Apw== X-Gm-Message-State: AOJu0Yz/MvfBnDZbIzNz1p8HoS5JDj/sNsCqPHDAEgfOXYGEim8qEkju buM6KvV7cWNwl128K84NMHxBqLjdslLom1+RBKgHmXvNiWdxcXZZ X-Google-Smtp-Source: AGHT+IHo/q+eKujXArhfP7gB2Y0dwQ8xkaKeJ5W+N7ZI1l4/0olgDehxoW4Mwq8FEWDMEa1jApC90A== X-Received: by 2002:a05:6a20:daa8:b0:1b4:3f96:f1d8 with SMTP id adf61e73a8af0-1bcf7e6a5e3mr5248832637.13.1719252745926; Mon, 24 Jun 2024 11:12:25 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.45]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70651290157sm6525157b3a.150.2024.06.24.11.12.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Jun 2024 11:12:25 -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 v3 6/8] perf test trace_btf_enum: Add regression test for the BTF augmentation of enums in 'perf trace' Date: Tue, 25 Jun 2024 02:13:43 +0800 Message-ID: <20240624181345.124764-7-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240624181345.124764-1-howardchu95@gmail.com> References: <20240624181345.124764-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Trace landlock_add_rule syscall to see if the output is desirable. Trace the non-syscall tracepoint 'timer:hrtimer_init' and 'timer:hrtimer_start', see if the 'mode' argument is augmented, the 'mode' enum argument has the prefix of 'HRTIMER_MODE_' in its name. Committer testing: root@x1:~# perf test enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf trace -e landlock_add_rule perf test -v enum 0.000 ( 0.010 ms): perf/749827 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd324171d4, flags: 45) = =3D -1 EINVAL (Invalid argument) 0.012 ( 0.002 ms): perf/749827 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd324171e0, flags: 45) =3D -= 1 EINVAL (Invalid argument) 457.821 ( 0.007 ms): perf/749830 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7ffd4acd31e4, flags: 45) = =3D -1 EINVAL (Invalid argument) 457.832 ( 0.003 ms): perf/749830 landlock_add_rule(ruleset_fd: 11, rul= e_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7ffd4acd31f0, flags: 45) =3D -= 1 EINVAL (Invalid argument) 124: perf trace enum augmentation tests : Ok root@x1:~# Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu Tested-by: Arnaldo Carvalho de Melo Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/lkml/20240619082042.4173621-6-howardchu95@gma= il.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/tests/shell/trace_btf_enum.sh | 61 ++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 tools/perf/tests/shell/trace_btf_enum.sh diff --git a/tools/perf/tests/shell/trace_btf_enum.sh b/tools/perf/tests/sh= ell/trace_btf_enum.sh new file mode 100755 index 000000000000..7d407b52bea5 --- /dev/null +++ b/tools/perf/tests/shell/trace_btf_enum.sh @@ -0,0 +1,61 @@ +#!/bin/sh +# perf trace enum augmentation tests +# SPDX-License-Identifier: GPL-2.0 + +err=3D0 +set -e + +syscall=3D"landlock_add_rule" +non_syscall=3D"timer:hrtimer_init,timer:hrtimer_start" + +TESTPROG=3D"perf test -w landlock" + +. "$(dirname $0)"/lib/probe.sh +skip_if_no_perf_trace || exit 2 + +check_vmlinux() { + echo "Checking if vmlinux exists" + if ! ls /sys/kernel/btf/vmlinux 1>/dev/null 2>&1 + then + echo "trace+enum test [Skipped missing vmlinux BTF support]" + err=3D2 + fi +} + +trace_landlock() { + echo "Tracing syscall ${syscall}" + + # test flight just to see if landlock_add_rule and libbpf are available + $TESTPROG + + if perf trace -e $syscall $TESTPROG 2>&1 | \ + grep -q -E ".*landlock_add_rule\(ruleset_fd: 11, rule_type: (LANDLOCK= _RULE_PATH_BENEATH|LANDLOCK_RULE_NET_PORT), rule_attr: 0x[a-f0-9]+, flags: = 45\) =3D -1.*" + then + err=3D0 + else + err=3D1 + fi +} + +trace_non_syscall() { + echo "Tracing non-syscall tracepoint ${non-syscall}" + if perf trace -e $non_syscall --max-events=3D1 2>&1 | \ + grep -q -E '.*timer:hrtimer_.*\(.*mode: HRTIMER_MODE_.*\)$' + then + err=3D0 + else + err=3D1 + fi +} + +check_vmlinux + +if [ $err =3D 0 ]; then + trace_landlock +fi + +if [ $err =3D 0 ]; then + trace_non_syscall +fi + +exit $err --=20 2.45.2 From nobody Wed Feb 11 14:01:05 2026 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 27EAA1A0B0B; Mon, 24 Jun 2024 18:12:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252750; cv=none; b=EqQHS330ko06Bltsg3s1ux+I1wKUpyBvDJlpL/5dOfANo+eCbf7LvK6PkRKodUnaGP5bneY9UhG3uiaR3xIzre0tNST4pPbzIHLmMg6mLsmS1RAE9w/oLSO3uMNhMdVwd6HQN/w7wUrtqmER4nRaNsW7gA37Nl8TXdeqWak/wG0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252750; c=relaxed/simple; bh=6SvLqQ8BVTrymv0byu609zcNrlDV5T3Dd4CiIEbFlKo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PbEdBmaVXiB0IC8Amy96ru527+bDxeIFDMLIgpDl/iOudqMeTYEVpjLGCHd04E3+cZWbXASAHgNgFBb5k/GeLD2wmRJsEUscxhsWHMcJ8tpctP9hFRdRq3vuinNpo0BAyN7iaZWwaPNQZOpnJQD/iCJdnImYkZ7lHcDVi4zI3dg= 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=m4DFyIr+; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="m4DFyIr+" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-7066c9741fbso2103641b3a.2; Mon, 24 Jun 2024 11:12:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719252748; x=1719857548; 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=kBlEtFWNbneWkV72zI7ZiSnn9Yk8ev161SjlFI7hFnw=; b=m4DFyIr+dmuZaB6WCnWrI9OKfbVMYRm2nB+EMkQUmEjohq7rjtJrA+5+xMHP9OoXCD snSWNmEV6PW5S7Y0NtUqg96PoszlZpHS0QzhOQ7A8tVijmt9bZ7Qup+2AribqVVO9Tqj WVFhn24nlnXslTBnF3IACsNaJ7pEpylhenoPWSzeGjFcRsyUUlNw7Ckq3Bo88Dhn/zLu OxzS52tjf5O9YMrzHPnp5PZY3lHzxsWz2+Bj/CbW5lQjUGqJkJLXhOHEOFARuQUqTLfu tALb+rB2vT8UqERHWmPFsOtbngyiRrrgmjJpFiKUejT2OQz9teQKl3roTDkkPqGK6ZLo wUBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719252748; x=1719857548; 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=kBlEtFWNbneWkV72zI7ZiSnn9Yk8ev161SjlFI7hFnw=; b=ZMt9jyHbnuoL26YR36zUtH7uPSzNDVQSBULUTPjPm47v4HqXOnYjUEcgYFE9wEdq+H DIS25bAO43xKQHLHqH7XzhkfVseyo1NszeDyIZ336SQu2tz3ywRpc5Zo7vAeHTCvJE2s 4g+YXiW6Yd3rCFwG+sQn6qP5CQMluJZzABtZX55XZYUl9Y+7Ywx29DGfUvGBCmg+joE5 dW3QFuZGjmc0P4uOqve9qOtCk1YVz0o1ZTJbzxkAVeS9FU72vR7T6pHT4A8itftrOoB3 FEOL+VlGJvoQO2oU84Pc2aQdHDIXdpVJln5S08VXJgL1Xvo+Ec9O5sPqgA9yIo9Yz8gg qK6g== X-Forwarded-Encrypted: i=1; AJvYcCUiuXj/LP3YaP4Wr2G81mdosfCXuFgVsOixTnUQsiha/BAt6uyuY1IiAbWNWQVsqwbySi8z0jfRspEWTEE6qd+7HtayH99MSxtXstWWJfjTycjrzyX0ilKbssvccZytpERqXjsohbpmD2uSqB4tRQ== X-Gm-Message-State: AOJu0YwX5iisc2IdYDiAcnkmWd0QFpnl8PywNrJtkFjxBgy8RzwJ/xCd gu5fB5tJbyOll1hrlAeq5lju/qBWRf4d3p3lq5dqnCdIdJIncws+ X-Google-Smtp-Source: AGHT+IE7aO+UNyRQ8Mlmr1H89eHe3Fxo/iVlosUglKc48zwcmGJsyaTzmDafFXrk6scO1J6jJRhxjA== X-Received: by 2002:a05:6a20:a502:b0:1bd:d53:5feb with SMTP id adf61e73a8af0-1bd0d5361e7mr2486902637.46.1719252748524; Mon, 24 Jun 2024 11:12:28 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.45]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70651290157sm6525157b3a.150.2024.06.24.11.12.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Jun 2024 11:12:28 -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 v3 7/8] perf trace: Introduce trace__btf_scnprintf() Date: Tue, 25 Jun 2024 02:13:44 +0800 Message-ID: <20240624181345.124764-8-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240624181345.124764-1-howardchu95@gmail.com> References: <20240624181345.124764-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo To have a central place that will look at the BTF type and call the right scnprintf routine or return zero, meaning BTF pretty printing isn't available or not implemented for a specific type. Tested-by: Howard Chu Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu --- tools/perf/builtin-trace.c | 49 +++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 774bb3534df4..1dd8b839e502 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 Wed Feb 11 14:01:05 2026 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 DE26E1A254B; Mon, 24 Jun 2024 18:12:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252753; cv=none; b=Tjgas+pBSsfYELO6Oe87EXWnKNE3rdphZS0DxY5nTepkpmy0x7iUwqY2vCsLjp660fBW/DpjEo/ESLcIISCH7zVBlENbfD0Y2TxCrk3U2DH7xgI6+EFwl2Yy6Eolhf1+3XZe+3kQXEVxRaTZDgt9hOb5NO0sdEI/vJ597XUyibo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719252753; c=relaxed/simple; bh=GM9v3HZVSqEmxMUKc0Yu6DGDU60uwNCVUO5wC3LrEag=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kWG2mjln49sXen9Qpp3uuWBibEqYYdeDN62Fd3ue37dd+x0EHsgGa050rOf2dzj3EpaL61XX4CX+DaeJgYHwfk8z7vNZxTc0qu7En3SD6XOi4zdXErGaSwDDDONSTbuSEVJAlsI+GkejNHfhOE5dMlTRnDuwS9ktW/YoMvC4QZY= 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=JJWTh8+c; arc=none smtp.client-ip=209.85.210.169 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="JJWTh8+c" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-706627ff48dso2001633b3a.1; Mon, 24 Jun 2024 11:12:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719252751; x=1719857551; 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=OnH79mxvIGsSdhtVkYLh+ulDnBmSarYvEBG6ogLOhec=; b=JJWTh8+c/Igvq3/UWDzdvl4itcH5y6sEYV4Wc4mDDVsEpGchgKfyjswh1g3AlhJnF2 66zIapCWGO9jjgPdoCnSCCzMaZN6+LamRNUiYeyJy0CegOROpWifvl8eqGG4lbOIOdZI jsFjjiursZVnd/12g2+j5OKjoMhYCbO+Zxv/hOarCxSo0jTP/vjQF3D6CxJBWgeX0Ahv Uu9aRSKNdj6mp3uip2UIE6Ju3xxMVfpaVdRIw5cxsZCek+dlTuP1HPhirNgBdNoxogWu /jCGY2/ZDnX+zCEVeySR7sR0thfZ5TFrj9Vsmy6n58gDplv5hxoTDIAKZA1IL/CeccUV ckwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719252751; x=1719857551; 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=OnH79mxvIGsSdhtVkYLh+ulDnBmSarYvEBG6ogLOhec=; b=s45252OVKW1Esrbn4lNueqhKhYNHM+5yhMMmTSEOqFbGa+pJJc/nOnyX99VePyox47 6uyIOfsf0RUrTIS5F25VaDYdGN6xqyWUaLCfmWo2Nk6igCAZJ1p51rlkicyaQJWsgS4e ILOBk+m7cS/PUSO7EoMPAX6CsOJ2Sp+DsQqMa8pR1KekeK2miqCStHJmA31JJGqh2QsD zUJyTCnoQgmY5XQ7I+HKktMVkZ4cbNigQP9X01JX9Bhu/JKZXPmGaxE2i7enCfdXfEsn 91f4gZr+GkXzIREz3WLZY1x//3nFIQoUMHEqxbY+J8SqyiDKAjZWu4Bg6baF4zBExFfA OhwQ== X-Forwarded-Encrypted: i=1; AJvYcCWAIPefff8KyzVGsZdyfLAHZ0OZ0YCGqWE1wvEoBHS4dbXkD4sX47NuWu0ZbYGvVMrk7OiOjPlu61pxPHXmvcDiidpTfvUSlcngtkdH9l/a97Uv/JOswS0j4SWkEvd1jQmGgz5IoatynTD8BWH7fA== X-Gm-Message-State: AOJu0YzVJicnYB5uDvqQMxBeWRzp89IU/9iNDqBvq01lri2MGBdFW3bH 0ag9hwR7M/bf6rhkl02UZWGu161MwLYN9sMeXvvFNhE9INa6OUlY X-Google-Smtp-Source: AGHT+IENNX+FrsxUvhp0lLd1yCJyDpoX5U2JbUho2R9JjsaMpUMzUO1PcNtDSUaBK0G8XVUxdAIe4A== X-Received: by 2002:a05:6a20:da9c:b0:1b8:7cd7:7aa8 with SMTP id adf61e73a8af0-1bcf7fb9e2fmr7821556637.41.1719252751088; Mon, 24 Jun 2024 11:12:31 -0700 (PDT) Received: from localhost.localdomain ([120.229.49.45]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70651290157sm6525157b3a.150.2024.06.24.11.12.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Jun 2024 11:12:30 -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 v3 8/8] perf trace: Remove arg_fmt->is_enum, we can get that from the BTF type Date: Tue, 25 Jun 2024 02:13:45 +0800 Message-ID: <20240624181345.124764-9-howardchu95@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240624181345.124764-1-howardchu95@gmail.com> References: <20240624181345.124764-1-howardchu95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnaldo Carvalho de Melo This is to pave the way for other BTF types, i.e. we try to find BTF type then use things like btf_is_enum(btf_type) that we cached to find the right strtoul and scnprintf routines. For now only enum is supported, all the other types simple return zero for scnprintf which makes it have the same behaviour as when BTF isn't available, i.e. fallback to no pretty printing. Ditto for strtoul. root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# perf test -v enum 124: perf trace enum augmentation tests : Ok root@x1:~# Tested-by: Howard Chu Cc: Adrian Hunter Cc: Howard Chu Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Howard Chu --- tools/perf/builtin-trace.c | 101 +++++++++++++++++-------------- tools/perf/trace/beauty/beauty.h | 1 + 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 1dd8b839e502..14141f09b4d6 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