[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aPKj2Ilnq7F0xLFx@levanger>
Date: Fri, 17 Oct 2025 22:15:20 +0200
From: Nicolas Schier <nsc@...nel.org>
To: Steven Rostedt <rostedt@...nel.org>
Cc: linux-kernel@...r.kernel.org, linux-trace-kernel@...r.kernel.org,
linux-kbuild@...r.kernel.org,
Masami Hiramatsu <mhiramat@...nel.org>,
Mark Rutland <mark.rutland@....com>,
Mathieu Desnoyers <mathieu.desnoyers@...icios.com>,
Andrew Morton <akpm@...ux-foundation.org>,
Arnd Bergmann <arnd@...db.de>,
Masahiro Yamada <masahiroy@...nel.org>,
Nathan Chancellor <nathan@...nel.org>,
Nick Desaulniers <nick.desaulniers+lkml@...il.com>,
Catalin Marinas <catalin.marinas@....com>,
Linus Torvalds <torvalds@...ux-foundation.org>,
Randy Dunlap <rdunlap@...radead.org>,
Stephen Rothwell <sfr@...b.auug.org.au>
Subject: Re: [PATCH v9 2/4] tracing: Add a tracepoint verification check at
build time
On Wed, Oct 15, 2025 at 04:38:44PM -0400, Steven Rostedt wrote:
> From: Steven Rostedt <rostedt@...dmis.org>
>
> If a tracepoint is defined via DECLARE_TRACE() or TRACE_EVENT() but never
> called (via the trace_<tracepoint>() function), its metadata is still
> around in memory and not discarded.
>
> When created via TRACE_EVENT() the situation is worse because the
> TRACE_EVENT() creates metadata that can be around 5k per trace event.
> Having unused trace events causes several thousand of wasted bytes.
>
> Add a verifier that injects a string of the name of the tracepoint it
> calls that is added to the discarded section "__tracepoint_check".
> For every builtin tracepoint, its name (which is saved in the in-memory
> section "__tracepoint_strings") will have its name also in the
> "__tracepoint_check" section if it is used.
>
> Add a new program that is run on build called tracepoint-update. This is
> executed on the vmlinux.o before the __tracepoint_check section is
> discarded (the section is discarded before vmlinux is created). This
> program will create an array of each string in the __tracepoint_check
> section and then sort it. Then it will walk the strings in the
> __tracepoint_strings section and do a binary search to check if its name
> is in the __tracepoint_check section. If it is not, then it is unused and
> a warning is printed.
>
> Note, this currently only handles tracepoints that are builtin and not in
> modules.
>
> Enabling this currently with a given config produces:
>
> warning: tracepoint 'sched_move_numa' is unused.
> warning: tracepoint 'sched_stick_numa' is unused.
> warning: tracepoint 'sched_swap_numa' is unused.
> warning: tracepoint 'pelt_hw_tp' is unused.
> warning: tracepoint 'pelt_irq_tp' is unused.
> warning: tracepoint 'rcu_preempt_task' is unused.
> warning: tracepoint 'rcu_unlock_preempted_task' is unused.
> warning: tracepoint 'xdp_bulk_tx' is unused.
> warning: tracepoint 'xdp_redirect_map' is unused.
> warning: tracepoint 'xdp_redirect_map_err' is unused.
> warning: tracepoint 'vma_mas_szero' is unused.
> warning: tracepoint 'vma_store' is unused.
> warning: tracepoint 'hugepage_set_pmd' is unused.
> warning: tracepoint 'hugepage_set_pud' is unused.
> warning: tracepoint 'hugepage_update_pmd' is unused.
> warning: tracepoint 'hugepage_update_pud' is unused.
> warning: tracepoint 'block_rq_remap' is unused.
> warning: tracepoint 'xhci_dbc_handle_event' is unused.
> warning: tracepoint 'xhci_dbc_handle_transfer' is unused.
> warning: tracepoint 'xhci_dbc_gadget_ep_queue' is unused.
> warning: tracepoint 'xhci_dbc_alloc_request' is unused.
> warning: tracepoint 'xhci_dbc_free_request' is unused.
> warning: tracepoint 'xhci_dbc_queue_request' is unused.
> warning: tracepoint 'xhci_dbc_giveback_request' is unused.
> warning: tracepoint 'tcp_ao_wrong_maclen' is unused.
> warning: tracepoint 'tcp_ao_mismatch' is unused.
> warning: tracepoint 'tcp_ao_key_not_found' is unused.
> warning: tracepoint 'tcp_ao_rnext_request' is unused.
> warning: tracepoint 'tcp_ao_synack_no_key' is unused.
> warning: tracepoint 'tcp_ao_snd_sne_update' is unused.
> warning: tracepoint 'tcp_ao_rcv_sne_update' is unused.
>
> Some of the above is totally unused but others are not used due to their
> "trace_" functions being inside configs, in which case, the defined
> tracepoints should also be inside those same configs. Others are
> architecture specific but defined in generic code, where they should
> either be moved to the architecture or be surrounded by #ifdef for the
> architectures they are for.
>
> This tool could be updated to process modules in the future.
>
> I'd like to thank Mathieu Desnoyers for suggesting using strings instead
> of pointers, as using pointers in vmlinux.o required handling relocations
> and it required implementing almost a full feature linker to do so.
>
> To enable this check, run the build with: make UT=1
>
> Link: https://lore.kernel.org/all/20250528114549.4d8a5e03@gandalf.local.home/
>
> Suggested-by: Mathieu Desnoyers <mathieu.desnoyers@...icios.com> # for using strings instead of pointers
> Signed-off-by: Steven Rostedt (Google) <rostedt@...dmis.org>
> ---
> Changes since v8: https://lore.kernel.org/20250828203741.401496225@kernel.org
>
> - Instead of using a config option to enable this, enable it via: make UT=1
> This will allow it to go into linux-next without triggering all the
> current warnings but also allow people to find and fix current unused
> tracepoints.
>
> Makefile | 15 ++
> include/asm-generic/vmlinux.lds.h | 1 +
> include/linux/tracepoint.h | 11 ++
> scripts/Makefile | 3 +
> scripts/link-vmlinux.sh | 7 +
> scripts/tracepoint-update.c | 232 ++++++++++++++++++++++++++++++
> 6 files changed, 269 insertions(+)
> create mode 100644 scripts/tracepoint-update.c
>
> diff --git a/Makefile b/Makefile
> index 17cfa11ca716..a3141890f38f 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -157,6 +157,20 @@ endif
>
> export KBUILD_EXTRA_WARN
>
> +# To check for unused tracepoints (tracepoints that are defined but never
> +# called), run with:
> +#
> +# make UT=1
> +#
> +# Each unused tracepoints can take up to 5KB of memory in the running kernel.
> +# It is best to remove any that are not used.
> +
> +ifeq ("$(origin UT)", "command line")
> + WARN_ON_UNUSED_TRACEPOINTS := $(UT)
> +endif
> +
> +export WARN_ON_UNUSED_TRACEPOINTS
Is there a special reason why you chose to introduce a new command-line
variable instead of extending KBUILD_EXTRA_WARN / W ?
Kind regards,
Nicolas
Powered by blists - more mailing lists