From nobody Sat Feb 7 15:11:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78B598565E; Wed, 20 Mar 2024 19:31:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710963083; cv=none; b=LfWOBcIDp0OqT/fNudlnez2a/wpMBHsPsfIHTRFhE1steReDahVrF98sGVdNQzT6fWms25PwpqKtWFxF7HVCxIJUM/iwsrNoBakEk/rMYmgi1y4l0HE44HHhZcJET8vXn7DKLqLj5Wtu5mxADUxKWLrPIpa2OoNRwpWNuZJ6vLM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710963083; c=relaxed/simple; bh=DtY8CRGRg4fNqQryb5oUz+nbtnFjPoe5JRp5LBzURWo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tfZCv11otY2WZGL3mwmjUoUGkTxjtP1DIkOAQ63f0OGxMaMOwYZmE4ErjaUtIsa+iK6nFl/PSViHsF8LzYPVox74s8Bv48JdPwhULiuRnLbS6bCBeE85E5Z5fqeqhLus5p93N1rq4B4QvD+f6nODpqdN6JtC5e1hcl2A6gCaHw4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LmfKJzAU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LmfKJzAU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B25B7C43390; Wed, 20 Mar 2024 19:31:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710963083; bh=DtY8CRGRg4fNqQryb5oUz+nbtnFjPoe5JRp5LBzURWo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LmfKJzAUmVTSrCVhRpOqNd24zxCTMO02s7yAwmC5Dl4J8A2eV/VOSFV/+37w0BhqY Lz6+y9N/jCcDr28DuvpJL6drBUMSsC/Fxr5lSGblscQ4lMENlSdjdZzMRyvYRSREGG F6aKhFLVsgy6+qgVVdHw9Pn3B8OetTNTcYc+17aCZaQ/6nVzMHvPEdSRQM/dZpfJhN VDjL2thf1G0y+/strfHlzjzM5xuYVPtzHOiIrlfijTurVOkBFqCwp7SzqdoqjtjSdM WVtcTCaQ/jUoC2ZZPxfLAOub0/sjECWE22Jtb2/EpDO9buIFAZU0P+tnz3eTpRznEe fkJqxvHfOrpIw== From: Arnaldo Carvalho de Melo To: Ian Rogers Cc: Jiri Olsa , Namhyung Kim , Adrian Hunter , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH 1/5] perf beauty: Introduce scrape script for various fs syscalls 'flags' arguments Date: Wed, 20 Mar 2024 16:31:11 -0300 Message-ID: <20240320193115.811899-2-acme@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240320193115.811899-1-acme@kernel.org> References: <20240320193115.811899-1-acme@kernel.org> 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 It was using the first variation on producing a string representation for a binary flag, one that used the system's fcntl.h and preprocessor tricks that had to be updated everytime a new flag was introduced. Use the more recent scrape script + strarray + strarray__scnprintf_flags() = combo. $ tools/perf/trace/beauty/fs_at_flags.sh static const char *fs_at_flags[] =3D { [ilog2(0x100) + 1] =3D "SYMLINK_NOFOLLOW", [ilog2(0x200) + 1] =3D "REMOVEDIR", [ilog2(0x400) + 1] =3D "SYMLINK_FOLLOW", [ilog2(0x800) + 1] =3D "NO_AUTOMOUNT", [ilog2(0x1000) + 1] =3D "EMPTY_PATH", [ilog2(0x0000) + 1] =3D "STATX_SYNC_AS_STAT", [ilog2(0x2000) + 1] =3D "STATX_FORCE_SYNC", [ilog2(0x4000) + 1] =3D "STATX_DONT_SYNC", [ilog2(0x8000) + 1] =3D "RECURSIVE", [ilog2(0x80000000) + 1] =3D "GETATTR_NOSEC", }; $ Now we need a copy of uapi/linux/fcntl.h from tools/include/ in the scrape only directory tools/perf/trace/beauty/include and will use that fs_at_flags array for other fs syscalls. Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Namhyung Kim Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- tools/perf/Makefile.perf | 7 + tools/perf/builtin-trace.c | 2 +- tools/perf/check-headers.sh | 1 + tools/perf/trace/beauty/Build | 1 + tools/perf/trace/beauty/beauty.h | 4 +- tools/perf/trace/beauty/fs_at_flags.c | 26 ++++ tools/perf/trace/beauty/fs_at_flags.sh | 21 +++ .../trace/beauty/include/uapi/linux/fcntl.h | 123 ++++++++++++++++++ tools/perf/trace/beauty/statx.c | 31 ----- 9 files changed, 182 insertions(+), 34 deletions(-) create mode 100644 tools/perf/trace/beauty/fs_at_flags.c create mode 100755 tools/perf/trace/beauty/fs_at_flags.sh create mode 100644 tools/perf/trace/beauty/include/uapi/linux/fcntl.h diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index ccd2dcbc64f720d2..73d5603450b0a547 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -489,6 +489,12 @@ beauty_ioctl_outdir :=3D $(beauty_outdir)/ioctl # Create output directory if not already present $(shell [ -d '$(beauty_ioctl_outdir)' ] || mkdir -p '$(beauty_ioctl_outdir= )') =20 +fs_at_flags_array :=3D $(beauty_outdir)/fs_at_flags_array.c +fs_at_flags_tbl :=3D $(srctree)/tools/perf/trace/beauty/fs_at_flags.sh + +$(fs_at_flags_array): $(beauty_uapi_linux_dir)/fcntl.h $(fs_at_flags_tbl) + $(Q)$(SHELL) '$(fs_at_flags_tbl)' $(beauty_uapi_linux_dir) > $@ + clone_flags_array :=3D $(beauty_outdir)/clone_flags_array.c clone_flags_tbl :=3D $(srctree)/tools/perf/trace/beauty/clone.sh =20 @@ -772,6 +778,7 @@ build-dir =3D $(or $(__build-dir),.) =20 prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders \ arm64-sysreg-defs \ + $(fs_at_flags_array) \ $(clone_flags_array) \ $(drm_ioctl_array) \ $(fadvise_advice_array) \ diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 8fb032caeaf53288..8417387aafa8295d 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -1144,7 +1144,7 @@ static const struct syscall_fmt syscall_fmts[] =3D { { .name =3D "stat", .alias =3D "newstat", }, { .name =3D "statx", .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* fdat */ }, - [2] =3D { .scnprintf =3D SCA_STATX_FLAGS, /* flags */ } , + [2] =3D { .scnprintf =3D SCA_FS_AT_FLAGS, /* flags */ } , [3] =3D { .scnprintf =3D SCA_STATX_MASK, /* mask */ }, }, }, { .name =3D "swapoff", .arg =3D { [0] =3D { .scnprintf =3D SCA_FILENAME, /* specialfile */ }, = }, }, diff --git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh index 413c9b747216020f..d23a84fdf3efef78 100755 --- a/tools/perf/check-headers.sh +++ b/tools/perf/check-headers.sh @@ -89,6 +89,7 @@ BEAUTY_FILES=3D( "arch/x86/include/asm/irq_vectors.h" "arch/x86/include/uapi/asm/prctl.h" "include/linux/socket.h" + "include/uapi/linux/fcntl.h" "include/uapi/linux/fs.h" "include/uapi/linux/mount.h" "include/uapi/linux/prctl.h" diff --git a/tools/perf/trace/beauty/Build b/tools/perf/trace/beauty/Build index d11ce256f5114034..d8ce1b6989832134 100644 --- a/tools/perf/trace/beauty/Build +++ b/tools/perf/trace/beauty/Build @@ -1,6 +1,7 @@ perf-y +=3D clone.o perf-y +=3D fcntl.o perf-y +=3D flock.o +perf-y +=3D fs_at_flags.o perf-y +=3D fsmount.o perf-y +=3D fspick.o ifeq ($(SRCARCH),$(filter $(SRCARCH),x86)) diff --git a/tools/perf/trace/beauty/beauty.h b/tools/perf/trace/beauty/bea= uty.h index 9feb794f5c6e15f4..c94ae8701bc65a2f 100644 --- a/tools/perf/trace/beauty/beauty.h +++ b/tools/perf/trace/beauty/beauty.h @@ -234,8 +234,8 @@ size_t syscall_arg__scnprintf_socket_protocol(char *bf,= size_t size, struct sysc size_t syscall_arg__scnprintf_socket_level(char *bf, size_t size, struct s= yscall_arg *arg); #define SCA_SK_LEVEL syscall_arg__scnprintf_socket_level =20 -size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct sy= scall_arg *arg); -#define SCA_STATX_FLAGS syscall_arg__scnprintf_statx_flags +size_t syscall_arg__scnprintf_fs_at_flags(char *bf, size_t size, struct sy= scall_arg *arg); +#define SCA_FS_AT_FLAGS syscall_arg__scnprintf_fs_at_flags =20 size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct sys= call_arg *arg); #define SCA_STATX_MASK syscall_arg__scnprintf_statx_mask diff --git a/tools/perf/trace/beauty/fs_at_flags.c b/tools/perf/trace/beaut= y/fs_at_flags.c new file mode 100644 index 0000000000000000..2a099953d9935782 --- /dev/null +++ b/tools/perf/trace/beauty/fs_at_flags.c @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: LGPL-2.1 +/* + * trace/beauty/fs_at_flags.c + * + * Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo + */ + +#include "trace/beauty/beauty.h" +#include +#include + +#include "trace/beauty/generated/fs_at_flags_array.c" +static DEFINE_STRARRAY(fs_at_flags, "AT_"); + +static size_t fs_at__scnprintf_flags(unsigned long flags, char *bf, size_t= size, bool show_prefix) +{ + return strarray__scnprintf_flags(&strarray__fs_at_flags, bf, size, show_p= refix, flags); +} + +size_t syscall_arg__scnprintf_fs_at_flags(char *bf, size_t size, struct sy= scall_arg *arg) +{ + bool show_prefix =3D arg->show_string_prefix; + int flags =3D arg->val; + + return fs_at__scnprintf_flags(flags, bf, size, show_prefix); +} diff --git a/tools/perf/trace/beauty/fs_at_flags.sh b/tools/perf/trace/beau= ty/fs_at_flags.sh new file mode 100755 index 0000000000000000..456f59addf741062 --- /dev/null +++ b/tools/perf/trace/beauty/fs_at_flags.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1 + +if [ $# -ne 1 ] ; then + beauty_uapi_linux_dir=3Dtools/perf/trace/beauty/include/uapi/linux/ +else + beauty_uapi_linux_dir=3D$1 +fi + +linux_fcntl=3D${beauty_uapi_linux_dir}/fcntl.h + +printf "static const char *fs_at_flags[] =3D {\n" +regex=3D'^[[:space:]]*#[[:space:]]*define[[:space:]]+AT_([^_]+[[:alnum:]_]= +)[[:space:]]+(0x[[:xdigit:]]+)[[:space:]]*.*' +# AT_EACCESS is only meaningful to faccessat, so we will special case it t= here... +# AT_STATX_SYNC_TYPE is not a bit, its a mask of AT_STATX_SYNC_AS_STAT, AT= _STATX_FORCE_SYNC and AT_STATX_DONT_SYNC +grep -E $regex ${linux_fcntl} | \ + grep -v AT_EACCESS | \ + grep -v AT_STATX_SYNC_TYPE | \ + sed -r "s/$regex/\2 \1/g" | \ + xargs printf "\t[ilog2(%s) + 1] =3D \"%s\",\n" +printf "};\n" diff --git a/tools/perf/trace/beauty/include/uapi/linux/fcntl.h b/tools/per= f/trace/beauty/include/uapi/linux/fcntl.h new file mode 100644 index 0000000000000000..282e90aeb163c028 --- /dev/null +++ b/tools/perf/trace/beauty/include/uapi/linux/fcntl.h @@ -0,0 +1,123 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_FCNTL_H +#define _UAPI_LINUX_FCNTL_H + +#include +#include + +#define F_SETLEASE (F_LINUX_SPECIFIC_BASE + 0) +#define F_GETLEASE (F_LINUX_SPECIFIC_BASE + 1) + +/* + * Cancel a blocking posix lock; internal use only until we expose an + * asynchronous lock api to userspace: + */ +#define F_CANCELLK (F_LINUX_SPECIFIC_BASE + 5) + +/* Create a file descriptor with FD_CLOEXEC set. */ +#define F_DUPFD_CLOEXEC (F_LINUX_SPECIFIC_BASE + 6) + +/* + * Request nofications on a directory. + * See below for events that may be notified. + */ +#define F_NOTIFY (F_LINUX_SPECIFIC_BASE+2) + +/* + * Set and get of pipe page size array + */ +#define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7) +#define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8) + +/* + * Set/Get seals + */ +#define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9) +#define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10) + +/* + * Types of seals + */ +#define F_SEAL_SEAL 0x0001 /* prevent further seals from being set */ +#define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */ +#define F_SEAL_GROW 0x0004 /* prevent file from growing */ +#define F_SEAL_WRITE 0x0008 /* prevent writes */ +#define F_SEAL_FUTURE_WRITE 0x0010 /* prevent future writes while mapped = */ +#define F_SEAL_EXEC 0x0020 /* prevent chmod modifying exec bits */ +/* (1U << 31) is reserved for signed error codes */ + +/* + * Set/Get write life time hints. {GET,SET}_RW_HINT operate on the + * underlying inode, while {GET,SET}_FILE_RW_HINT operate only on + * the specific file. + */ +#define F_GET_RW_HINT (F_LINUX_SPECIFIC_BASE + 11) +#define F_SET_RW_HINT (F_LINUX_SPECIFIC_BASE + 12) +#define F_GET_FILE_RW_HINT (F_LINUX_SPECIFIC_BASE + 13) +#define F_SET_FILE_RW_HINT (F_LINUX_SPECIFIC_BASE + 14) + +/* + * Valid hint values for F_{GET,SET}_RW_HINT. 0 is "not set", or can be + * used to clear any hints previously set. + */ +#define RWH_WRITE_LIFE_NOT_SET 0 +#define RWH_WRITE_LIFE_NONE 1 +#define RWH_WRITE_LIFE_SHORT 2 +#define RWH_WRITE_LIFE_MEDIUM 3 +#define RWH_WRITE_LIFE_LONG 4 +#define RWH_WRITE_LIFE_EXTREME 5 + +/* + * The originally introduced spelling is remained from the first + * versions of the patch set that introduced the feature, see commit + * v4.13-rc1~212^2~51. + */ +#define RWF_WRITE_LIFE_NOT_SET RWH_WRITE_LIFE_NOT_SET + +/* + * Types of directory notifications that may be requested. + */ +#define DN_ACCESS 0x00000001 /* File accessed */ +#define DN_MODIFY 0x00000002 /* File modified */ +#define DN_CREATE 0x00000004 /* File created */ +#define DN_DELETE 0x00000008 /* File removed */ +#define DN_RENAME 0x00000010 /* File renamed */ +#define DN_ATTRIB 0x00000020 /* File changed attibutes */ +#define DN_MULTISHOT 0x80000000 /* Don't remove notifier */ + +/* + * The constants AT_REMOVEDIR and AT_EACCESS have the same value. AT_EACC= ESS is + * meaningful only to faccessat, while AT_REMOVEDIR is meaningful only to + * unlinkat. The two functions do completely different things and therefo= re, + * the flags can be allowed to overlap. For example, passing AT_REMOVEDIR= to + * faccessat would be undefined behavior and thus treating it equivalent to + * AT_EACCESS is valid undefined behavior. + */ +#define AT_FDCWD -100 /* Special value used to indicate + openat should use the current + working directory. */ +#define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +#define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +#define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +#define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount traversal */ +#define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname */ + +#define AT_STATX_SYNC_TYPE 0x6000 /* Type of synchronisation required from= statx() */ +#define AT_STATX_SYNC_AS_STAT 0x0000 /* - Do whatever stat() does */ +#define AT_STATX_FORCE_SYNC 0x2000 /* - Force the attributes to be sync'd = with the server */ +#define AT_STATX_DONT_SYNC 0x4000 /* - Don't sync attributes with the serv= er */ + +#define AT_RECURSIVE 0x8000 /* Apply to the entire subtree */ + +/* Flags for name_to_handle_at(2). We reuse AT_ flag space to save bits...= */ +#define AT_HANDLE_FID AT_REMOVEDIR /* file handle is needed to + compare object identity and may not + be usable to open_by_handle_at(2) */ +#if defined(__KERNEL__) +#define AT_GETATTR_NOSEC 0x80000000 +#endif + +#endif /* _UAPI_LINUX_FCNTL_H */ diff --git a/tools/perf/trace/beauty/statx.c b/tools/perf/trace/beauty/stat= x.c index 1f7e34ed4e02be86..4e0059fd02118f9c 100644 --- a/tools/perf/trace/beauty/statx.c +++ b/tools/perf/trace/beauty/statx.c @@ -8,7 +8,6 @@ #include "trace/beauty/beauty.h" #include #include -#include #include =20 #ifndef STATX_MNT_ID @@ -21,36 +20,6 @@ #define STATX_MNT_ID_UNIQUE 0x00004000U #endif =20 -size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct sy= scall_arg *arg) -{ - bool show_prefix =3D arg->show_string_prefix; - const char *prefix =3D "AT_"; - int printed =3D 0, flags =3D arg->val; - - if (flags =3D=3D 0) - return scnprintf(bf, size, "%s%s", show_prefix ? "AT_STATX_" : "", "SYNC= _AS_STAT"); -#define P_FLAG(n) \ - if (flags & AT_##n) { \ - printed +=3D scnprintf(bf + printed, size - printed, "%s%s", printed ? "= |" : "", show_prefix ? prefix : "", #n); \ - flags &=3D ~AT_##n; \ - } - - P_FLAG(SYMLINK_NOFOLLOW); - P_FLAG(REMOVEDIR); - P_FLAG(SYMLINK_FOLLOW); - P_FLAG(NO_AUTOMOUNT); - P_FLAG(EMPTY_PATH); - P_FLAG(STATX_FORCE_SYNC); - P_FLAG(STATX_DONT_SYNC); - -#undef P_FLAG - - if (flags) - printed +=3D scnprintf(bf + printed, size - printed, "%s%#x", printed ? = "|" : "", flags); - - return printed; -} - size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct sys= call_arg *arg) { bool show_prefix =3D arg->show_string_prefix; --=20 2.44.0 From nobody Sat Feb 7 15:11:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D37AA85643; Wed, 20 Mar 2024 19:31:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710963085; cv=none; b=EhwbUKVvkMOylBjClzwCQlW9U1TF7m+hKi1CaVI16slp2+DMg3GsPRHqV4iJdLGlIW1r2VGr4bwO8rT5QqcN1Xo2Gxk8E2lxuzLQBD2ZWnoTYF33FABVCE5NAsJKbx99PWgcs8y/PuiFpl/rC/Y2EgLL8D8b5gHO2dkLvrKdUjY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710963085; c=relaxed/simple; bh=iXBI8axSfSxPB883iJMXJriHVLTLFGmqnye7926e4pk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Bz4H+2h8QybhPRz5UjsmZpXlMtFVeRAu76mWZpFYL/3WjdwmlrTFmbOpprBhP/F+gtJgqLWazhSdDdn/LexmoO2j9ee3BWyJtsl1Q5KidLq5E03lymIBrd8/eTs8b+TUgHkkH2NG9CW7SdCiOAZOjqY8F17Oaq14rr/Akj6QXfA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WAGCUQzB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WAGCUQzB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C853DC433F1; Wed, 20 Mar 2024 19:31:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710963085; bh=iXBI8axSfSxPB883iJMXJriHVLTLFGmqnye7926e4pk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WAGCUQzBooEtImPsjB4MtPo2n99Qi03BIZOM6KneFO7U0sVFssCPKLnmnRiJPTzDU FU8fSA1URCVg7o1aSlgByCJLxJzg6tmIyHREVY7pReDsTVpdN5LgU5P1lEeiw0b3TB 7EvKQW/qUN2TiXxST8ROYp9+wjPUEknCj5hEhmlym5XB/08RwJ9OIKAuAXpOCuLSEr LH8ixs08VWkQPsCSQm2KJCoZOC5Ivlpy2mOUZ6T9OpxwMSWQ8PqulCh/IYmLQvjlpA HKymTSu67goTN9YHFBXKUzcJvewBGAB/usMqeWoX9THuKrFLNCQLYrz/1HAppwHGgk SdeILDIzHKnzA== From: Arnaldo Carvalho de Melo To: Ian Rogers Cc: Jiri Olsa , Namhyung Kim , Adrian Hunter , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH 2/5] perf beauty: Introduce scrape script for the 'statx' syscall 'mask' argument Date: Wed, 20 Mar 2024 16:31:12 -0300 Message-ID: <20240320193115.811899-3-acme@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240320193115.811899-1-acme@kernel.org> References: <20240320193115.811899-1-acme@kernel.org> 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 It was using the first variation on producing a string representation for a binary flag, one that used the system's stat.h and preprocessor tricks that had to be updated everytime a new flag was introduced. Use the more recent scrape script + strarray + strarray__scnprintf_flags() combo. $ tools/perf/trace/beauty/statx_mask.sh static const char *statx_mask[] =3D { [ilog2(0x00000001) + 1] =3D "TYPE", [ilog2(0x00000002) + 1] =3D "MODE", [ilog2(0x00000004) + 1] =3D "NLINK", [ilog2(0x00000008) + 1] =3D "UID", [ilog2(0x00000010) + 1] =3D "GID", [ilog2(0x00000020) + 1] =3D "ATIME", [ilog2(0x00000040) + 1] =3D "MTIME", [ilog2(0x00000080) + 1] =3D "CTIME", [ilog2(0x00000100) + 1] =3D "INO", [ilog2(0x00000200) + 1] =3D "SIZE", [ilog2(0x00000400) + 1] =3D "BLOCKS", [ilog2(0x00000800) + 1] =3D "BTIME", [ilog2(0x00001000) + 1] =3D "MNT_ID", [ilog2(0x00002000) + 1] =3D "DIOALIGN", [ilog2(0x00004000) + 1] =3D "MNT_ID_UNIQUE", }; $ Now we need a copy of uapi/linux/stat.h from tools/include/ in the scrape only directory tools/perf/trace/beauty/include. Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Namhyung Kim Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- tools/perf/Makefile.perf | 7 + tools/perf/check-headers.sh | 1 + .../trace/beauty/include/uapi/linux/stat.h | 195 ++++++++++++++++++ tools/perf/trace/beauty/statx.c | 50 +---- tools/perf/trace/beauty/statx_mask.sh | 23 +++ 5 files changed, 235 insertions(+), 41 deletions(-) create mode 100644 tools/perf/trace/beauty/include/uapi/linux/stat.h create mode 100755 tools/perf/trace/beauty/statx_mask.sh diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 73d5603450b0a547..0d2dbdfc44df3019 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -673,6 +673,12 @@ arch_errno_tbl :=3D $(srctree)/tools/perf/trace/beauty= /arch_errno_names.sh $(arch_errno_name_array): $(arch_errno_tbl) $(Q)$(SHELL) '$(arch_errno_tbl)' '$(patsubst -%,,$(CC))' $(arch_errno_hdr= _dir) > $@ =20 +statx_mask_array :=3D $(beauty_outdir)/statx_mask_array.c +statx_mask_tbl :=3D $(srctree)/tools/perf/trace/beauty/statx_mask.sh + +$(statx_mask_array): $(beauty_uapi_linux_dir)/stat.h $(statx_mask_tbl) + $(Q)$(SHELL) '$(statx_mask_tbl)' $(beauty_uapi_linux_dir) > $@ + sync_file_range_arrays :=3D $(beauty_outdir)/sync_file_range_arrays.c sync_file_range_tbls :=3D $(srctree)/tools/perf/trace/beauty/sync_file_ran= ge.sh =20 @@ -807,6 +813,7 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmd= s.h archheaders \ $(x86_arch_prctl_code_array) \ $(rename_flags_array) \ $(arch_errno_name_array) \ + $(statx_mask_array) \ $(sync_file_range_arrays) \ $(LIBAPI) \ $(LIBPERF) \ diff --git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh index d23a84fdf3efef78..76726a5a7c789273 100755 --- a/tools/perf/check-headers.sh +++ b/tools/perf/check-headers.sh @@ -94,6 +94,7 @@ BEAUTY_FILES=3D( "include/uapi/linux/mount.h" "include/uapi/linux/prctl.h" "include/uapi/linux/sched.h" + "include/uapi/linux/stat.h" "include/uapi/linux/usbdevice_fs.h" "include/uapi/sound/asound.h" ) diff --git a/tools/perf/trace/beauty/include/uapi/linux/stat.h b/tools/perf= /trace/beauty/include/uapi/linux/stat.h new file mode 100644 index 0000000000000000..2f2ee82d55175d05 --- /dev/null +++ b/tools/perf/trace/beauty/include/uapi/linux/stat.h @@ -0,0 +1,195 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_STAT_H +#define _UAPI_LINUX_STAT_H + +#include + +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) + +#define S_IFMT 00170000 +#define S_IFSOCK 0140000 +#define S_IFLNK 0120000 +#define S_IFREG 0100000 +#define S_IFBLK 0060000 +#define S_IFDIR 0040000 +#define S_IFCHR 0020000 +#define S_IFIFO 0010000 +#define S_ISUID 0004000 +#define S_ISGID 0002000 +#define S_ISVTX 0001000 + +#define S_ISLNK(m) (((m) & S_IFMT) =3D=3D S_IFLNK) +#define S_ISREG(m) (((m) & S_IFMT) =3D=3D S_IFREG) +#define S_ISDIR(m) (((m) & S_IFMT) =3D=3D S_IFDIR) +#define S_ISCHR(m) (((m) & S_IFMT) =3D=3D S_IFCHR) +#define S_ISBLK(m) (((m) & S_IFMT) =3D=3D S_IFBLK) +#define S_ISFIFO(m) (((m) & S_IFMT) =3D=3D S_IFIFO) +#define S_ISSOCK(m) (((m) & S_IFMT) =3D=3D S_IFSOCK) + +#define S_IRWXU 00700 +#define S_IRUSR 00400 +#define S_IWUSR 00200 +#define S_IXUSR 00100 + +#define S_IRWXG 00070 +#define S_IRGRP 00040 +#define S_IWGRP 00020 +#define S_IXGRP 00010 + +#define S_IRWXO 00007 +#define S_IROTH 00004 +#define S_IWOTH 00002 +#define S_IXOTH 00001 + +#endif + +/* + * Timestamp structure for the timestamps in struct statx. + * + * tv_sec holds the number of seconds before (negative) or after (positive) + * 00:00:00 1st January 1970 UTC. + * + * tv_nsec holds a number of nanoseconds (0..999,999,999) after the tv_sec= time. + * + * __reserved is held in case we need a yet finer resolution. + */ +struct statx_timestamp { + __s64 tv_sec; + __u32 tv_nsec; + __s32 __reserved; +}; + +/* + * Structures for the extended file attribute retrieval system call + * (statx()). + * + * The caller passes a mask of what they're specifically interested in as a + * parameter to statx(). What statx() actually got will be indicated in + * st_mask upon return. + * + * For each bit in the mask argument: + * + * - if the datum is not supported: + * + * - the bit will be cleared, and + * + * - the datum will be set to an appropriate fabricated value if one is + * available (eg. CIFS can take a default uid and gid), otherwise + * + * - the field will be cleared; + * + * - otherwise, if explicitly requested: + * + * - the datum will be synchronised to the server if AT_STATX_FORCE_SYNC= is + * set or if the datum is considered out of date, and + * + * - the field will be filled in and the bit will be set; + * + * - otherwise, if not requested, but available in approximate form withou= t any + * effort, it will be filled in anyway, and the bit will be set upon ret= urn + * (it might not be up to date, however, and no attempt will be made to + * synchronise the internal state first); + * + * - otherwise the field and the bit will be cleared before returning. + * + * Items in STATX_BASIC_STATS may be marked unavailable on return, but they + * will have values installed for compatibility purposes so that stat() and + * co. can be emulated in userspace. + */ +struct statx { + /* 0x00 */ + __u32 stx_mask; /* What results were written [uncond] */ + __u32 stx_blksize; /* Preferred general I/O size [uncond] */ + __u64 stx_attributes; /* Flags conveying information about the file [unco= nd] */ + /* 0x10 */ + __u32 stx_nlink; /* Number of hard links */ + __u32 stx_uid; /* User ID of owner */ + __u32 stx_gid; /* Group ID of owner */ + __u16 stx_mode; /* File mode */ + __u16 __spare0[1]; + /* 0x20 */ + __u64 stx_ino; /* Inode number */ + __u64 stx_size; /* File size */ + __u64 stx_blocks; /* Number of 512-byte blocks allocated */ + __u64 stx_attributes_mask; /* Mask to show what's supported in stx_attrib= utes */ + /* 0x40 */ + struct statx_timestamp stx_atime; /* Last access time */ + struct statx_timestamp stx_btime; /* File creation time */ + struct statx_timestamp stx_ctime; /* Last attribute change time */ + struct statx_timestamp stx_mtime; /* Last data modification time */ + /* 0x80 */ + __u32 stx_rdev_major; /* Device ID of special file [if bdev/cdev] */ + __u32 stx_rdev_minor; + __u32 stx_dev_major; /* ID of device containing file [uncond] */ + __u32 stx_dev_minor; + /* 0x90 */ + __u64 stx_mnt_id; + __u32 stx_dio_mem_align; /* Memory buffer alignment for direct I/O */ + __u32 stx_dio_offset_align; /* File offset alignment for direct I/O */ + /* 0xa0 */ + __u64 __spare3[12]; /* Spare space for future expansion */ + /* 0x100 */ +}; + +/* + * Flags to be stx_mask + * + * Query request/result mask for statx() and struct statx::stx_mask. + * + * These bits should be set in the mask argument of statx() to request + * particular items when calling statx(). + */ +#define STATX_TYPE 0x00000001U /* Want/got stx_mode & S_IFMT */ +#define STATX_MODE 0x00000002U /* Want/got stx_mode & ~S_IFMT */ +#define STATX_NLINK 0x00000004U /* Want/got stx_nlink */ +#define STATX_UID 0x00000008U /* Want/got stx_uid */ +#define STATX_GID 0x00000010U /* Want/got stx_gid */ +#define STATX_ATIME 0x00000020U /* Want/got stx_atime */ +#define STATX_MTIME 0x00000040U /* Want/got stx_mtime */ +#define STATX_CTIME 0x00000080U /* Want/got stx_ctime */ +#define STATX_INO 0x00000100U /* Want/got stx_ino */ +#define STATX_SIZE 0x00000200U /* Want/got stx_size */ +#define STATX_BLOCKS 0x00000400U /* Want/got stx_blocks */ +#define STATX_BASIC_STATS 0x000007ffU /* The stuff in the normal stat stru= ct */ +#define STATX_BTIME 0x00000800U /* Want/got stx_btime */ +#define STATX_MNT_ID 0x00001000U /* Got stx_mnt_id */ +#define STATX_DIOALIGN 0x00002000U /* Want/got direct I/O alignment info = */ +#define STATX_MNT_ID_UNIQUE 0x00004000U /* Want/got extended stx_mount_id = */ + +#define STATX__RESERVED 0x80000000U /* Reserved for future struct statx e= xpansion */ + +#ifndef __KERNEL__ +/* + * This is deprecated, and shall remain the same value in the future. To = avoid + * confusion please use the equivalent (STATX_BASIC_STATS | STATX_BTIME) + * instead. + */ +#define STATX_ALL 0x00000fffU +#endif + +/* + * Attributes to be found in stx_attributes and masked in stx_attributes_m= ask. + * + * These give information about the features or the state of a file that m= ight + * be of use to ordinary userspace programs such as GUIs or ls rather than + * specialised tools. + * + * Note that the flags marked [I] correspond to the FS_IOC_SETFLAGS flags + * semantically. Where possible, the numerical value is picked to corresp= ond + * also. Note that the DAX attribute indicates that the file is in the CPU + * direct access state. It does not correspond to the per-inode flag that + * some filesystems support. + * + */ +#define STATX_ATTR_COMPRESSED 0x00000004 /* [I] File is compressed by the= fs */ +#define STATX_ATTR_IMMUTABLE 0x00000010 /* [I] File is marked immutable */ +#define STATX_ATTR_APPEND 0x00000020 /* [I] File is append-only */ +#define STATX_ATTR_NODUMP 0x00000040 /* [I] File is not to be dumped */ +#define STATX_ATTR_ENCRYPTED 0x00000800 /* [I] File requires key to decry= pt in fs */ +#define STATX_ATTR_AUTOMOUNT 0x00001000 /* Dir: Automount trigger */ +#define STATX_ATTR_MOUNT_ROOT 0x00002000 /* Root of a mount */ +#define STATX_ATTR_VERITY 0x00100000 /* [I] Verity protected file */ +#define STATX_ATTR_DAX 0x00200000 /* File is currently in DAX state */ + + +#endif /* _UAPI_LINUX_STAT_H */ diff --git a/tools/perf/trace/beauty/statx.c b/tools/perf/trace/beauty/stat= x.c index 4e0059fd02118f9c..24843e614b935f3a 100644 --- a/tools/perf/trace/beauty/statx.c +++ b/tools/perf/trace/beauty/statx.c @@ -6,52 +6,20 @@ */ =20 #include "trace/beauty/beauty.h" -#include #include -#include +#include =20 -#ifndef STATX_MNT_ID -#define STATX_MNT_ID 0x00001000U -#endif -#ifndef STATX_DIOALIGN -#define STATX_DIOALIGN 0x00002000U -#endif -#ifndef STATX_MNT_ID_UNIQUE -#define STATX_MNT_ID_UNIQUE 0x00004000U -#endif +static size_t statx__scnprintf_mask(unsigned long mask, char *bf, size_t s= ize, bool show_prefix) +{ + #include "trace/beauty/generated/statx_mask_array.c" + static DEFINE_STRARRAY(statx_mask, "STATX_"); + return strarray__scnprintf_flags(&strarray__statx_mask, bf, size, show_pr= efix, mask); +} =20 size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct sys= call_arg *arg) { bool show_prefix =3D arg->show_string_prefix; - const char *prefix =3D "STATX_"; - int printed =3D 0, flags =3D arg->val; - -#define P_FLAG(n) \ - if (flags & STATX_##n) { \ - printed +=3D scnprintf(bf + printed, size - printed, "%s%s", printed ? "= |" : "", show_prefix ? prefix : "", #n); \ - flags &=3D ~STATX_##n; \ - } - - P_FLAG(TYPE); - P_FLAG(MODE); - P_FLAG(NLINK); - P_FLAG(UID); - P_FLAG(GID); - P_FLAG(ATIME); - P_FLAG(MTIME); - P_FLAG(CTIME); - P_FLAG(INO); - P_FLAG(SIZE); - P_FLAG(BLOCKS); - P_FLAG(BTIME); - P_FLAG(MNT_ID); - P_FLAG(DIOALIGN); - P_FLAG(MNT_ID_UNIQUE); - -#undef P_FLAG - - if (flags) - printed +=3D scnprintf(bf + printed, size - printed, "%s%#x", printed ? = "|" : "", flags); + int mask =3D arg->val; =20 - return printed; + return statx__scnprintf_mask(mask, bf, size, show_prefix); } diff --git a/tools/perf/trace/beauty/statx_mask.sh b/tools/perf/trace/beaut= y/statx_mask.sh new file mode 100755 index 0000000000000000..18c802ed0c71578f --- /dev/null +++ b/tools/perf/trace/beauty/statx_mask.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1 + +if [ $# -ne 1 ] ; then + beauty_uapi_linux_dir=3Dtools/perf/trace/beauty/include/uapi/linux/ +else + beauty_uapi_linux_dir=3D$1 +fi + +linux_stat=3D${beauty_uapi_linux_dir}/stat.h + +printf "static const char *statx_mask[] =3D {\n" +regex=3D'^[[:space:]]*#[[:space:]]*define[[:space:]]+STATX_([^_]+[[:alnum:= ]_]+)[[:space:]]+(0x[[:xdigit:]]+)[[:space:]]*.*' +# STATX_BASIC_STATS its a bitmask formed by the mask in the normal stat st= ruct +# STATX_ALL is another bitmask and deprecated +# STATX_ATTR_*: Attributes to be found in stx_attributes and masked in stx= _attributes_mask +grep -E $regex ${linux_stat} | \ + grep -v STATX_ALL | \ + grep -v STATX_BASIC_STATS | \ + grep -v '\ To: Ian Rogers Cc: Jiri Olsa , Namhyung Kim , Adrian Hunter , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH 3/5] perf beauty: Introduce faccessat2 flags scnprintf routine Date: Wed, 20 Mar 2024 16:31:13 -0300 Message-ID: <20240320193115.811899-4-acme@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240320193115.811899-1-acme@kernel.org> References: <20240320193115.811899-1-acme@kernel.org> 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 The fsaccessat and fsaccessat2 now have beautifiers for its arguments. Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Namhyung Kim Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- tools/perf/builtin-trace.c | 9 +++++++++ tools/perf/trace/beauty/beauty.h | 3 +++ tools/perf/trace/beauty/fs_at_flags.c | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 8417387aafa8295d..58546e8af9fcf481 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -947,6 +947,15 @@ static const struct syscall_fmt syscall_fmts[] =3D { .arg =3D { [1] =3D STRARRAY(op, epoll_ctl_ops), }, }, { .name =3D "eventfd2", .arg =3D { [1] =3D { .scnprintf =3D SCA_EFD_FLAGS, /* flags */ }, }, }, + { .name =3D "faccessat", + .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* dirfd */ }, + [1] =3D { .scnprintf =3D SCA_FILENAME, /* pathname */ }, + [2] =3D { .scnprintf =3D SCA_ACCMODE, /* mode */ }, }, }, + { .name =3D "faccessat2", + .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* dirfd */ }, + [1] =3D { .scnprintf =3D SCA_FILENAME, /* pathname */ }, + [2] =3D { .scnprintf =3D SCA_ACCMODE, /* mode */ }, + [3] =3D { .scnprintf =3D SCA_FACCESSAT2_FLAGS, /* flags */ }, }, }, { .name =3D "fchmodat", .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* fd */ }, }, }, { .name =3D "fchownat", diff --git a/tools/perf/trace/beauty/beauty.h b/tools/perf/trace/beauty/bea= uty.h index c94ae8701bc65a2f..78d10d92d351f8e2 100644 --- a/tools/perf/trace/beauty/beauty.h +++ b/tools/perf/trace/beauty/beauty.h @@ -237,6 +237,9 @@ size_t syscall_arg__scnprintf_socket_level(char *bf, si= ze_t size, struct syscall size_t syscall_arg__scnprintf_fs_at_flags(char *bf, size_t size, struct sy= scall_arg *arg); #define SCA_FS_AT_FLAGS syscall_arg__scnprintf_fs_at_flags =20 +size_t syscall_arg__scnprintf_faccessat2_flags(char *bf, size_t size, stru= ct syscall_arg *arg); +#define SCA_FACCESSAT2_FLAGS syscall_arg__scnprintf_faccessat2_flags + size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct sys= call_arg *arg); #define SCA_STATX_MASK syscall_arg__scnprintf_statx_mask =20 diff --git a/tools/perf/trace/beauty/fs_at_flags.c b/tools/perf/trace/beaut= y/fs_at_flags.c index 2a099953d9935782..c1365e8f0b96ef43 100644 --- a/tools/perf/trace/beauty/fs_at_flags.c +++ b/tools/perf/trace/beauty/fs_at_flags.c @@ -7,6 +7,7 @@ =20 #include "trace/beauty/beauty.h" #include +#include #include =20 #include "trace/beauty/generated/fs_at_flags_array.c" @@ -24,3 +25,26 @@ size_t syscall_arg__scnprintf_fs_at_flags(char *bf, size= _t size, struct syscall_ =20 return fs_at__scnprintf_flags(flags, bf, size, show_prefix); } + +static size_t faccessat2__scnprintf_flags(unsigned long flags, char *bf, s= ize_t size, bool show_prefix) +{ + int printed =3D 0; + + // AT_EACCESS is the same as AT_REMOVEDIR, that is in fs_at_flags_array, + // special case it here. + if (flags & AT_EACCESS) { + flags &=3D ~AT_EACCESS; + printed +=3D scnprintf(bf + printed, size - printed, "%sEACCESS%s", + show_prefix ? strarray__fs_at_flags.prefix : "", flags ? "|" : ""= ); + } + + return strarray__scnprintf_flags(&strarray__fs_at_flags, bf + printed, si= ze - printed, show_prefix, flags); +} + +size_t syscall_arg__scnprintf_faccessat2_flags(char *bf, size_t size, stru= ct syscall_arg *arg) +{ + bool show_prefix =3D arg->show_string_prefix; + int flags =3D arg->val; + + return faccessat2__scnprintf_flags(flags, bf, size, show_prefix); +} --=20 2.44.0 From nobody Sat Feb 7 15:11:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C90985C69; Wed, 20 Mar 2024 19:31:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710963090; cv=none; b=CbxT7cMaSrkRsPPYe1x70FRhD0eXO6OD+UfTxTG0SXTDy70z6yexHBAlqJZ6ZF4zVWyc0Plc11OqBAwaOAHwayj0wZYjHXknl4LBSo2xcj+I0lfY2nMdq1u76z1ffzZ5dBtdXjyBUttkHVcbhPy5bYd3i1b0HxCQAfmK/qNm71o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710963090; c=relaxed/simple; bh=lKWJoxjKHcGWhs7EF/8Am3tfhFRbd6IhsPFZoIW5wnY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tENpIJd9wZlkOR8D64xUws/sH0gXNMwZGKH+X4C0CbLx4VVOS05d7NSyXfVhoe+MUHIsQe7FT+jphhivGQID/0i9su36ZxQnvzsDEiQU1OFBOPNr8FGjAQQQuOMLtuUW7L4nZKF65n8BNadAtTKBF/YqW6S5S+DXIPPB3OollRU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=H9T2CD56; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="H9T2CD56" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EF992C433F1; Wed, 20 Mar 2024 19:31:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710963089; bh=lKWJoxjKHcGWhs7EF/8Am3tfhFRbd6IhsPFZoIW5wnY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=H9T2CD56k0+dqbNjPy+2+Xz/0cWCd1W+4u0iNbNAO8lcAbbJhpxmVVxlFgpyzfvFZ U56r4MIEkECYoBTcCELT+xn/SSEPm1LRu8UWgYA5ODqdYPlFySVq5LFaiHYJgAXnbn 52E45CoxyNtkzckzw3t8xBi8e1ao1I35wKlBXri8DecdnOXGSTvs6i19h4RqbBDkO2 6nPIqFfe0dC4c848i7RJTg6Vw8sA0NrXTwGgxujpU4xT0zAn3vwoktcLBcixYeb6N/ 4XuEiA2XR1fYLzLz3NxjwOT4a5uYAsVFTiMREeakgpvAj/0VHe5wmZPoYxKWrztvrC idZiTEyJY4hAA== From: Arnaldo Carvalho de Melo To: Ian Rogers Cc: Jiri Olsa , Namhyung Kim , Adrian Hunter , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH 4/5] perf trace: Beautify the 'flags' arg of unlinkat Date: Wed, 20 Mar 2024 16:31:14 -0300 Message-ID: <20240320193115.811899-5-acme@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240320193115.811899-1-acme@kernel.org> References: <20240320193115.811899-1-acme@kernel.org> 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 Reusing the fs_at_flags array done for the 'stat' syscall. Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Namhyung Kim Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- tools/perf/builtin-trace.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 58546e8af9fcf481..ef0dfffd99fdf3cc 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -1171,7 +1171,9 @@ static const struct syscall_fmt syscall_fmts[] =3D { .arg =3D { [0] =3D { .scnprintf =3D SCA_FILENAME, /* name */ }, }, }, { .name =3D "uname", .alias =3D "newuname", }, { .name =3D "unlinkat", - .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* dfd */ }, }, }, + .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* dfd */ }, + [1] =3D { .scnprintf =3D SCA_FILENAME, /* pathname */ }, + [2] =3D { .scnprintf =3D SCA_FS_AT_FLAGS, /* flags */ }, }, }, { .name =3D "utimensat", .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* dirfd */ }, }, }, { .name =3D "wait4", .errpid =3D true, --=20 2.44.0 From nobody Sat Feb 7 15:11:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C19158613F; Wed, 20 Mar 2024 19:31:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710963091; cv=none; b=RdjIGERs2oh8RD6W+Y9DHnxQhDJ5Zfs3LaDOsGEpXy/l4VebePIDNIYnrT5jojizcYE2iEL2uI8WD68vZVFq0OJ7JAZliSVTJUsmBtRqq2DskVuUCh9uJgMoNUPpm7TEMCYIjRoBfXEN2N70on2UI54MjSue31Q7N/NV/bynoBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710963091; c=relaxed/simple; bh=eUsuge4+k2kINM17oy2Ter3CncLnZySKltBWMB5vbbM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kTOYs3knViQxNzb6y/noPk+tBMyxQfYxeOAeeruNBXEkdV1pk+rDe0EEJpeSenxP3/xWpDOcAaEsosGPj78EbslG5qj/EnBoLKdQ5RKfmBlnuAibXbYBHedi/vNTpSb+rlq45rwk4cVbkNd4gBhg4HVhfpv2Sna9JRFJcGNJYTM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IZY1ZrA5; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IZY1ZrA5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0DB80C43390; Wed, 20 Mar 2024 19:31:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710963091; bh=eUsuge4+k2kINM17oy2Ter3CncLnZySKltBWMB5vbbM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IZY1ZrA5S0DC73gt5+EmLLLY7vwtrq0eJygxt9XgK77vnYr9sMbj2Df0hZ3Mtu/5l mSiXeAOIUeKfow22tazsZSrRKEx0D+yPhZH1Hs96ey9NJEVtWS9jlYt7ode1tstaeY mAyrXS6z5udHAPBrR2GCWY7COT1/06cODxB5/AWpz7+vYeTn8rMO4h/uF8EevAc04l 6xsTzVTPpXFHqKYq8DMtgJPgALpyH2J66oTQUX+5I6wChSr7MVgrO7tGu4RuSmgxwd /ap8binKOZrO7qMbYDt7pA7MTNBEwnXkVLQciDUCNEUkLqB199a1oPf6v+BpDDZ4Jl L2WSkqHExIM0g== From: Arnaldo Carvalho de Melo To: Ian Rogers Cc: Jiri Olsa , Namhyung Kim , Adrian Hunter , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH 5/5] perf trace: Fix 'newfstatat'/'fstatat' argument pretty printing Date: Wed, 20 Mar 2024 16:31:15 -0300 Message-ID: <20240320193115.811899-6-acme@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240320193115.811899-1-acme@kernel.org> References: <20240320193115.811899-1-acme@kernel.org> 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 There were needless two entries, one for 'newfstatat' and another for 'fstatat', keep just one and pretty print its 'flags' argument using the fs_at_flags scnprintf that is also used by other FS syscalls such as 'stat', now: root@number:~# perf trace -e newfstatat --max-events=3D5 0.000 ( 0.010 ms): abrt-dump-jour/1400 newfstatat(dfd: 7, filename: = "", statbuf: 0x7fff0d127000, flag: EMPTY_PATH) =3D 0 0.020 ( 0.003 ms): abrt-dump-jour/1400 newfstatat(dfd: 9, filename: = "", statbuf: 0x55752507b0e8, flag: EMPTY_PATH) =3D 0 0.039 ( 0.004 ms): abrt-dump-jour/1400 newfstatat(dfd: 19, filename:= "", statbuf: 0x557525061378, flag: EMPTY_PATH) =3D 0 0.047 ( 0.003 ms): abrt-dump-jour/1400 newfstatat(dfd: 20, filename:= "", statbuf: 0x5575250b8cc8, flag: EMPTY_PATH) =3D 0 0.053 ( 0.003 ms): abrt-dump-jour/1400 newfstatat(dfd: 22, filename:= "", statbuf: 0x5575250535d8, flag: EMPTY_PATH) =3D 0 root@number:~# Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Namhyung Kim Signed-off-by: Arnaldo Carvalho de Melo Reviewed-by: Ian Rogers --- tools/perf/builtin-trace.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index ef0dfffd99fdf3cc..d3ec244e692a415e 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -978,7 +978,6 @@ static const struct syscall_fmt syscall_fmts[] =3D { [1] =3D { .scnprintf =3D SCA_FILENAME, /* path */ }, [2] =3D { .scnprintf =3D SCA_FSPICK_FLAGS, /* flags */ }, }, }, { .name =3D "fstat", .alias =3D "newfstat", }, - { .name =3D "fstatat", .alias =3D "newfstatat", }, { .name =3D "futex", .arg =3D { [1] =3D { .scnprintf =3D SCA_FUTEX_OP, /* op */ }, [5] =3D { .scnprintf =3D SCA_FUTEX_VAL3, /* val3 */ }, }, }, @@ -1060,8 +1059,10 @@ static const struct syscall_fmt syscall_fmts[] =3D { .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* dfd */ }, }, }, { .name =3D "nanosleep", .arg =3D { [0] =3D { .scnprintf =3D SCA_TIMESPEC, /* req */ }, }, }, - { .name =3D "newfstatat", - .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* dfd */ }, }, }, + { .name =3D "newfstatat", .alias =3D "fstatat", + .arg =3D { [0] =3D { .scnprintf =3D SCA_FDAT, /* dirfd */ }, + [1] =3D { .scnprintf =3D SCA_FILENAME, /* pathname */ }, + [3] =3D { .scnprintf =3D SCA_FS_AT_FLAGS, /* flags */ }, }, }, { .name =3D "open", .arg =3D { [1] =3D { .scnprintf =3D SCA_OPEN_FLAGS, /* flags */ }, }, }, { .name =3D "open_by_handle_at", --=20 2.44.0