All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.