From nobody Mon Sep 28 10:43:09 2026 Received: from CWXP265CU008.outbound.protection.outlook.com (mail-ukwestazon11020087.outbound.protection.outlook.com [52.101.195.87]) (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 383BF382388; Sat, 22 Aug 2026 21:36:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.195.87 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787434586; cv=fail; b=NLfvQARPAhYBaGYNp6fP4BWqcoRmvtX3RyTgz4skOhy1JsDxe7AcSyMWrMPVhr0AVpsGNU4BwT4OeOZhBqg9xZCbDB+/YseMQkn+bqhSCGLs7xRiucl22VGWC2M+FVTil/BzMqngZ18Za1kxWAj0yvirhUHfssjeVUb5+lPSf0w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787434586; c=relaxed/simple; bh=/dT15EN5BtXqC/Kc+JIYw1DdFsMy6ur+RmiE+0tyCcI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=KXFi+wc7x3cNHcLc6sIZKG+MxyNpnzJtTHWVkhlNgWs/s6w1mEtfBodEslYAYJXMQJhoCTPkb2JWIrA4zW49UCqSQB7CMp8uKXOtd82rKKk4H9e+fvO+pyqoADkuWtkXkGGPfX4UQzoP5AGY55XNCO+pCeGFyQ8N29V1UVCCJWU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=atomlin.com; spf=pass smtp.mailfrom=atomlin.com; arc=fail smtp.client-ip=52.101.195.87 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=atomlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=atomlin.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PxpFNRqAH526Y4ToGY/14Gpjg1RbP5JiCFcNyL9Y8Nhwn4PLKeX23HjGKZKD2jXlCuxbZN3Z8snfwmU/jJNRKNW/LTH55VJvicyDdp9ugayya4oSgs4aW6RZc2K3p5rhgyeoGnZKfpCzzg3xiNjrsmlU3A8PlfihPssSSzIXz4ZvKBNF1hPVTF+PBQrpg8FDCZRWlaLXbhW0ZdD2P+Q3eKlJLrv8o6NNjzmpmRXuNbcSuuVvGnUJfqUs4UolUSphh+MGuGn89g4AJyfU2mqsvoGZaCX+moFv8MYs+IpC3I6ZL0jOXGuSL06I+HVDCrxEJZLjFY3O/FwQRtgq8UCj2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:MIME-Version; bh=+LY40U8azJZOZVX5dkyDjbVu9cZgdNS5hWk4U+zDsEQ=; b=jytLPE2qwO6yT+4BGg2xtqLgt/vGTuJ4OyUhLTbB13yg5iErm2CB9s7LIr7qp9z1Fmo1vLUMtEwr7RBk8TF0R1PyaEsBNnqdOc0VNhpWqB4u1tfeQg2lgerrBqP1CDx1jod/j2vtlLn425lddyzqJYikEwK4tQMYraEh7I6fWhvs7SdBk9UxpRjoZlsvG28HKXQnbNJgzEc/Y0E+1Asu3Pe2ECBKSHeXwwo44rev5duQykBmog9IFV2dwubNg7aQ6OCfHCEf6DAmJcuu4jk6JeXfCTQ0ay1ejJw/d1pMflftyalBQw3BgfDEgnZdE6T5QKs93BmoR3TXxIG7YknGuw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=atomlin.com; dmarc=pass action=none header.from=atomlin.com; dkim=pass header.d=atomlin.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=atomlin.com; Received: from CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:183::5) by LO3P123MB3193.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:b5::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.11; Sat, 22 Aug 2026 21:36:19 +0000 Received: from CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM ([fe80::cec4:77ab:262e:d230]) by CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM ([fe80::cec4:77ab:262e:d230%4]) with mapi id 15.21.0339.010; Sat, 22 Aug 2026 21:36:19 +0000 From: Aaron Tomlin To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, namhyung@kernel.org Cc: mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com, james.clark@linaro.org, howardchu95@gmail.com, atomlin@atomlin.com, neelx@suse.com, chjohnst@mail.com, sean@ashe.io, steve@abita.co, rishil1999@outlook.com, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH perf-tools-next v5 1/4] perf trace: Introduce kernel symbol beautifier for virtual addresses Date: Sat, 22 Aug 2026 17:35:55 -0400 Message-ID: <20260822213558.704018-2-atomlin@atomlin.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260822213558.704018-1-atomlin@atomlin.com> References: <20260822213558.704018-1-atomlin@atomlin.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0429.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:18b::20) To CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:183::5) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CWLP123MB6607:EE_|LO3P123MB3193:EE_ X-MS-Office365-Filtering-Correlation-Id: c83c2c4d-2c1d-4ec8-1b27-08df00955c2f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|23010399003|366016|10067099003|56012099006|6133799003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: hrWWgUnRPVabROlV12wMJOdFcKwrSMNwNOcO3UJ13/d7I6yTOKBONmXhhwwkMtt+HnwCAjp7yQ9p9MEOgrGGbPTWwXeHxF0QrMoz7y5QwsVK/gSKXozuHp+CgWYPOn0ecmHYJNi1s4/g8TipyqjYnAzKuZQ74GfCr1oI/v4bYMsEgOYdfqRIdH+DXbjR7JP8okehvB/2I/FyXhtx3cpADc8yXDeMGOVzxfj3q58VRsXHOjPmANEh+hQk6hGqsRAQ5Mz0wmG3CN7BTy2Jrg4ThFw7Wik7gZmSB129x+ktbwA3YNHegqMnmKsyM3A8JEyEkJEUmOnyC+UudDPeQcJNv0vMk47P4t0JSTyHixpninyk+SXBzr/t950h9DxNWGd7ylzle4hxSkcho0V0mQAmbSVsrISpMkoJUPN8sC0wYQaCmKk2uOvpycjLPjp4y95EjGPN0naBxLguywsNE1/1lhAY80rVRJ2bUjof+1+c8V7Q8jrxha8cF5b8/QJRZqp00yZGHJWplmHKoqYxTwN9cG0hQJKh/EWxY33PSiHDP/Jd3ADok9mqv3Qv1Y6I/9x/9reFO0uWcP48XY8lg4J1+g+iCsOD1n7/8ebnJgza6zOEKSiuhL2zkj5RPXJoLiH21UbpMNoqf98i9yr/v0WrlVgSvtK25XPBd8eKQN3sRfo= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(23010399003)(366016)(10067099003)(56012099006)(6133799003)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?as08O7bvpZGQ/A5bF6hhxmqNG8mMqr3Osy/rqMr72CicOGzwBpu+cMWn417g?= =?us-ascii?Q?AyRfPC8tRYsfAE/0A83mNHIEcUcxCP7ud0Yj64HT1poV46FM+pesilHiQtcF?= =?us-ascii?Q?KPXnY6L1FrGlgk+eFetYfBzSIW4+rUeN1MmXqKMztBnT2dl9WsceCV2FvQ+b?= =?us-ascii?Q?BymNtDmJCK7m2Lt9HpbP/iIs9ojHHWW5sgeHzzZR0Er6JUdYZVyqbBa3QNMx?= =?us-ascii?Q?C+a8qI81jqqW2AqHbhEiOqxFyu7S0CM3jOyFk1UYaOFP2K6JtUnEvMbhC2Ur?= =?us-ascii?Q?wBLz4I7KUt9YtgsAsYqI7F7QvURJeAsH4c/q0I5f0mdKli4v8ju3smKIx1Ty?= =?us-ascii?Q?/hYV8tKBvTuuta7QbwrDoqH4bJV/qGTacdKcUU3OLcFf3s/YvseYbrdW1xS0?= =?us-ascii?Q?vtcUw1ENR54cas9jVofULieZkFiBBAE07/OHeUk/4QVYDlWUJjRHgl8kl6/P?= =?us-ascii?Q?Ji48c7VL8M3CxgkywCj/q/o5Wgy94jjz3kpDIEg5jgVAVbyKBJ602TpoEe2d?= =?us-ascii?Q?Wd4Luf0pbD2mYQ9Z1/xGP+V+/i0TZHweXuWfRmRXeqSFMqBNMzIyin7FCGfd?= =?us-ascii?Q?mzgAHWcmWhHSkPPGrVBmUBhpS3sJORoETyKLY7hK+rrr9E2d81kjw+wGH164?= =?us-ascii?Q?ia48gIF1JQlT+DasIfABdOLThQ+da9VliccZSv+n3PhKGoHysffylfuzNHwQ?= =?us-ascii?Q?+MFSlOHQ6GQdsox1KG0S2JNxVqzvbK4FHyb5lE3gNydP2ihJLgg+t+verKQm?= =?us-ascii?Q?NnF/2OEYwRZgd/zCmT5s5DDre/5o+W7T38r3sjmI1Uvt9SJO65SSUsIgLg68?= =?us-ascii?Q?EIVli0NK73RDYjCCGVKNlgKhEW3AJxxDfYA4cg7Py73u6Ab7PN32fFWeDHvQ?= =?us-ascii?Q?LXe0zloPCvoXt0KA3aLRfHrCmZZVgH5A1othp7VtAmZgAofuaFI4wdIV+Tun?= =?us-ascii?Q?FK33PiY3zHHBLbVrylMB15WxQz5ZbM0NQbhbz9zTF0CHOvDTgicD7EJwELTv?= =?us-ascii?Q?arHq7CJCa5hJj6lrWilNSOO7z3s0147XmxmZOOv9klpjBsG2FvYCb43CEk56?= =?us-ascii?Q?TaDISQOM10Hjd3SqZzIp44xJXG/52bJsY5nGzlX4hAfFmWEGHZjPcwkTxv15?= =?us-ascii?Q?UXw06KcMwRnQLPX4vndKCm9bTskha0F8tusgFhnNWxjMMr/8TPvNBEBCnE8R?= =?us-ascii?Q?yUwjSLWS+gw0FpxLWE/XZoq6f/pk+4HH2ck8XP8B2BmN2zluRky8uszAuDlT?= =?us-ascii?Q?9J2aSH5XjHCVXIif5WCsudzpqaqSbbfTHosyt+JC+6LoZVvzG1cVgla4pqQE?= =?us-ascii?Q?Cv3yBMgP4vw0/sTG6GdhhanvU0+dFF9HVn6sBNafVV5dFmrc2sl939ohsdIL?= =?us-ascii?Q?2qEIZ+5U3KtTSVOlcBWeRpAPoZLqpe0jbt9lOj/W9baRX19807/RCpA2HEq1?= =?us-ascii?Q?LsHy32XERSIx0UO2EsxBEa65hh0LM6ftM2eF8uUMT0k65icrf5dTLAfcImKL?= =?us-ascii?Q?YDBsiLofoQsdHNaxg7WvCQiDFLBlwOpq8La8ikypiEgl0Xm/j1ONhu6NFA2m?= =?us-ascii?Q?B2YGMOntOLIqxcAC7FWfCCnKAtvLj+dzwr2aqc0nfpXhQCo8hazrKAxD9pwZ?= =?us-ascii?Q?9YGlcbW1YBigmZHVGKF/B+HaTrK91t4+8mmm5Xjbpu1X2JSEQZ9/HsmTTxxq?= =?us-ascii?Q?Mb36piR5yLaxJFv1KcBCn9m4b201HAiM4OP7mIGM8B1YRcsF?= X-OriginatorOrg: atomlin.com X-MS-Exchange-CrossTenant-Network-Message-Id: c83c2c4d-2c1d-4ec8-1b27-08df00955c2f X-MS-Exchange-CrossTenant-AuthSource: CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Aug 2026 21:36:00.7793 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e6a32402-7d7b-4830-9a2b-76945bbbcb57 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: cHI5LLjkwCTN/Q+YAOmdBgZMozP+soROl+AgpSJegRnMXat4veY0W6CfZl8Wx9O+60Wc1zAoyq8yolDUuzofYg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LO3P123MB3193 Content-Type: text/plain; charset="utf-8" Currently, when 'perf trace' formats tracepoint payloads or system call arguments containing raw kernel virtual addresses (e.g., a work item function pointer work_func_t in workqueue:workqueue_execute_start), it prints them as raw hexadecimal values (e.g., 0xffffffff81234567). This impairs readability when tracing kernel execution flows. Introduce a dedicated kernel symbol beautifier, syscall_arg__scnprintf_ksym (i.e., SCA_KSYM), to resolve kernel virtual addresses to human-readable symbol names and offsets (e.g., "flush_to_ldisc"). The beautifier looks up the virtual address in the machine kernel maps via machine__find_kernel_symbol(). If a valid kernel symbol is found, the symbol name and offset are printed without requiring --libtraceevent; if the address is zero, "NULL" is rendered; otherwise, it gracefully falls back to hexadecimal formatting. Signed-off-by: Aaron Tomlin --- tools/perf/builtin-trace.c | 29 +++++++++++++++++++++++++++++ tools/perf/trace/beauty/beauty.h | 3 +++ 2 files changed, 32 insertions(+) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index c3c7f1f85c53..003048946503 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -750,6 +750,35 @@ size_t syscall_arg__scnprintf_ptr(char *bf, size_t siz= e, struct syscall_arg *arg return syscall_arg__scnprintf_hex(bf, size, arg); } =20 +size_t syscall_arg__scnprintf_ksym(char *bf, size_t size, struct syscall_a= rg *arg) +{ + if (arg->val =3D=3D 0) + return scnprintf(bf, size, "NULL"); + + if (arg->trace && arg->trace->host) { + struct map *map =3D NULL; + struct symbol *sym =3D machine__find_kernel_symbol(arg->trace->host, + arg->val, &map); + + if (sym) { + u64 start =3D map__unmap_ip(map, sym->start); + u64 offset =3D arg->val - start; + size_t printed; + + if (offset =3D=3D 0) + printed =3D scnprintf(bf, size, "%s", sym->name); + else + printed =3D scnprintf(bf, size, "%s+0x%" PRIx64, + sym->name, offset); + map__put(map); + return printed; + } + map__put(map); + } + + return syscall_arg__scnprintf_hex(bf, size, arg); +} + size_t syscall_arg__scnprintf_int(char *bf, size_t size, struct syscall_ar= g *arg) { return scnprintf(bf, size, "%d", arg->val); diff --git a/tools/perf/trace/beauty/beauty.h b/tools/perf/trace/beauty/bea= uty.h index 58a3206481ae..0f4801c61a5b 100644 --- a/tools/perf/trace/beauty/beauty.h +++ b/tools/perf/trace/beauty/beauty.h @@ -160,6 +160,9 @@ size_t syscall_arg__scnprintf_hex(char *bf, size_t size= , struct syscall_arg *arg size_t syscall_arg__scnprintf_ptr(char *bf, size_t size, struct syscall_ar= g *arg); #define SCA_PTR syscall_arg__scnprintf_ptr =20 +size_t syscall_arg__scnprintf_ksym(char *bf, size_t size, struct syscall_a= rg *arg); +#define SCA_KSYM syscall_arg__scnprintf_ksym + size_t syscall_arg__scnprintf_int(char *bf, size_t size, struct syscall_ar= g *arg); #define SCA_INT syscall_arg__scnprintf_int =20 --=20 2.55.0 From nobody Mon Sep 28 10:43:09 2026 Received: from CWXP265CU008.outbound.protection.outlook.com (mail-ukwestazon11020087.outbound.protection.outlook.com [52.101.195.87]) (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 39E2530EF80; Sat, 22 Aug 2026 21:36:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.195.87 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787434584; cv=fail; b=GWOAdcExY0ba6UpB2j+kJyUdUetbFp1oKoDzUHEYNoPPWZ0OxnECD/NTdIIxKW/cxc40GiUoSGp3rkmpiJTiPCDpQAlV3uc37OD+8JMSGruPFOp0mjaPpdjf2cUy+oNMl6H8Ut7v5Ys2czGXkkpcz/SdsOoH4fmf1GdKUfx3XMs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787434584; c=relaxed/simple; bh=tT5YQRjTJ90xQwacb9pcIpnthXyGQoQ8jCH6b7HDrKE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=cV4yKZ32Vt0Zjl3SSojh++qIcXRWu+1SzpQhxYVM6rADPsu1b7jr/tNcHE+N7XyalOlc6qqLJL+WMa7WtP2JTYlUFZf1w2o6ysF7+3FNAMMAp0O/6fASTVZpryb0Rp/E6aMTcdLm+EZGG1zEJyxk6tzphecxHMo3f13uYJtpYwo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=atomlin.com; spf=pass smtp.mailfrom=atomlin.com; arc=fail smtp.client-ip=52.101.195.87 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=atomlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=atomlin.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bQcGXZn3D7Ol7bvuH89tDr/uXNsko8eOX39u/nW5s3FVXHhpmH/AB2/STxTo4kf9W2/Ho2+nvxUcte0Sd2I6HYEj0qx9EvMSVNYSGErOlOc9iC7584UBD2F5RMm17L5kMcNb55MJh6AXM0iGEhIUlM5cTM6CT/vKlFQ2aVXy3/OxZhj+DZ2VRQVAiqHr+S/rToZec/s1AGE0gQRP5cA/EyV/mU+jsCmEEiLbHmhfixyDQKvgdB15tDxvInm75kbutX39GwJsSW3Pgmzv+fEmexkdtvyVZPaW+B5RMRT7wxTDTpb/2PLnDNtPm4WeRNjTEw5eViiNXuh9+zvNTCBSRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:MIME-Version; bh=hPV+0tweCWY5vG3dgnQcV9Z0PtyZ5oMTEJ5uV11oAG0=; b=aZTzoe4Bf0GUgnhDEr1HIokU3e7ylIBFxAqDCBUuwlneoVjojAG3PUwVc6MJnEn6k7/dcgpScM78AvPzPynqxfx5pKYj6h+L3p2ynogsOsJ8YM9X3dCndU9birZJ60isnSO8XBNwHh1rpGdx74pqoxt9ikYEiJvt2acLVuYEGgrTQCFWMvzHBmBlpY8ryM1178MN94a5ylF9sAm6VKPgzKApXok6tRSD8pBzm2/aCyf7ZUapN7m7YKy+NTc60M7PBfu7uOO+r8EqbmYZPHLeQWeg2VLmIeBw5n+deA8KYrJsP4vXpzqOoygl3H9/6gnmanw2L0QH25YcdG6OcVzkSA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=atomlin.com; dmarc=pass action=none header.from=atomlin.com; dkim=pass header.d=atomlin.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=atomlin.com; Received: from CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:183::5) by LO3P123MB3193.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:b5::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.11; Sat, 22 Aug 2026 21:36:20 +0000 Received: from CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM ([fe80::cec4:77ab:262e:d230]) by CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM ([fe80::cec4:77ab:262e:d230%4]) with mapi id 15.21.0339.010; Sat, 22 Aug 2026 21:36:20 +0000 From: Aaron Tomlin To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, namhyung@kernel.org Cc: mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com, james.clark@linaro.org, howardchu95@gmail.com, atomlin@atomlin.com, neelx@suse.com, chjohnst@mail.com, sean@ashe.io, steve@abita.co, rishil1999@outlook.com, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH perf-tools-next v5 2/4] perf trace: Auto-assign kernel symbol beautifier to function pointer fields Date: Sat, 22 Aug 2026 17:35:56 -0400 Message-ID: <20260822213558.704018-3-atomlin@atomlin.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260822213558.704018-1-atomlin@atomlin.com> References: <20260822213558.704018-1-atomlin@atomlin.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P265CA0102.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2bc::17) To CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:183::5) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CWLP123MB6607:EE_|LO3P123MB3193:EE_ X-MS-Office365-Filtering-Correlation-Id: c6042c35-8bb3-41e2-3ce8-08df00955cf9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|23010399003|366016|10067099003|56012099006|3023799007|6133799003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: i7+Ds3Sn1+QEbaSLm3iYbqm/NOzm89+CfoZigCsfPRU7E2QBlq9mgYMTJphctAB5F0srA9AUDMYIb9RZKlFe55AgPAN/U5mtDprOVoN0Ikx/qPqawFLpGXhGKKyFthZKEyI5/NYPWbDAZ3wAYYLtnZJwKCiBUEawnU3waqhZf16qhySA1mdecHXwPtsAxj3Qzo8iN0cjZQmC7mBi4NHILGVGpF16EBU80INb4rGKSEvlx1zb1dFYySkPLvXbo+RRW7mZbwEQ7Erzv2EXyes7XkPhQKv9+j1uQcOLaaUcgzPTfHLy5o0N4AXNMonmyAB48LWzMN/gKVv23OvhgrathnLtkKLc8VsnynOTnAvF2OqnlDnxVxlbjlDfDD7pFiolq5gUXMFcg60dhLVXRAzDpA7qLuXALArdJk7SfPOthNSxwbVuKHvkXyFHvBb6IxL4PvCKC1QhXYKK4vFNsCSVZhJUvvvIxMQRnUiLA1QeEEUQgolgO/dlkV+lNmpCgtpYjbIAa0W2I+0s9BQsKv+tnOLpIj+udp3+2OWoVglrQZMUcFRjssSU/X13mcbL98Nd7DABJ4md2Caxu4nd2i3CXxPSokOWHwRNtlHxhPgMNGUzHEssqFQJlwuqXmGONDp8S4wRkS56lTvy0RvO7Wmb+EOl1gjZyK6abamhrfnAj5I= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(23010399003)(366016)(10067099003)(56012099006)(3023799007)(6133799003)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UU1Na3RCQy9WMGhoSU8zM3JJVmhhSTQyL1J5MEt6S0ZTSWRFSTQ5VjJ1RDJt?= =?utf-8?B?MWlLY1lNOGZBR2dwVytGZDd3M0NJdWlENFJRTlpEWUNHbVJOUE00cU1lTGVp?= =?utf-8?B?TmltSEY3SVZERW9nRCtwQzM2bGdBd0RTSVlDcmpGcjNReWFwaTFpRkNteUdC?= =?utf-8?B?UzB3ZHZQUEtjWkNzeUZCb1hiNTJoclVlWU9iS25JbUxsaDgyaGhzMVBOZkZR?= =?utf-8?B?RDNibEhZTXpnblNxRkJmTHJVekROWUNDVEZuMkhLTjZWeC9tbHBQSzBodzlZ?= =?utf-8?B?NFY4SGFGV0xqbTRMeFRJSkdoMyt3UnlzRUxGS2UvTkpOb2Y5TUhBeXU2ZG10?= =?utf-8?B?b2pwWCt4aTR3eFVqMlZtNFNNNi92ME5tTjF6dXFaTURpNDhCeWczd0VDSjRM?= =?utf-8?B?cXd2QkZKaE5lYThHRXNOYmZtb0xQNTFWOEZtRk9LU3lXYUpjYVIyaWxrRVRS?= =?utf-8?B?cktTM29pdWVtV0UvdVVhaWMzNEJJbGMwQU1QUWhOMVlFd0s4dlp2dVV4MHBG?= =?utf-8?B?NGxDdG9DQnZWVFRETjlCVmkwN0VmZEs4Zm5lMENDd0V2L09BMENtQnMyaUxW?= =?utf-8?B?dHRTVW1vMGhMVmxSTFR0aU5GTlhtRnBxSFdLbElDZkZLRlVtRE1NREg4aDRz?= =?utf-8?B?aEJZb2MrZUdnVDMxejQzeTVjNHJ6bGVSb1JTNXhhYnVmYTg0aVM5dENpS05B?= =?utf-8?B?Y3Q1aW9PSlV1U3dlcXE0L0gzY3RJWVBleWpYNnVZeWYydlErVWdCU3hHT0Jt?= =?utf-8?B?dWRvckYrRkYyQTdwRGEwV05mTGhhcnBmdkVjS2lRY2owYnk2VHZ1a3h2eUJo?= =?utf-8?B?VmhMaG1wZkFyOWNXRXBYOTQ0VEIwQXFTd1kzdFVrenlybGdPaFE4dkIra0ll?= =?utf-8?B?L1gzTnhVV3NsQWVCZ2VmM2lRN28rRHNXMndFd2ljeDdXa2ViMjdrMVd3NjNl?= =?utf-8?B?VDZGL3U4K2lJeHBwSnpxRmtmeXYwK3FJSW9QL2FKVEFxUEhvZnRZR0VaL0Yr?= =?utf-8?B?TGN1RzZtbXJWenJHMzhxR1dmSm96eXFWR0Y3Wk5wODk2c3V6V1B2RWlQUUwx?= =?utf-8?B?UTZkN1ZETkYvVkJTVUpvZkhQZHhpaWpxbkY5RnhDaDdYM05kdU42K2VQQzJM?= =?utf-8?B?dnpFTy9SYkJZZmtCTkdVM1FUQmhHUXpocFRLZ1FWb2xjMitOK1dyRnZCVG9M?= =?utf-8?B?dEkwdHA0ZVYzS3dFU0wySjIzRmFhRFZWSHMrRmYyT25PUFZGSTZJdE9VNXpW?= =?utf-8?B?LzhEME15RU1SMnVWNm5Eak4vRFhDMmRpVHp5dlQzT0pQdHhwTC9QWlJuNGNo?= =?utf-8?B?TC96OXZNZXp4aHYvRmNTYmkwTEZhcElxK1JRODhHYWdsTWxjNGVkSWh3VUdp?= =?utf-8?B?Z1Vpakt6VEtGQkNsUnFrbnFEMWpvNUpGOEdvcFFxQTJJaFNzYUtCbjUrOU5n?= =?utf-8?B?aWx5WFhuZWFsNUhUZy9EN1VYT2hVMTJwYTNKdUNDcldnZVlwamdvdEZPaU9n?= =?utf-8?B?dkwzREZnQzJwN0lvOHhGNStTV2lZZm5iSjdTSW5mSjdTMTBmbS9Bam9pL1dh?= =?utf-8?B?WVVKMEMrRG01QmNwNFV1OUVUVWNldEdkOS9aVUlYRmYyd2lxcTdiREdJNkh6?= =?utf-8?B?VWJrZGpMWHdNWm5GYVkzTHBUM2VQWXIrOVVFVDZmUXZvVGtwcVl6UnpVbHJ2?= =?utf-8?B?SG1lZjJ5c3p1eGlGNkpGbjdEZDMzem9lN1dEeFp0VkhzRXBsSi9WSVVlN2ZB?= =?utf-8?B?dWlXZWZrVlBXanJDUTcyQWxlMGdTY3FqaUhKTzNtdW9qMUIrTFVxL0lsRHpz?= =?utf-8?B?MGVuRzhmVUpvRW05Z0l3bEhFZ3ZiNEFjSExoRFYycitGUjNRVytqMlpkYXo4?= =?utf-8?B?c1pOYitkU1NxM0wzcy9zNGNNOC81eDlST25uZElwVkJZc3pRWXo4b0xXRGF1?= =?utf-8?B?RE9tcVhVang0VFRIR1VWM0I5SjhxTXMyNUNJQmo4OTFqTkUvUTlDais4aC91?= =?utf-8?B?YmJvYVlEeVBCY3AvTUEybm0wWkJLZFlPb1NFSnhiQWlERDF3TjZkT3M0TktO?= =?utf-8?B?UG9Zbit6dEF4NzkvZ0VxZ1Y2OFRNZWU4N3Rxdy96cHlZWFBzYm83YjRncjVi?= =?utf-8?B?OW45OFFmcUx6N0tTMXJRajVGbFNEbzRsb2lkaUthcUpMckdudjByT2lGS3Zh?= =?utf-8?B?YVdudEpybGQ0MW9FRzRycFRrWFhhYVpOOTRGN0VKdUF6MEhhRm5JZUcveWVj?= =?utf-8?B?ZXdsVy9wOXdZS2c1d3NHUlN3TEtwWHZZTCtZcm1lTlo4TW1kYjdBSDlyeGM4?= =?utf-8?Q?LDlP9p4JurDsEcFQkp?= X-OriginatorOrg: atomlin.com X-MS-Exchange-CrossTenant-Network-Message-Id: c6042c35-8bb3-41e2-3ce8-08df00955cf9 X-MS-Exchange-CrossTenant-AuthSource: CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Aug 2026 21:36:02.1345 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e6a32402-7d7b-4830-9a2b-76945bbbcb57 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: gpPyblc/MyusMctchkqGYZXiDP0EW43qMnCdNKX7n0GP2YcZevYo5h8cVeqm/XHE//3Cc+vizfPvRcx29YRw+Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LO3P123MB3193 Tracepoint fields that convey kernel function pointers, callbacks, and call sites, such as "function", "func", "fn", "callback", "action", "handler", "caller", "caller_ip", "location", "callsite", and "call_site" are currently formatted as generic hexadecimal pointers by default. Enhance syscall_arg_fmt__init_array() to automatically detect non-array function pointer fields by type signature (e.g., typedefs ending with "_func_t" or "_fn", or C function pointer types containing "(*)") and assign SCA_KSYM as their default beautifier. Additionally, register common function pointer and callback field names within the sorted syscall_arg_fmts__by_name lookup table. To prevent misclassifying dynamic string arrays or non-pointer integers sharing generic names, guard SCA_KSYM assignment to pointer fields and pointer-sized non-array scalars. To support cross-architecture analysis (e.g., analyzing 32-bit trace data on a 64-bit host), determine the target pointer size via tep_get_long_size(). This ensures tracepoint arguments such as workqueue:workqueue_execute_start.function, csd:csd_function.func, and xfs:xfs_bunmapi.caller_ip are symbolised automatically without requiring explicit per-event configuration. For example: =E2=9D=AF sudo tools/perf/perf trace --event workqueue:workqueue_execut= e_end --max-events 2 --show-cpu 0.000 [000] kworker/u32:15/236682 workqueue:workqueue_execute_end(= work: 0xffffffffab2f1420, function: toggle_allocation_gate) 0.132 [000] kworker/u32:15/236682 workqueue:workqueue_execute_end(= work: 0xffff8ac2c1adc010, function: flush_to_ldisc) Signed-off-by: Aaron Tomlin --- tools/perf/builtin-trace.c | 93 ++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 38 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 003048946503..10fbea7ed4db 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -2096,6 +2096,18 @@ static int syscall__alloc_arg_fmts(struct syscall *s= c, int nr_args) } =20 static const struct syscall_arg_fmt syscall_arg_fmts__by_name[] =3D { + { .name =3D "action", .scnprintf =3D SCA_KSYM, }, + { .name =3D "call_site", .scnprintf =3D SCA_KSYM, }, + { .name =3D "callback", .scnprintf =3D SCA_KSYM, }, + { .name =3D "caller", .scnprintf =3D SCA_KSYM, }, + { .name =3D "caller_ip", .scnprintf =3D SCA_KSYM, }, + { .name =3D "callsite", .scnprintf =3D SCA_KSYM, }, + { .name =3D "cb", .scnprintf =3D SCA_KSYM, }, + { .name =3D "fn", .scnprintf =3D SCA_KSYM, }, + { .name =3D "func", .scnprintf =3D SCA_KSYM, }, + { .name =3D "function", .scnprintf =3D SCA_KSYM, }, + { .name =3D "handler", .scnprintf =3D SCA_KSYM, }, + { .name =3D "location", .scnprintf =3D SCA_KSYM, }, { .name =3D "msr", .scnprintf =3D SCA_X86_MSR, .strtoul =3D STUL_X86_MS= R, }, { .name =3D "vector", .scnprintf =3D SCA_X86_IRQ_VECTORS, .strtoul =3D ST= UL_X86_IRQ_VECTORS, }, }; @@ -2198,38 +2210,52 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt = *arg, struct tep_format_field ((len >=3D 4 && strcmp(field->name + len - 4, "name") =3D=3D 0) || strstr(field->name, "path") !=3D NULL)) { arg->scnprintf =3D SCA_FILENAME; - } else if ((field->flags & TEP_FIELD_IS_POINTER) || strstr(field->name, = "addr") || - field_has_hex_fmt(field, len)) - arg->scnprintf =3D SCA_PTR; - else if (strcmp(field->type, "pid_t") =3D=3D 0) - arg->scnprintf =3D SCA_PID; - else if (strcmp(field->type, "umode_t") =3D=3D 0) - arg->scnprintf =3D SCA_MODE_T; - else if ((field->flags & TEP_FIELD_IS_ARRAY) && strstr(field->type, "cha= r")) { - arg->scnprintf =3D SCA_CHAR_ARRAY; - arg->nr_entries =3D field->arraylen; - } else if ((strcmp(field->type, "int") =3D=3D 0 || - strcmp(field->type, "unsigned int") =3D=3D 0 || - strcmp(field->type, "long") =3D=3D 0) && - len >=3D 2 && strcmp(field->name + len - 2, "fd") =3D=3D 0) { - /* - * /sys/kernel/tracing/events/syscalls/sys_enter* - * grep -E 'field:.*fd;' .../format|sed -r 's/.*field:([a-z ]+) [a-z_]*= fd.+/\1/g'|sort|uniq -c - * 65 int - * 23 unsigned int - * 7 unsigned long - */ - arg->scnprintf =3D SCA_FD; - } else if (strstr(field->type, "enum") && use_btf !=3D NULL) { - *use_btf =3D true; - arg->strtoul =3D STUL_BTF_TYPE; + } else if (field->type && !(field->flags & TEP_FIELD_IS_ARRAY) && + (strstr(field->type, "(*)") !=3D NULL || + strstr(field->type, "_func_t") !=3D NULL || + strstr(field->type, "_fn") !=3D NULL)) { + arg->scnprintf =3D SCA_KSYM; } else { const struct syscall_arg_fmt *fmt =3D syscall_arg_fmt__find_by_name(field->name); =20 if (fmt) { - arg->scnprintf =3D fmt->scnprintf; - arg->strtoul =3D fmt->strtoul; + if (fmt->scnprintf =3D=3D SCA_KSYM) { + int ptr_size =3D (field->event && field->event->tep) ? + tep_get_long_size(field->event->tep) : + (int)sizeof(void *); + + if ((field->flags & TEP_FIELD_IS_POINTER) || + (field->size =3D=3D ptr_size && !(field->flags & TEP_FIELD_IS_ARR= AY))) { + arg->scnprintf =3D fmt->scnprintf; + arg->strtoul =3D fmt->strtoul; + } + } else { + arg->scnprintf =3D fmt->scnprintf; + arg->strtoul =3D fmt->strtoul; + } + } + + if (arg->scnprintf =3D=3D NULL) { + if ((field->flags & TEP_FIELD_IS_POINTER) || strstr(field->name, "addr= ") || + field_has_hex_fmt(field, len)) { + arg->scnprintf =3D SCA_PTR; + } else if (strcmp(field->type, "pid_t") =3D=3D 0) { + arg->scnprintf =3D SCA_PID; + } else if (strcmp(field->type, "umode_t") =3D=3D 0) { + arg->scnprintf =3D SCA_MODE_T; + } else if ((field->flags & TEP_FIELD_IS_ARRAY) && strstr(field->type, = "char")) { + arg->scnprintf =3D SCA_CHAR_ARRAY; + arg->nr_entries =3D field->arraylen; + } else if ((strcmp(field->type, "int") =3D=3D 0 || + strcmp(field->type, "unsigned int") =3D=3D 0 || + strcmp(field->type, "long") =3D=3D 0) && + len >=3D 2 && strcmp(field->name + len - 2, "fd") =3D=3D 0) { + arg->scnprintf =3D SCA_FD; + } else if (strstr(field->type, "enum") && use_btf !=3D NULL) { + *use_btf =3D true; + arg->strtoul =3D STUL_BTF_TYPE; + } } } } @@ -3297,12 +3323,6 @@ static unsigned char bitmap_byte(const unsigned long= *mask, int byte_idx) return b_val; } =20 -static bool trace__field_is_ip(const char *name) -{ - return !strcmp(name, "__probe_ip") || - !strcmp(name, "caller_ip") || - !strcmp(name, "call_site"); -} =20 static size_t trace__fprintf_tp_fields(struct trace *trace, struct perf_sa= mple *sample, struct thread *thread, void *augmented_args, int augmented_args= _size) @@ -3404,14 +3424,11 @@ static size_t trace__fprintf_tp_fields(struct trace= *trace, struct perf_sample * * Suppress it by default to avoid cluttering the output. * If verbose mode is enabled, ensure it is formatted as a * hexadecimal memory address rather than a signed integer. - * - * caller_ip and call_site are also expected to be instruction - * pointers and should always be represented in hexadecimal. */ is_probe_ip =3D evsel__is_probe(evsel) && !strcmp(field->name, "__probe_= ip"); =20 - if (is_probe_ip || trace__field_is_ip(field->name)) { - if (is_probe_ip && !verbose) + if (is_probe_ip) { + if (!verbose) continue; =20 printed +=3D scnprintf(bf + printed, size - printed, --=20 2.55.0 From nobody Mon Sep 28 10:43:09 2026 Received: from CWXP265CU008.outbound.protection.outlook.com (mail-ukwestazon11020087.outbound.protection.outlook.com [52.101.195.87]) (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 E412838C415; Sat, 22 Aug 2026 21:36:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.195.87 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787434600; cv=fail; b=bs3zKNcN09PLl3+nHnoznl29E8stzxjf+4ZdJXylV6FeCPXgjTT0SH4+/K10Tqu2MJh2UTs/DH4X6CSpNGuOe4QAzGkZr7eXmjPiZyMcD8L7bq6iUeMEuRDRE1RBGXTkffg9p4dwI5sD7pIMzqmMRykDS/wFwwdhRE+IzYZOY4U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787434600; c=relaxed/simple; bh=i3dUeFKUx27ZzHVZGCcXxUF22XdcC42+MULZmE7szj8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=pkcvpjhZJeeCABAEjZ/1y1qd/MFMQLJRj4RXcoFH726H1u4YRsEDFViXr/L3gtHGn1VVee83ZWTi6mAaWoVty/QU7uALZWA+CNsVNgGDnlE2p5lb8JKPBNqGuak8D7ZU2xPqrxJCUU+2gqccZjuntytYwK59F53Fps3E4yWvUBQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=atomlin.com; spf=pass smtp.mailfrom=atomlin.com; arc=fail smtp.client-ip=52.101.195.87 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=atomlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=atomlin.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IUOANEh37tkL/CdsARicq8Rox1evLQNDx9/zWZl0+sNImURDhyl/AXb+TD+94vAo11zYLjIp3pEQIXoIAMplXCe2iBrFgDkR+KoOoGXjP9RIbNJ67xUXqyEGQgO34AhFIUYZv13qPUGcqBrGrbIxVzxnnSY7LXFj0xWhkhOCqIh4xoo1M0ukWnhYcr7FWkWn6TbEju/tL5TIxm5OZI8gUxwq4q8jUvBPdHYkwQ9hnJXFywsbSFBwHawFbMM2dhLhVI4bPg7evw/NhLyPqP3W+xmITcbgbhpYsFDv/EIMTTVV6qKNr2T1sfFoJLTnO1YWzJBAWej/9HBSy9qC8GJl8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:MIME-Version; bh=rc68OcPxRhWbgsooDpavXl3EkIoH04Hgui9LN5IkiaA=; b=f51mNcko7n2HTsLci+mJEp6eL8noY3HXpGc+Yi/22oGBLLKNE3hVOKh58c0s/q/TmH8G3y8hEhEFWlj5SbyqGqSOKPUnXD/jdQbIj6ibtBIpvJcsYamZAbD7wc1EYkw+kBVmNdgwswjMy0ZVnPNxkucDE+4qLlqOTvmSiNKorl0eKPWntLBAM9DUBhXcWcnHbjgeDQqGiN/RCpsnujFnttgfrHf86OoT+it+UouVYTpH8b3DTSnTvWGihRgdMBKDk72jPj7OOOhk+baf8QdfnJigHkfVZYHwYN0dGusTs8vd4JlTQZRzENlab5X23GyxkH46Uz9OlEUSVfx4AOKwog== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=atomlin.com; dmarc=pass action=none header.from=atomlin.com; dkim=pass header.d=atomlin.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=atomlin.com; Received: from CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:183::5) by LO3P123MB3193.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:b5::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.11; Sat, 22 Aug 2026 21:36:20 +0000 Received: from CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM ([fe80::cec4:77ab:262e:d230]) by CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM ([fe80::cec4:77ab:262e:d230%4]) with mapi id 15.21.0339.010; Sat, 22 Aug 2026 21:36:20 +0000 From: Aaron Tomlin To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, namhyung@kernel.org Cc: mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com, james.clark@linaro.org, howardchu95@gmail.com, atomlin@atomlin.com, neelx@suse.com, chjohnst@mail.com, sean@ashe.io, steve@abita.co, rishil1999@outlook.com, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH perf-tools-next v5 3/4] perf trace: Enhance BTF type formatting to symbolise kernel function pointers Date: Sat, 22 Aug 2026 17:35:57 -0400 Message-ID: <20260822213558.704018-4-atomlin@atomlin.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260822213558.704018-1-atomlin@atomlin.com> References: <20260822213558.704018-1-atomlin@atomlin.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0432.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:18b::23) To CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:183::5) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CWLP123MB6607:EE_|LO3P123MB3193:EE_ X-MS-Office365-Filtering-Correlation-Id: 99015d41-38b3-4980-7f59-08df00955dcf X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|23010399003|366016|10067099003|56012099006|3023799007|6133799003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: iDkEMp7awh+pBcScT85UbiaPz39aewOR9iHOP3SHMc5I8sWXqtT/4WggrOkwbRA/1kM7qWaW4rV35bJFEczJOs4JSOeR8Fq9EcCRRWRH+2Fu8X2Opik2NLXIe4RxMg77WCtbvzgOKu5pDYRMU+jaL499DTtTJC5t56D5TxBEfWSU2q83r37UjahaLVDwBAR8u9OC/mpyaR388tYal7gUOYvAshAtqbKshOa4L+skvmkA/cxhIFFiddjnU4oFZZlVY0FLCiR8x7fuAE2TtzQBg5114U+KIZfMzB1AfVOoML2E7799XDA4FsIaARsHk9jDnDG4mpTs5wTAC5nqE4E2agldTLmbe6qvIaDNO2ep84m7hceTHafq41HvacNxdG+HZRRdlD6dWoe7CUL7ZPS+MLCybpE7ZaCRyPTXTrpi5dgLUtUgZR8GuJ4hFxFGBCpRPezGg+XlCStC5cuK2+mmLwxKtQFNanB9HNn+qmZRrYEi8TexlzXjC4jwgiyr3AAXo6Y45bpPgPpGHjOl+H52BvUv5QJdfE8brvQnJutKo6it2DONHPHLt4RY9+9uK6z9IlzHna5yHraZ4dvwv6/v2+lNi4hw6uZjgS4BYUuUTbAGVTgxRfedcO5GHDC8kUfIUG1Dd/qzeNWL9eAGSSl9PVvPlFuDGAlbNnj4l0SyneE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(23010399003)(366016)(10067099003)(56012099006)(3023799007)(6133799003)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ic7gjYw4Rt2gh/y73u7TvTLLCHbwbyNx7utF7XFpWNATWgaZImvjwBfdNNLD?= =?us-ascii?Q?RtA1HWcbMaedbZa9zPY8VJiYu5vWRxqm0O1oIlSQKhBjfSZbK2iZdUUeVZ9Z?= =?us-ascii?Q?au2SQx7KWtyAKnzHOFI+bdP+dtDuuV4z4hwkf4JLu2vtZqSwY3LKxxOXq4hk?= =?us-ascii?Q?J2zujJBuSZFci+x9EvyLzHkxFFHAMqQF2TEm+M/zI4oU2fZ9uRrdQDDao6GU?= =?us-ascii?Q?Oiw+lMixHa0efJ6K0ZE+61bueALagPO1WxnxiaT7/+lQHOYmKGvu43Kf47GF?= =?us-ascii?Q?pkB+fIaYmd61/rvtCW4YRT6IAFJpWYXviS3ac6bDAmE/jj01gF5+ntibZYub?= =?us-ascii?Q?s7OPhjnLWxtI7l0J1QLHCL33IpRPxxqXtg0uni6DtlLpM0MoDfi+Zo46rxNF?= =?us-ascii?Q?vdIpG5mhH+EGtE1g6URMjUXln/eCmMCJL+aQ3Fwbtfzo9kMBY1CkU1zVEqDc?= =?us-ascii?Q?GYOj6/wALyosFYV++Z2AsR7PuBI1PvwiQbM30DTk/tq2jwzK1BvqMlPaARnU?= =?us-ascii?Q?bXcfmuv3QDFA6tghpW12uO+obipMLfh7kg+pxFPoDXdif2O81oX3cVXh2/kP?= =?us-ascii?Q?pdKzY3W8mtN63t7dSTr4yI/uRrhXqHW7UNmN1a4IWYS1NRaUs/e+jecYo9HT?= =?us-ascii?Q?yanWMULn7cPgfaYMPrAoOsyIEae3dA5kvhIh+SkmaEXOeaRHrxyrP2svTk15?= =?us-ascii?Q?f32Vv3erfw74DlDXHqnEYYahxT1pVbj27hLH7ZYrij2tk9e+QgHaq4G9gjiP?= =?us-ascii?Q?gbRyNnIQs6UQGXA/t90CkAu10UsmnrC1HV4ENJX0b6BmCHhpzBy1FwMmAOiE?= =?us-ascii?Q?xVPO6RYUGOaMB8SQGtMY3KpmK1hOXjbNi7XBf7xPCgxjKVH75oqUnWrd5nVh?= =?us-ascii?Q?Nyi/tY0p+2wjzILkvS5W61BznDut4P3LQuK6MuyFyRdMt7eS+Ac7BSqGwnKk?= =?us-ascii?Q?Ot9M7cQNFMhCeCEf1X0woTNerPRPMUnCQES6zSBdJpUnAzMtNJMk9Xhzl181?= =?us-ascii?Q?oG6M0TUzzt5UKZ25uXCB32ZMfLAf0cYDVtWE2O6s/3gDuoNREd7w/iGwDOs2?= =?us-ascii?Q?e75/lbgOfuYo5BM6Qy5n5sEiIOoQhxQNCGIpoWtcVy2HVhfnQlOc/L71erW8?= =?us-ascii?Q?R4SFslx3zqDrGlOHpnCTZ/phMKFsS0d03L+FKDc2K/6rTblaAIYErpljy8FC?= =?us-ascii?Q?g8yoTJNRJtZhQiY544juxHpO5aW7MicV+XK+V03IyoQhaaGuPGHrislFOXwH?= =?us-ascii?Q?p86g3TI0zLGsNYvIPoSXVb55inhgZ9OiBgyk/lFyfQ7clOSWKeAv2G5Nc/Qw?= =?us-ascii?Q?TooNtbnE9FrZdflIYhqExnyiqQePUwYWmix96bvIgK142OOpkfUhz9LR5g+V?= =?us-ascii?Q?X1ZhHZybgZm+z4O3OGfrvIyMV8Q8vMJwhf+5u1YaYc/2eWR9+W8Zopi+LkCD?= =?us-ascii?Q?/0F9Y8ka/ZavGIp5aUMhIk92Kq0QGgKsNRJKuG3zeUQx5QXn+PiJGnanrq+r?= =?us-ascii?Q?EW3xnViSKOsnayv6wjFG3tFRTpXVyyLLwh3Ap0AhCApUENEAMVQdydEuHiHq?= =?us-ascii?Q?jlnsfY5FjsQ1ZrAKWkiODh50U2PnXqDAWLKhFjRn/wUlGlLRoHRCRNyJcFvs?= =?us-ascii?Q?E75nJIkSVBHAEA6WcAWqcUhcH81Y2XmNj8MPPe+j2G1FMLzHFyuN+68gYUrz?= =?us-ascii?Q?e3zACwoKcOcubEdfa6Zp7GPK0727q1k+tmMp8FElDShuabcq?= X-OriginatorOrg: atomlin.com X-MS-Exchange-CrossTenant-Network-Message-Id: 99015d41-38b3-4980-7f59-08df00955dcf X-MS-Exchange-CrossTenant-AuthSource: CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Aug 2026 21:36:03.4970 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e6a32402-7d7b-4830-9a2b-76945bbbcb57 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: HASDI+IVNOzzf/8xJcwRWoC5LItNeFhEg3abYpdXqOjCigkwx4s0DWQYERILEE6oybruq6l1fYUsxWFA8+yWgQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LO3P123MB3193 Content-Type: text/plain; charset="utf-8" When BTF (BPF Type Format) metadata is loaded from vmlinux, 'perf trace' can inspect the precise C types of tracepoint and system call parameters. However, function pointer arguments are currently not recognised during BTF pretty-printing and default to hexadecimal output. Introduce btf_is_func_ptr() to inspect BTF type hierarchies (i.e., traversing pointers, typedefs, and type modifiers) to determine whether a parameter resolves to a function prototype (BTF_KIND_FUNC_PROTO). Generalise BTF type caching via syscall_arg_fmt__cache_btf_type() to handle structs, unions, enums, and function pointers alike. When a field is identified as a kernel function pointer, trace__btf_scnprintf() routes its value to syscall_arg__scnprintf_ksym(), enabling automatic zero-config symbolisation of kernel function pointers whenever BTF is available. Signed-off-by: Aaron Tomlin --- tools/perf/builtin-trace.c | 100 ++++++++++++++++++++++++++++--------- 1 file changed, 77 insertions(+), 23 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 10fbea7ed4db..4f8b4f2cf677 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -122,6 +122,7 @@ struct syscall_arg_fmt { #ifdef HAVE_LIBBPF_SUPPORT const struct btf_type *type; int type_id; /* used in btf_dump */ + bool btf_type_cached; #endif }; =20 @@ -979,21 +980,61 @@ 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 void syscall_arg_fmt__cache_btf_enum(struct syscall_arg_fmt *arg_fm= t, struct btf *btf, char *type) +static bool btf_is_func_ptr(const struct btf *btf, const struct btf_type *= type) { + while (type) { + if (btf_is_ptr(type) || btf_is_typedef(type) || btf_is_mod(type)) + type =3D btf__type_by_id(btf, type->type); + else + break; + } + return type && btf_is_func_proto(type); +} + +static void syscall_arg_fmt__cache_btf_type(struct syscall_arg_fmt *arg_fm= t, + struct btf *btf, const char *type) +{ + char name[128]; + const char *pos; + size_t len =3D 0; int id; =20 - type =3D strstr(type, "enum "); + arg_fmt->btf_type_cached =3D true; + if (type =3D=3D NULL) return; =20 - type +=3D 5; // skip "enum " to get the enumeration name + /* Pointers to enums are memory addresses, not scalar enums */ + if (strstr(type, "enum ") && strchr(type, '*')) + return; + + if ((pos =3D strstr(type, "enum ")) !=3D NULL) + pos +=3D 5; + else if ((pos =3D strstr(type, "struct ")) !=3D NULL) + pos +=3D 7; + else if ((pos =3D strstr(type, "union ")) !=3D NULL) + pos +=3D 6; + else + pos =3D type; + + while (isspace(*pos)) + pos++; + + while ((isalnum(pos[len]) || pos[len] =3D=3D '_') && len < sizeof(name) -= 1) { + name[len] =3D pos[len]; + len++; + } + name[len] =3D '\0'; =20 - id =3D btf__find_by_name(btf, type); + if (len =3D=3D 0) + return; + + id =3D btf__find_by_name(btf, name); if (id < 0) return; =20 arg_fmt->type =3D btf__type_by_id(btf, id); + arg_fmt->type_id =3D id; } =20 static bool syscall_arg__strtoul_btf_enum(char *bf, size_t size, struct sy= scall_arg *arg, u64 *val) @@ -1027,10 +1068,8 @@ static bool syscall_arg__strtoul_btf_type(char *bf, = size_t size, struct syscall_ if (btf =3D=3D NULL) return false; =20 - if (arg->fmt->type =3D=3D NULL) { - // See if this is an enum - syscall_arg_fmt__cache_btf_enum(arg->fmt, btf, type); - } + if (!arg->fmt->btf_type_cached) + syscall_arg_fmt__cache_btf_type(arg->fmt, btf, type); =20 // Now let's see if we have a BTF type resolved bt =3D arg->fmt->type; @@ -1038,19 +1077,22 @@ static bool syscall_arg__strtoul_btf_type(char *bf,= size_t size, struct syscall_ return false; =20 // If it is an enum: - if (btf_is_enum(arg->fmt->type)) + if (btf_is_enum(arg->fmt->type)) { + if (type && strchr(type, '*')) + return false; return syscall_arg__strtoul_btf_enum(bf, size, arg, val); + } =20 return false; } =20 -static size_t btf_enum_scnprintf(const struct btf_type *type, struct btf *= btf, char *bf, size_t size, int val) +static size_t btf_enum_scnprintf(const struct btf_type *type, struct btf *= btf, char *bf, size_t size, unsigned long val) { struct btf_enum *be =3D btf_enum(type); const unsigned int nr_entries =3D btf_vlen(type); =20 for (unsigned int i =3D 0; i < nr_entries; ++i, ++be) { - if (be->val =3D=3D val) { + if ((unsigned long)(__u32)be->val =3D=3D val || (unsigned long)be->val = =3D=3D val) { return scnprintf(bf, size, "%s", btf__name_by_offset(btf, be->name_off)); } @@ -1077,14 +1119,19 @@ static size_t btf_struct_scnprintf(const struct btf= _type *type, struct btf *btf, .bf =3D bf, .size =3D size, }; - struct augmented_arg *augmented_arg =3D arg->augmented.args; + struct augmented_arg *augmented_arg; int type_id =3D arg->fmt->type_id, consumed; struct btf_dump *btf_dump; =20 LIBBPF_OPTS(btf_dump_opts, dump_opts); LIBBPF_OPTS(btf_dump_type_data_opts, dump_data_opts); =20 - if (arg =3D=3D NULL || arg->augmented.args =3D=3D NULL) + if (arg =3D=3D NULL || arg->augmented.args =3D=3D NULL || arg->augmented.= size <=3D 0 || + arg->fmt =3D=3D NULL || !arg->fmt->from_user) + return 0; + + augmented_arg =3D arg->augmented.args; + if (augmented_arg->size <=3D 0) return 0; =20 dump_data_opts.compact =3D true; @@ -1095,8 +1142,10 @@ static size_t btf_struct_scnprintf(const struct btf_= type *type, struct btf *btf, return 0; =20 /* pretty print the struct data here */ - if (btf_dump__dump_type_data(btf_dump, type_id, arg->augmented.args->valu= e, type->size, &dump_data_opts) =3D=3D 0) + if (btf_dump__dump_type_data(btf_dump, type_id, augmented_arg->value, typ= e->size, &dump_data_opts) =3D=3D 0) { + btf_dump__free(btf_dump); return 0; + } =20 consumed =3D sizeof(*augmented_arg) + augmented_arg->size; arg->augmented.args =3D ((void *)arg->augmented.args) + consumed; @@ -1108,33 +1157,37 @@ static size_t btf_struct_scnprintf(const struct btf= _type *type, struct btf *btf, } =20 static size_t trace__btf_scnprintf(struct trace *trace, struct syscall_arg= *arg, char *bf, - size_t size, int val, char *type) + size_t size, unsigned long val, char *type) { struct syscall_arg_fmt *arg_fmt =3D arg->fmt; =20 if (trace->btf =3D=3D NULL) return 0; =20 - 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); - } + if (!arg_fmt->btf_type_cached) + syscall_arg_fmt__cache_btf_type(arg_fmt, trace->btf, type); =20 // Did we manage to find a BTF type for the syscall/tracepoint argument? if (arg_fmt->type =3D=3D NULL) return 0; =20 - if (btf_is_enum(arg_fmt->type)) + if (btf_is_enum(arg_fmt->type)) { + if (type && strchr(type, '*')) + return 0; return btf_enum_scnprintf(arg_fmt->type, trace->btf, bf, size, val); - else if (btf_is_struct(arg_fmt->type) || btf_is_union(arg_fmt->type)) + } else if (btf_is_struct(arg_fmt->type) || btf_is_union(arg_fmt->type)) return btf_struct_scnprintf(arg_fmt->type, trace->btf, bf, size, arg); + else if (btf_is_func_ptr(trace->btf, arg_fmt->type)) { + arg->val =3D val; + return syscall_arg__scnprintf_ksym(bf, size, arg); + } =20 return 0; } =20 #else // HAVE_LIBBPF_SUPPORT static size_t trace__btf_scnprintf(struct trace *trace __maybe_unused, str= uct syscall_arg *arg __maybe_unused, - char *bf __maybe_unused, size_t size __maybe_unused, int val __mayb= e_unused, + char *bf __maybe_unused, size_t size __maybe_unused, unsigned long = val __maybe_unused, char *type __maybe_unused) { return 0; @@ -2584,7 +2637,8 @@ static size_t syscall__scnprintf_args(struct syscall = *sc, char *bf, size_t size, =20 default_scnprintf =3D sc->arg_fmt[arg.idx].scnprintf; =20 - if (trace->force_btf || default_scnprintf =3D=3D NULL || default_scnpri= ntf =3D=3D SCA_PTR) { + if (trace->force_btf || default_scnprintf =3D=3D NULL || + default_scnprintf =3D=3D SCA_PTR || default_scnprintf =3D=3D SCA_KS= YM) { btf_printed =3D trace__btf_scnprintf(trace, &arg, bf + printed, size - printed, val, field->type); if (btf_printed) { --=20 2.55.0 From nobody Mon Sep 28 10:43:09 2026 Received: from CWXP265CU008.outbound.protection.outlook.com (mail-ukwestazon11020087.outbound.protection.outlook.com [52.101.195.87]) (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 10AFD38736C; Sat, 22 Aug 2026 21:36:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.195.87 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787434603; cv=fail; b=L8hWn8Fj4h/uV+nTaWvM26UuM1x/m7j+1El1edGPaJlax8ChzcoV7th1zVIWx9Qk4R11i/0SduC6eK31k+w9CtPDtBotz733ZBUPfPO7TwXtG8kHE29V3tivhRLnhnOGOyiUT2c++UcVt/TPR+lhWNKSEnf3KfaGbr9oftPFxAI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787434603; c=relaxed/simple; bh=gtYRGN5e2EKc9gzhHbXazBVRphqvfnrvB59rNUuCJwU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=klsunbtbT8aMdCqP4AM0KyLoHc+Y89yuLWwdzS/1cCEPfB3gx63NIRg6PMvu04X01STT6KW9/BM1RqWJ9yomg01wilP6O5MiPwN5k+rd0DCj4S+HPy6ZrM8qeej23RFfbo9aYh00/BT1bvjsgi+NR5qGyzaS1i4Z5QT6oTPCJNs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=atomlin.com; spf=pass smtp.mailfrom=atomlin.com; arc=fail smtp.client-ip=52.101.195.87 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=atomlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=atomlin.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MmmMJKIotd81fkYYy0shDlZ6E9U5SeBPNi3IiX2UcRN2QWwDWs5V7lRRSuRN4oK2QgB8TivgkbnUB9j7kiCMn3vkI+XlEGKGsthf7pRKzN90ZfEBto8wu/JpIsynFmHI4ohvlZO/O3WIZRRD8v7KpM4TROmUbwkWQnwiW76t3p8w0kKUjMHz8cvmsVqzuOCyKUG2o5a56gkTck5Zt2naxdANhrJMYNJbMI6Xi63OfYOOrYTjkl5m2NMUDqpr+91bN38FuBc9BycW1TaKxDqXctg6GcQ6ZAmleVPgUZlfCuK+5AZKQq3WubZVlSIUPgzjh8mEwyEv2XsZgIq6kSlLUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:MIME-Version; bh=9eeckgsIEyQVF0ihDry9Mxy4+gt+zzKwg5V/WyoGhX4=; b=lB9gYXF4/E/aRQEBpOWiQDEymo8RHdjDawPHbMykrHT9G0Zyx6ksa7NsZNyzAOVWkMk4ZeDA7fZSZVSIg2OAZCr7qxRi00W7xANolIdtzM/7fZsG7fw8MXNMf9NCetLytj2jXW0wv+nKCPgInq0vy/NReK63JRwpbNJkJni3J26+Y6QRBZJc6Nvjtxc9VGtcmyaxVXtx44M9D62AQZh65dlssaC1K+M67ksrmSvcuTDKShcyOap0/K239hxfsVUm3hKCY8pJLoj4Wvk/S4SYewA1Q0gBQYDCkhNwkTnFvvu4Ec5xRV6gc/I5eifTFx3DYrHBYw55Q5i18wJwwzHspA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=atomlin.com; dmarc=pass action=none header.from=atomlin.com; dkim=pass header.d=atomlin.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=atomlin.com; Received: from CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:183::5) by LO3P123MB3193.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:b5::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.11; Sat, 22 Aug 2026 21:36:20 +0000 Received: from CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM ([fe80::cec4:77ab:262e:d230]) by CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM ([fe80::cec4:77ab:262e:d230%4]) with mapi id 15.21.0339.010; Sat, 22 Aug 2026 21:36:20 +0000 From: Aaron Tomlin To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, namhyung@kernel.org Cc: mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com, james.clark@linaro.org, howardchu95@gmail.com, atomlin@atomlin.com, neelx@suse.com, chjohnst@mail.com, sean@ashe.io, steve@abita.co, rishil1999@outlook.com, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH perf-tools-next v5 4/4] perf tests: Add shell test for kernel symbol beautifier Date: Sat, 22 Aug 2026 17:35:58 -0400 Message-ID: <20260822213558.704018-5-atomlin@atomlin.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260822213558.704018-1-atomlin@atomlin.com> References: <20260822213558.704018-1-atomlin@atomlin.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0430.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:18b::21) To CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:183::5) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CWLP123MB6607:EE_|LO3P123MB3193:EE_ X-MS-Office365-Filtering-Correlation-Id: 06b25798-4e26-4779-6865-08df00955ea3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|23010399003|366016|10067099003|56012099006|3023799007|6133799003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: RIeOhQxLy8JPFevMJ23b48S2r/ij88yaMfIypX86VzSPcobTIXZ06sWDgaJp66KdlB+WmELwRwxbfIPjN8hGBPvrwi3uCWyQbZpTVqhH4FfbHc4E/lSOZVqlBeF9KucegPHkDqjyF0PjdNxk8CsXi8IjRhZf6EK0gdv46tilMxqz5iTgJ1KgupzwwZtQKi6D4ACJISrv+AsBlgTRgAeEkCWbg5GXZnFx9CKJzkmt8+NGuLvWfkgJAvZzknGD8eTDE0oDvydy9HuiRRoSPwR8/NBTE9Ef7bkBC+HEz4IiJB+iIc4fMlX7mIme9btEV36/CDBNroyHoZb0+2O0mOckBSaoB96geO9mfzeNkbnaGozgAqEn5u8NLdkXVVd6RgvAdlJKD+Twp4K/mr6kGvtmGt9lsYZ5Ly0DZMc0P6EGXo0oR1XtpuRYWTCxSryuvHiIra8l2i/xMPsPV0ZXrF3wiSH4zCyQa6H5e7Pua1POh1VTMRoGujLVwVfctevATq972UuqaRa1JXK4pOyC2QDoM7qebP3xFoJYROcaTmJI1ZjInEEVGG5f2pwZ5dm3PTuvA46dv/k7K9HuZAsx1T1FbpBzJrvXas5uKnM+PpRkaLlAmmU9DNk5gnxdqmh8CjzND0XgKKKOrhhOj0CtGNX100b8ynWd25v1fX0Nqw4ZOTA= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(23010399003)(366016)(10067099003)(56012099006)(3023799007)(6133799003)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?8lu/U8vV5nUf2Qjf2r4qAl8J8InTX3sEjGylmh1ioGquGY1mVzwdJuMlbJ21?= =?us-ascii?Q?R50Zr4y9POKwBQPkYa3LrUm/w+93YACqlKpiMntlf6T3Oz3VjP/C40qbjMxp?= =?us-ascii?Q?upd/k4FbfC91OucNeIBqqINUDDBneLitvH1oG/4wQeMA7DrbGkVaocDC7Drs?= =?us-ascii?Q?XayrJLFNrNP8Etmr62jI669fxJpeg3/4/WjufkHHm90JLRLQGhDCWb+OudzZ?= =?us-ascii?Q?86F+AgkdkXR6v/N128j3v9HIfWzIKIgkmqM1KjrQh5NTOSKW/XrOiE2Yxxcu?= =?us-ascii?Q?ZAH435zv5XUmTDAjV6J7gIrrKT0IB+BHiaErwLDTUhZ05LE91b4pJ4+wUvan?= =?us-ascii?Q?LabgRnhRvkBQ4MSkBJa/OIB0E9dvy+JzSa9fXQjQib4yT+vWgwEekZuBP2W5?= =?us-ascii?Q?ivBIAvFPxDQu5E8YaTfGFx8c0klUrkKGZX9TKHbO4yud+i/WdW2caaRPEgwE?= =?us-ascii?Q?LXlpVHPBpOscc5tGVIW9oa7Nx0TvBc9U73Ya3h4w4axXgrmRPFl0PyLpi87f?= =?us-ascii?Q?htb6jQ5+NP+oA8Pn9uR+NasYWldvdjGTjUeD402raR3d7az5oapIYToU8arz?= =?us-ascii?Q?hYJer4p8tWOnezg3FmHAlOS4Ykax7YL2Q2HLqpyDuqcMAVMdnVocGU/regqo?= =?us-ascii?Q?eEhM1iZDK5wKG/Fw0nzGXjz3r/KuxMOpCkh9ic4WK8FvWU1qd7rMV2T3nNp9?= =?us-ascii?Q?hUcWsAHOLEpjEkAtKN04GzEx4ZLPx/WN/QQQCQGXLMukMesx8UBXjw028Kx3?= =?us-ascii?Q?sRLkQPbUtMPvnrRhqQpVXlXRrOzxNE0Zz+UjxaIL1veC1gmLrMRBc7XEvCPw?= =?us-ascii?Q?9RThNWr16IHbXL5LhW5CCyF96DO4U8LpGHcZpJsU1pcSK7pvOAsZP3oCg2tD?= =?us-ascii?Q?hnjL3A4UCDRtkxfd7VqvLjY+xg0UbeP6FzoWfw1DphJrVnKusgD9gXKvvRtQ?= =?us-ascii?Q?aTUZKcVvOCSGZiv0m/e3mXlq3e/vnlt93N8zlYDijnRgoa4b+uAS4zMgJKtH?= =?us-ascii?Q?ioO2zENXNDyxC12bG8I5k37Sw1WwnBcVm961QZmlZ/vyoZliAN0vxZONksUB?= =?us-ascii?Q?twrpajNRMFbJXDD9g3cdtWiL96doUPkEnwISxqHvXTqv5ppstXharYbjmZMA?= =?us-ascii?Q?k0Yj9eoZJi+VLXJtHq2MXIBTmJd8yem72VHEebvksBi3GKlce3ZbBNXVP00q?= =?us-ascii?Q?kcNheMHuXAVjnZn6tmCBLXbBTNG0ypGastG02sKdXbJWC75pYT8S1itXoukR?= =?us-ascii?Q?f3lAyseyuNbnxQ82krCit+pCXBv1dN0lJotT7pdO2USygXVyoj863tSxbfox?= =?us-ascii?Q?AxWici7b9MbDm9usDz163AbXjnWG3z6YtXHLv94tLZtUqgnUDVygxn7n4Gh0?= =?us-ascii?Q?BaWwoBhZiddm6d0BQXfDHR5brPn81cUooWh4vVI/xQrdMrdmOdNOyJmfj/hP?= =?us-ascii?Q?tYPZqUosGbZI40kYTEEwkQzz6peJFXmlb8JBgnSzhYtgYGAiG/TeR98NN75U?= =?us-ascii?Q?9JT8hg9IZEqe6BJkvnvXWSNcHNmDQd+RdcSvw0b9eNz8rj9rfRzPRtvEIU9C?= =?us-ascii?Q?SmnLJgFu9/YXUut4naIXy9x2eoyiglt7HuxIv5QWogt5HEUPeG98bBX98ff4?= =?us-ascii?Q?3MyRznioZjyvLgQOkVsXRTR6ofXkCzkCRY4hT1/7YRwzjX1lGcNTlxOeGH7R?= =?us-ascii?Q?+cPxnl4xsSY1s5dtmnR1ih+NEZaMVoCVbYbMvbhDFoFX8hF8?= X-OriginatorOrg: atomlin.com X-MS-Exchange-CrossTenant-Network-Message-Id: 06b25798-4e26-4779-6865-08df00955ea3 X-MS-Exchange-CrossTenant-AuthSource: CWLP123MB6607.GBRP123.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Aug 2026 21:36:04.9020 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e6a32402-7d7b-4830-9a2b-76945bbbcb57 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: wwxrtW+4glHXGQYOEUXpWM2/D2jg+s/02Zc/Jn7Buh1VP7B7PZuqgbk1vlLuvpOW03GUnaLaCL+y4mOFji/FYQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LO3P123MB3193 Content-Type: text/plain; charset="utf-8" Add a dedicated shell test script, trace_ksym_beautifier.sh, to verify that 'perf trace' properly symbolises kernel virtual addresses and function pointers using both the default kallsyms beautifier (SCA_KSYM) and BTF type routing i.e., --force-btf. Signed-off-by: Aaron Tomlin --- .../perf/tests/shell/trace_ksym_beautifier.sh | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100755 tools/perf/tests/shell/trace_ksym_beautifier.sh diff --git a/tools/perf/tests/shell/trace_ksym_beautifier.sh b/tools/perf/t= ests/shell/trace_ksym_beautifier.sh new file mode 100755 index 000000000000..45c803338d4c --- /dev/null +++ b/tools/perf/tests/shell/trace_ksym_beautifier.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# perf trace kernel symbol beautifier tests +# SPDX-License-Identifier: GPL-2.0 + +err=3D0 + +# shellcheck source=3Dlib/probe.sh +. "$(dirname "$0")"/lib/probe.sh +skip_if_no_perf_trace || exit 2 +[ "$(id -u)" =3D 0 ] || exit 2 + +test_ksym_kallsyms() { + echo "Testing perf trace kernel symbol beautifier (default kallsyms)" + output=3D"$(perf trace -e kmem:kmalloc --max-events=3D1 -- true 2>&1)" + if ! echo "$output" | grep -q -E "call_site: [a-zA-Z_][a-zA-Z0-9_]*" || = echo "$output" | grep -q -E "call_site: 0x[0-9a-fA-F]+" + then + printf "Default kallsyms function symbolization failed, output:\n%s\n"= "$output" + err=3D1 + fi +} + +test_ksym_btf() { + echo "Testing perf trace kernel symbol beautifier (BTF)" + if [ ! -f /sys/kernel/btf/vmlinux ]; then + echo "Skipping BTF test due to missing vmlinux BTF" + return + fi + + output=3D"$(perf trace -e timer:hrtimer_start --force-btf --max-events= =3D1 -- sleep 0.01 2>&1)" + if ! echo "$output" | grep -q -E "function: [a-zA-Z_][a-zA-Z0-9_]*" || e= cho "$output" | grep -q -E "function: 0x[0-9a-fA-F]+" + then + printf "BTF function symbolization failed, output:\n%s\n" "$output" + err=3D1 + fi +} + +test_ksym_kallsyms + +if [ $err =3D 0 ]; then + test_ksym_btf +fi + +exit $err --=20 2.55.0