[PATCH v1 0/2] Add support for print exactly once

FUJITA Tomonori
2025-11-05T05:47:42Z

This adds the Rust equivalent of the kernel's DO_ONCE_LITE and
pr_*_once macros.

A proposal for this feature was made in the past [1], but it didn't
reach consensus on the implementation and wasn't merged. After reading
the previous discussions, I implemented it using a different approach.

In the previous proposal, a structure equivalent to std::sync::Once
was implemented to realize the DO_ONCE_LITE macro. The approach tried
to provide Once-like semantics by using two atomic values. As pointed
out in the previous review comments, I think this approach tries to
provide more functionality than needed, making it unnecessarily
complex. Also, because data structures in the .data..once section can
be cleared at any time (via debugfs clear_warn_once), an
implementation using two atomics wouldn't work correctly.

Therefore, I decided to drop the idea of emulating Once and took a
minimal approach to implement DO_ONCE_LITE with only one atomic
variable. While it would be possible to implement the feature entirely
as a Rust macro, the functionality that can be implemented as regular
functions has been extracted and implemented as the OnceLite struct
for better code readability.

Of course, unlike the previous proposal, this uses LKMM atomics.

[1] https://lore.kernel.org/rust-for-linux/20241126-pr_once_macros-v4-0-410b8ca9643e@tuta.io/

FUJITA Tomonori (2):
rust: Add support for calling a function exactly once
rust: Add pr_*_once macros

rust/kernel/lib.rs | 1 +
rust/kernel/once_lite.rs | 71 ++++++++++++++++++++++++++++++++++++++++
rust/kernel/print.rs | 70 +++++++++++++++++++++++++++++++++++++++
3 files changed, 142 insertions(+)
create mode 100644 rust/kernel/once_lite.rs

base-commit: 3b83f5d5e78ac5cddd811a5e431af73959864390
--
2.43.0