From: Nicolas Schier <nsc@kernel.org>
To: Steven Rostedt <rostedt@kernel.org>
Cc: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
linux-kbuild@vger.kernel.org,
Masami Hiramatsu <mhiramat@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Andrew Morton <akpm@linux-foundation.org>,
Arnd Bergmann <arnd@arndb.de>,
Masahiro Yamada <masahiroy@kernel.org>,
Nathan Chancellor <nathan@kernel.org>,
Nick Desaulniers <nick.desaulniers+lkml@gmail.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Randy Dunlap <rdunlap@infradead.org>,
Stephen Rothwell <sfr@canb.auug.org.au>
Subject: Re: [PATCH v9 2/4] tracing: Add a tracepoint verification check at build time
Date: Fri, 17 Oct 2025 22:15:20 +0200 [thread overview]
Message-ID: <aPKj2Ilnq7F0xLFx@levanger> (raw)
In-Reply-To: <20251015203924.391455037@kernel.org>
On Wed, Oct 15, 2025 at 04:38:44PM -0400, Steven Rostedt wrote:
> From: Steven Rostedt <rostedt@goodmis.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@efficios.com> # for using strings instead of pointers
> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.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
next prev parent reply other threads:[~2025-10-17 20:46 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-15 20:38 [PATCH v9 0/4] tracepoints: Add warnings for unused tracepoints and trace events Steven Rostedt
2025-10-15 20:38 ` [PATCH v9 1/4] sorttable: Move ELF parsing into scripts/elf-parse.[ch] Steven Rostedt
2025-10-15 20:38 ` [PATCH v9 2/4] tracing: Add a tracepoint verification check at build time Steven Rostedt
2025-10-15 23:12 ` Nathan Chancellor
2025-10-15 23:14 ` Steven Rostedt
2025-10-17 20:15 ` Nicolas Schier [this message]
2025-10-21 19:47 ` Steven Rostedt
2025-10-21 21:21 ` Nicolas Schier
2025-10-15 20:38 ` [PATCH v9 3/4] tracepoint: Do not warn for unused event that is exported Steven Rostedt
2025-10-15 20:38 ` [PATCH v9 4/4] tracing: Add warnings for unused tracepoints for modules Steven Rostedt
2025-10-15 23:19 ` Nathan Chancellor
2025-10-17 20:22 ` Nicolas Schier
2025-10-21 19:48 ` Steven Rostedt
2025-10-21 19:57 ` Steven Rostedt
2025-10-16 10:54 ` kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aPKj2Ilnq7F0xLFx@levanger \
--to=nsc@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=masahiroy@kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=nathan@kernel.org \
--cc=nick.desaulniers+lkml@gmail.com \
--cc=rdunlap@infradead.org \
--cc=rostedt@kernel.org \
--cc=sfr@canb.auug.org.au \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.