From: Alice Ryhl <aliceryhl@google.com>
To: FUJITA Tomonori <fujita.tomonori@gmail.com>
Cc: ojeda@kernel.org, a.hindborg@kernel.org,
bjorn3_gh@protonmail.com, boqun.feng@gmail.com, dakr@kernel.org,
gary@garyguo.net, lossin@kernel.org,
rust-for-linux@vger.kernel.org, tmgross@umich.edu,
jens.korinth.tuta.io@kernel.org
Subject: Re: [PATCH v1 0/2] Add support for print exactly once
Date: Thu, 13 Nov 2025 12:06:17 +0000 [thread overview]
Message-ID: <aRXJuUTR1fnWiBQF@google.com> (raw)
In-Reply-To: <20251113.201844.1009485179863259148.fujita.tomonori@gmail.com>
On Thu, Nov 13, 2025 at 08:18:44PM +0900, FUJITA Tomonori wrote:
> On Thu, 13 Nov 2025 10:07:36 +0000
> Alice Ryhl <aliceryhl@google.com> wrote:
>
> > On Wed, Nov 05, 2025 at 02:47:29PM +0900, FUJITA Tomonori wrote:
> >> 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/
> >
> > There has been a fair bit of discussion below. Here is my take on the
> > way forward:
> >
> > 1. OnceLite should be it's own special type, and it should be in a
> > printing-related module, not kernel::sync. The reason for this is
> > that do_once_lite! is hooked up to a special section that allows you
> > to reset the once status, and if someone used it for anything not
> > related to printing, they would end up with being incorrectly reset
> > when someone resets pr_warn_once calls.
>
> Do you mean that only the do_once_lite! macro, which places the data
> in .data..once section, should live in a printing-related module? Or
> should everything including OnceLite struct itself, also be moved
> there?
I think both should live in the same place, and not in kernel::sync.
Whether you call the module once_lite or print is not a big deal to me.
> > 2. I would suggest just using a relaxed load followed by store instead
> > of xchg. This is what the C-side does, and I think there is no strong
> > reason to deviate. It allows for a single byte of data instead of i32.
>
> You meant best-effort try-once logic like C?
>
> pub fn call_once<F>(&self, f: F) -> bool
> where
> F: FnOnce(),
> {
> if self.0.load(Relaxed) == State::Incomplete {
> self.0.store(State::Complete, Relaxed);
> f();
> return true;
> }
> false
> }
Yes that is what I meant.
> Using u8 as atomic type instead of i32 would require a fair amount of
> work, since at the moment only i32 and i64 are supported as atomic
> types, right?
Supporting u8 atomics in general is tricky, but I think *specifically*
load/store should not be a problem.
Alice
next prev parent reply other threads:[~2025-11-13 12:06 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <nsSZZk6z9Ia7Gl5JS9LVNDRjc-9eFvtSWyLI4SSjsHNouDkDV-GmXnixMYlIpGHryPfhLr8Z2W_CkWd6D2frYQ==@protonmail.internalid>
2025-11-05 5:47 ` [PATCH v1 0/2] Add support for print exactly once FUJITA Tomonori
2025-11-05 5:47 ` [PATCH v1 1/2] rust: Add support for calling a function " FUJITA Tomonori
2025-11-05 9:21 ` Onur Özkan
2025-11-05 10:35 ` Alice Ryhl
2025-11-05 10:32 ` Alice Ryhl
2025-11-06 0:34 ` FUJITA Tomonori
2025-11-05 16:19 ` Boqun Feng
2025-11-06 0:10 ` FUJITA Tomonori
2025-11-06 14:46 ` Boqun Feng
2025-11-07 9:03 ` Alice Ryhl
2025-11-10 9:21 ` FUJITA Tomonori
2025-11-10 16:14 ` Boqun Feng
2025-11-10 16:37 ` Miguel Ojeda
2025-11-10 16:55 ` Boqun Feng
2025-11-11 21:42 ` Miguel Ojeda
2025-11-11 3:09 ` FUJITA Tomonori
2025-11-11 5:17 ` Boqun Feng
2025-11-11 9:12 ` Andreas Hindborg
2025-11-11 23:38 ` FUJITA Tomonori
2025-11-12 9:04 ` Andreas Hindborg
2025-11-15 13:37 ` FUJITA Tomonori
2025-11-11 21:43 ` FUJITA Tomonori
2025-11-12 1:30 ` Boqun Feng
2025-11-12 2:23 ` Boqun Feng
2025-11-12 9:10 ` Andreas Hindborg
2025-11-14 15:03 ` Boqun Feng
2025-11-12 13:17 ` FUJITA Tomonori
2025-11-05 5:47 ` [PATCH v1 2/2] rust: Add pr_*_once macros FUJITA Tomonori
2025-11-05 10:33 ` Alice Ryhl
2025-11-05 20:59 ` [PATCH v1 0/2] Add support for print exactly once Andreas Hindborg
2025-11-05 23:12 ` FUJITA Tomonori
2025-11-06 14:31 ` Boqun Feng
2025-11-10 12:16 ` Andreas Hindborg
2025-11-10 16:08 ` Boqun Feng
2025-11-11 9:02 ` Andreas Hindborg
2025-11-12 0:45 ` FUJITA Tomonori
2025-11-12 1:04 ` Boqun Feng
2025-11-12 1:18 ` FUJITA Tomonori
2025-11-12 1:35 ` Boqun Feng
2025-11-13 9:55 ` FUJITA Tomonori
2025-11-11 1:28 ` FUJITA Tomonori
2025-11-13 10:07 ` Alice Ryhl
2025-11-13 11:18 ` FUJITA Tomonori
2025-11-13 12:06 ` Alice Ryhl [this message]
2025-11-14 0:47 ` FUJITA Tomonori
2025-11-14 0:57 ` Boqun Feng
2025-11-14 1:12 ` FUJITA Tomonori
2025-11-14 1:19 ` Boqun Feng
2025-11-14 9:48 ` Alice Ryhl
2025-11-14 13:55 ` FUJITA Tomonori
2025-11-14 13:47 ` FUJITA Tomonori
2025-11-13 15:20 ` Boqun Feng
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=aRXJuUTR1fnWiBQF@google.com \
--to=aliceryhl@google.com \
--cc=a.hindborg@kernel.org \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=dakr@kernel.org \
--cc=fujita.tomonori@gmail.com \
--cc=gary@garyguo.net \
--cc=jens.korinth.tuta.io@kernel.org \
--cc=lossin@kernel.org \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
/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.