* [PATCH bpf-next] tracing: Make per-template BTF id lists file-local
@ 2026-07-30 12:51 Mykyta Yatsenko
2026-07-30 13:03 ` sashiko-bot
0 siblings, 1 reply; 3+ messages in thread
From: Mykyta Yatsenko @ 2026-07-30 12:51 UTC (permalink / raw)
To: bpf, ast, andrii, daniel, kafai, kernel-team, eddyz87, memxor,
rostedt, linux-trace-kernel
Cc: linux-next, broonie, Mykyta Yatsenko
From: Mykyta Yatsenko <yatsenko@meta.com>
DECLARE_EVENT_CLASS emitted __bpf_trace_btf_ids_<call> through
BTF_ID_LIST_GLOBAL, i.e. a global symbol named after the event class.
The class name is not unique across the kernel, so the symbol
multiply-defines whenever two translation units instantiate the same
class.
Switch to the file-local BTF_ID_LIST: the list is reached
only through the event_class_<call>.btf_ids pointer, initialised in the
same unit, so tracefs readers never reference the symbol by name and
resolve_btfids still fills the now-local .BTF_ids entries.
The handcrafted syscall classes are the one cross-unit consumer: give
them their own local BTF_ID_LIST rather than importing the generated
sys_{enter,exit} lists, which are now file-local.
Fixes: eadc0725ab8d3 ("tracing: Expose tracepoint BTF ids via tracefs")
Reported-by: Mark Brown <broonie@kernel.org>
Closes: https://lore.kernel.org/all/ff58b01c-3f5e-4d55-be82-609d2faaf12e@sirena.org.uk/
Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
---
include/trace/trace_events.h | 6 ++++--
kernel/trace/trace_syscalls.c | 22 ++++++++++++++--------
2 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h
index 09ad57ac4b73..45ffbe04b580 100644
--- a/include/trace/trace_events.h
+++ b/include/trace/trace_events.h
@@ -404,10 +404,12 @@ static inline notrace int trace_event_get_offsets_##call( \
* [0] FUNC __bpf_trace_<call> (the BPF dispatcher)
* [1] STRUCT trace_event_raw_<call> (the ring-buffer record)
* Exposed via the events/<sys>/<name>/btf_ids tracefs file.
+ *
+ * File-local: the class name is not unique, so a global symbol would
+ * clash across translation units.
*/
#define _TRACE_BTF_IDS_DECLARE(call) \
- extern u32 __bpf_trace_btf_ids_##call[]; \
- BTF_ID_LIST_GLOBAL(__bpf_trace_btf_ids_##call, 2) \
+ BTF_ID_LIST(__bpf_trace_btf_ids_##call) \
BTF_ID(func, __bpf_trace_##call) \
BTF_ID(struct, trace_event_raw_##call)
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
index 48ef1a93e576..9b5931f2f280 100644
--- a/kernel/trace/trace_syscalls.c
+++ b/kernel/trace/trace_syscalls.c
@@ -9,6 +9,7 @@
#include <linux/ftrace.h>
#include <linux/perf_event.h>
#include <linux/xarray.h>
+#include <linux/btf_ids.h>
#include <asm/syscall.h>
#include "trace_output.h"
@@ -1305,13 +1306,18 @@ struct trace_event_functions exit_syscall_print_funcs = {
#ifdef CONFIG_BPF_EVENTS
/*
- * BTF id lists generated by DECLARE_EVENT_CLASS for the sys_enter and
- * sys_exit tracepoints. The auto-generated event_class_sys_{enter,exit}
- * is unused (per-syscall events share the handcrafted classes below),
- * but the id lists themselves are global and reusable.
+ * BTF id lists for the shared sys_enter/sys_exit dispatcher tracepoints,
+ * resolved by resolve_btfids. Defined locally rather than importing the
+ * DECLARE_EVENT_CLASS-generated lists, which are now file-local to the
+ * translation unit that instantiates the tracepoint.
*/
-extern u32 __bpf_trace_btf_ids_sys_enter[];
-extern u32 __bpf_trace_btf_ids_sys_exit[];
+BTF_ID_LIST(syscall_enter_btf_ids)
+BTF_ID(func, __bpf_trace_sys_enter)
+BTF_ID(struct, trace_event_raw_sys_enter)
+
+BTF_ID_LIST(syscall_exit_btf_ids)
+BTF_ID(func, __bpf_trace_sys_exit)
+BTF_ID(struct, trace_event_raw_sys_exit)
#endif
struct trace_event_class __refdata event_class_syscall_enter = {
@@ -1321,7 +1327,7 @@ struct trace_event_class __refdata event_class_syscall_enter = {
.get_fields = syscall_get_enter_fields,
.raw_init = init_syscall_trace,
#ifdef CONFIG_BPF_EVENTS
- .btf_ids = __bpf_trace_btf_ids_sys_enter,
+ .btf_ids = syscall_enter_btf_ids,
#endif
};
@@ -1336,7 +1342,7 @@ struct trace_event_class __refdata event_class_syscall_exit = {
.fields = LIST_HEAD_INIT(event_class_syscall_exit.fields),
.raw_init = init_syscall_trace,
#ifdef CONFIG_BPF_EVENTS
- .btf_ids = __bpf_trace_btf_ids_sys_exit,
+ .btf_ids = syscall_exit_btf_ids,
#endif
};
---
base-commit: eadc0725ab8d38c05148fce49f8d5c6a0e01f062
change-id: 20260730-b4-fix_btf_tracefs-fdafda5fdb5b
Best regards,
--
Mykyta Yatsenko <yatsenko@meta.com>
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH bpf-next] tracing: Make per-template BTF id lists file-local
2026-07-30 12:51 [PATCH bpf-next] tracing: Make per-template BTF id lists file-local Mykyta Yatsenko
@ 2026-07-30 13:03 ` sashiko-bot
2026-07-30 13:48 ` Mykyta Yatsenko
0 siblings, 1 reply; 3+ messages in thread
From: sashiko-bot @ 2026-07-30 13:03 UTC (permalink / raw)
To: Mykyta Yatsenko; +Cc: bpf
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Using `BTF_ID_LIST()` instead of `BTF_ID_LIST_GLOBAL()` for tracepoint classes introduces significant BSS memory bloat when `CONFIG_DEBUG_INFO_BTF` is disabled.
--
--- Patch [1]: [PATCH bpf-next] tracing: Make per-template BTF id lists file-local ---
commit 49d7faf72ef8695ae45768a193f5a09e2cfe872d
Author: Mykyta Yatsenko <yatsenko@meta.com>
tracing: Make per-template BTF id lists file-local
This commit converts trace event BTF id lists from global to file-local to
avoid symbol clashes when multiple translation units instantiate the same
class. It also explicitly provides local BTF id lists for handcrafted syscall
events.
Link: https://lore.kernel.org/all/ff58b01c-3f5e-4d55-be82-609d2faaf12e@sirena.org.uk/
> diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h
> index 09ad57ac4b73e..45ffbe04b5805 100644
> --- a/include/trace/trace_events.h
> +++ b/include/trace/trace_events.h
> @@ -404,10 +404,12 @@ static inline notrace int trace_event_get_offsets_##call( \
> * [0] FUNC __bpf_trace_<call> (the BPF dispatcher)
> * [1] STRUCT trace_event_raw_<call> (the ring-buffer record)
> * Exposed via the events/<sys>/<name>/btf_ids tracefs file.
> + *
> + * File-local: the class name is not unique, so a global symbol would
> + * clash across translation units.
> */
> #define _TRACE_BTF_IDS_DECLARE(call) \
> - extern u32 __bpf_trace_btf_ids_##call[]; \
> - BTF_ID_LIST_GLOBAL(__bpf_trace_btf_ids_##call, 2) \
> + BTF_ID_LIST(__bpf_trace_btf_ids_##call) \
> BTF_ID(func, __bpf_trace_##call) \
> BTF_ID(struct, trace_event_raw_##call)
[Severity: Medium]
Does changing this to BTF_ID_LIST() introduce significant BSS memory bloat
when CONFIG_DEBUG_INFO_BTF is disabled?
When CONFIG_DEBUG_INFO_BTF is disabled, the fallback for BTF_ID_LIST is
defined as:
include/linux/btf_ids.h:
#define BTF_ID_LIST(name) static u32 __maybe_unused name[128];
BTF_ID_LIST_GLOBAL(..., 2) only allocated 2 elements (8 bytes), but this
fallback statically allocates a 128-element u32 array (512 bytes) per
instance.
Because _TRACE_BTF_IDS_DECLARE is instantiated via DECLARE_EVENT_CLASS for
over a thousand trace event classes across the kernel, this seems to silently
add roughly 750 KB of wasted BSS memory.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260730-b4-fix_btf_tracefs-v1-1-5f10b728f51e@meta.com?part=1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH bpf-next] tracing: Make per-template BTF id lists file-local
2026-07-30 13:03 ` sashiko-bot
@ 2026-07-30 13:48 ` Mykyta Yatsenko
0 siblings, 0 replies; 3+ messages in thread
From: Mykyta Yatsenko @ 2026-07-30 13:48 UTC (permalink / raw)
To: sashiko-reviews; +Cc: bpf
On 7/30/26 2:03 PM, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] Using `BTF_ID_LIST()` instead of `BTF_ID_LIST_GLOBAL()` for tracepoint classes introduces significant BSS memory bloat when `CONFIG_DEBUG_INFO_BTF` is disabled.
> --
>
> --- Patch [1]: [PATCH bpf-next] tracing: Make per-template BTF id lists file-local ---
> commit 49d7faf72ef8695ae45768a193f5a09e2cfe872d
> Author: Mykyta Yatsenko <yatsenko@meta.com>
>
> tracing: Make per-template BTF id lists file-local
>
> This commit converts trace event BTF id lists from global to file-local to
> avoid symbol clashes when multiple translation units instantiate the same
> class. It also explicitly provides local BTF id lists for handcrafted syscall
> events.
>
> Link: https://lore.kernel.org/all/ff58b01c-3f5e-4d55-be82-609d2faaf12e@sirena.org.uk/
>
>> diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h
>> index 09ad57ac4b73e..45ffbe04b5805 100644
>> --- a/include/trace/trace_events.h
>> +++ b/include/trace/trace_events.h
>> @@ -404,10 +404,12 @@ static inline notrace int trace_event_get_offsets_##call( \
>> * [0] FUNC __bpf_trace_<call> (the BPF dispatcher)
>> * [1] STRUCT trace_event_raw_<call> (the ring-buffer record)
>> * Exposed via the events/<sys>/<name>/btf_ids tracefs file.
>> + *
>> + * File-local: the class name is not unique, so a global symbol would
>> + * clash across translation units.
>> */
>> #define _TRACE_BTF_IDS_DECLARE(call) \
>> - extern u32 __bpf_trace_btf_ids_##call[]; \
>> - BTF_ID_LIST_GLOBAL(__bpf_trace_btf_ids_##call, 2) \
>> + BTF_ID_LIST(__bpf_trace_btf_ids_##call) \
>> BTF_ID(func, __bpf_trace_##call) \
>> BTF_ID(struct, trace_event_raw_##call)
>
> [Severity: Medium]
> Does changing this to BTF_ID_LIST() introduce significant BSS memory bloat
> when CONFIG_DEBUG_INFO_BTF is disabled?
>
> When CONFIG_DEBUG_INFO_BTF is disabled, the fallback for BTF_ID_LIST is
> defined as:
>
> include/linux/btf_ids.h:
> #define BTF_ID_LIST(name) static u32 __maybe_unused name[128];
>
> BTF_ID_LIST_GLOBAL(..., 2) only allocated 2 elements (8 bytes), but this
> fallback statically allocates a 128-element u32 array (512 bytes) per
> instance.
>
> Because _TRACE_BTF_IDS_DECLARE is instantiated via DECLARE_EVENT_CLASS for
> over a thousand trace event classes across the kernel, this seems to silently
> add roughly 750 KB of wasted BSS memory.
>
I'll follow up on this
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-07-30 13:48 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-30 12:51 [PATCH bpf-next] tracing: Make per-template BTF id lists file-local Mykyta Yatsenko
2026-07-30 13:03 ` sashiko-bot
2026-07-30 13:48 ` Mykyta Yatsenko
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.