From: Andreas Hindborg <a.hindborg@kernel.org>
To: "Lyude Paul" <lyude@redhat.com>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
"Anna-Maria Behnsen" <anna-maria@linutronix.de>,
"Frederic Weisbecker" <frederic@kernel.org>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <benno.lossin@proton.me>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 11/13] rust: hrtimer: add `TimerMode`
Date: Wed, 20 Nov 2024 16:51:44 +0100 [thread overview]
Message-ID: <87r0753nu7.fsf@kernel.org> (raw)
In-Reply-To: <f27dfef8aa3d184382a6573ddde8d89a2d688f24.camel@redhat.com> (Lyude Paul's message of "Wed, 13 Nov 2024 18:37:31 -0500")
"Lyude Paul" <lyude@redhat.com> writes:
> On Thu, 2024-10-17 at 15:04 +0200, Andreas Hindborg wrote:
>> Allow selection of timer mode by passing a `TimerMode` variant to
>> `Timer::new`.
>>
>> Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
>> ---
>> rust/kernel/hrtimer.rs | 88 +++++++++++++++++++++++++++++++++++++++++++++++---
>> 1 file changed, 84 insertions(+), 4 deletions(-)
>>
>> diff --git a/rust/kernel/hrtimer.rs b/rust/kernel/hrtimer.rs
>> index 2c1573e19576de93afc959d71e94173e2c1ed715..1674d1dcba39cc7ab82e1f189002afa365ee9341 100644
>> --- a/rust/kernel/hrtimer.rs
>> +++ b/rust/kernel/hrtimer.rs
>> @@ -38,12 +38,13 @@
>> /// # Invariants
>> ///
>> /// * `self.timer` is initialized by `bindings::hrtimer_init`.
>> -#[repr(transparent)]
>> #[pin_data]
>> #[repr(C)]
>> pub struct Timer<U> {
>> #[pin]
>> timer: Opaque<bindings::hrtimer>,
>> + // This field goes away when `bindings::hrtimer_setup` is added.
>> + mode: TimerMode,
>> _t: PhantomData<U>,
>> }
>>
>> @@ -56,7 +57,7 @@ unsafe impl<U> Sync for Timer<U> {}
>>
>> impl<T> Timer<T> {
>> /// Return an initializer for a new timer instance.
>> - pub fn new() -> impl PinInit<Self>
>> + pub fn new(mode: TimerMode) -> impl PinInit<Self>
>> where
>> T: TimerCallback,
>> {
>> @@ -70,7 +71,7 @@ pub fn new() -> impl PinInit<Self>
>> bindings::hrtimer_init(
>> place,
>> bindings::CLOCK_MONOTONIC as i32,
>> - bindings::hrtimer_mode_HRTIMER_MODE_REL,
>> + mode.into(),
>> );
>> }
>>
>> @@ -83,6 +84,7 @@ pub fn new() -> impl PinInit<Self>
>> // exclusive access.
>> unsafe { core::ptr::write(function, Some(T::CallbackTarget::run)) };
>> }),
>> + mode: mode,
>> _t: PhantomData,
>> })
>> }
>> @@ -330,7 +332,7 @@ unsafe fn start(self_ptr: *const Self, expires: Ktime) {
>> Self::c_timer_ptr(self_ptr).cast_mut(),
>> expires.to_ns(),
>> 0,
>> - bindings::hrtimer_mode_HRTIMER_MODE_REL,
>> + (*Self::raw_get_timer(self_ptr)).mode.into(),
>> );
>> }
>> }
>> @@ -362,6 +364,84 @@ fn from(value: TimerRestart) -> Self {
>> }
>> }
>>
>> +/// Operational mode of [`Timer`].
>> +#[derive(Clone, Copy)]
>> +pub enum TimerMode {
>> + /// Timer expires at the given expiration time.
>> + Absolute,
>> + /// Timer expires after the given expiration time interpreted as a duration from now.
>> + Relative,
>> + /// Timer does not move between CPU cores.
>> + Pinned,
>> + /// Timer handler is executed in soft irq context.
>> + Soft,
>> + /// Timer handler is executed in hard irq context.
>> + Hard,
>> + /// Timer expires at the given expiration time.
>> + /// Timer does not move between CPU cores.
>> + AbsolutePinned,
>> + /// Timer expires after the given expiration time interpreted as a duration from now.
>> + /// Timer does not move between CPU cores.
>> + RelativePinned,
>> + /// Timer expires at the given expiration time.
>> + /// Timer handler is executed in soft irq context.
>> + AbsoluteSoft,
>> + /// Timer expires after the given expiration time interpreted as a duration from now.
>> + /// Timer handler is executed in soft irq context.
>> + RelativeSoft,
>> + /// Timer expires at the given expiration time.
>> + /// Timer does not move between CPU cores.
>> + /// Timer handler is executed in soft irq context.
>> + AbsolutePinnedSoft,
>> + /// Timer expires after the given expiration time interpreted as a duration from now.
>> + /// Timer does not move between CPU cores.
>> + /// Timer handler is executed in soft irq context.
>> + RelativePinnedSoft,
>> + /// Timer expires at the given expiration time.
>> + /// Timer handler is executed in hard irq context.
>> + AbsoluteHard,
>> + /// Timer expires after the given expiration time interpreted as a duration from now.
>> + /// Timer handler is executed in hard irq context.
>> + RelativeHard,
>> + /// Timer expires at the given expiration time.
>> + /// Timer does not move between CPU cores.
>> + /// Timer handler is executed in hard irq context.
>> + AbsolutePinnedHard,
>> + /// Timer expires after the given expiration time interpreted as a duration from now.
>> + /// Timer does not move between CPU cores.
>> + /// Timer handler is executed in hard irq context.
>> + RelativePinnedHard,
>> +}
>> +
>> +impl From<TimerMode> for bindings::hrtimer_mode {
>> + fn from(value: TimerMode) -> Self {
>> + use bindings::*;
>> + match value {
>> + TimerMode::Absolute => hrtimer_mode_HRTIMER_MODE_ABS,
>> + TimerMode::Relative => hrtimer_mode_HRTIMER_MODE_REL,
>> + TimerMode::Pinned => hrtimer_mode_HRTIMER_MODE_PINNED,
>> + TimerMode::Soft => hrtimer_mode_HRTIMER_MODE_SOFT,
>> + TimerMode::Hard => hrtimer_mode_HRTIMER_MODE_HARD,
>> + TimerMode::AbsolutePinned => hrtimer_mode_HRTIMER_MODE_ABS_PINNED,
>> + TimerMode::RelativePinned => hrtimer_mode_HRTIMER_MODE_REL_PINNED,
>> + TimerMode::AbsoluteSoft => hrtimer_mode_HRTIMER_MODE_ABS_SOFT,
>> + TimerMode::RelativeSoft => hrtimer_mode_HRTIMER_MODE_REL_SOFT,
>> + TimerMode::AbsolutePinnedSoft => hrtimer_mode_HRTIMER_MODE_ABS_PINNED_SOFT,
>> + TimerMode::RelativePinnedSoft => hrtimer_mode_HRTIMER_MODE_REL_PINNED_SOFT,
>> + TimerMode::AbsoluteHard => hrtimer_mode_HRTIMER_MODE_ABS_HARD,
>> + TimerMode::RelativeHard => hrtimer_mode_HRTIMER_MODE_REL_HARD,
>> + TimerMode::AbsolutePinnedHard => hrtimer_mode_HRTIMER_MODE_ABS_PINNED_HARD,
>> + TimerMode::RelativePinnedHard => hrtimer_mode_HRTIMER_MODE_REL_PINNED_HARD,
>> + }
>> + }
>> +}
>
> Are we sure we actually need to explicitly convert it like this? You should be
> able to use #[repr(…)] to indicate that the enum is the same type as the
> actual C constant, and then we can just assign the value of each C constant as
> the discriminant for each enum value in TimerMode.
>
Some combinations of modes are illegal. With this approach, it is not
possible to name the illegal combinations.
Interesting discussion is happening on Zulip regarding a possible
solution for enums like this [1].
Best regards,
Andreas Hindborg
[1] https://rust-for-linux.zulipchat.com/#narrow/channel/291565-Help/topic/Best.20way.20to.20handle.20enum.2Fflags.20situation
next prev parent reply other threads:[~2024-11-20 15:51 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-17 13:04 [PATCH v3 00/13] hrtimer Rust API Andreas Hindborg
2024-10-17 13:04 ` [PATCH v3 01/13] rust: time: Add Ktime::from_ns() Andreas Hindborg
2024-10-17 13:04 ` [PATCH v3 02/13] rust: hrtimer: introduce hrtimer support Andreas Hindborg
2024-11-07 1:55 ` Thomas Gleixner
2024-11-20 11:41 ` Andreas Hindborg
2024-10-17 13:04 ` [PATCH v3 03/13] rust: sync: add `Arc::as_ptr` Andreas Hindborg
2024-10-17 13:04 ` [PATCH v3 04/13] rust: hrtimer: implement `TimerPointer` for `Arc` Andreas Hindborg
2024-11-13 23:24 ` Lyude Paul
2024-11-20 15:22 ` Andreas Hindborg
2024-11-22 12:36 ` Miguel Ojeda
2024-11-22 16:24 ` Daniel Almeida
2024-12-04 13:41 ` Andreas Hindborg
2024-12-09 21:36 ` Miguel Ojeda
2024-10-17 13:04 ` [PATCH v3 05/13] rust: hrtimer: allow timer restart from timer handler Andreas Hindborg
2024-10-20 16:46 ` kernel test robot
2024-10-17 13:04 ` [PATCH v3 06/13] rust: hrtimer: add `UnsafeTimerPointer` Andreas Hindborg
2024-11-13 23:27 ` Lyude Paul
2024-11-20 15:25 ` Andreas Hindborg
2024-10-17 13:04 ` [PATCH v3 07/13] rust: hrtimer: implement `UnsafeTimerPointer` for `Pin<&T>` Andreas Hindborg
2024-11-13 23:30 ` Lyude Paul
2024-11-20 15:48 ` Andreas Hindborg
2024-10-17 13:04 ` [PATCH v3 08/13] rust: hrtimer: implement `UnsafeTimerPointer` for `Pin<&mut T>` Andreas Hindborg
2024-11-13 23:33 ` Lyude Paul
2024-10-17 13:04 ` [PATCH v3 09/13] rust: hrtimer: add `hrtimer::ScopedTimerPointer` Andreas Hindborg
2024-10-17 13:04 ` [PATCH v3 10/13] rust: hrtimer: implement `TimerPointer` for `Pin<Box<T>>` Andreas Hindborg
2024-10-17 13:04 ` [PATCH v3 11/13] rust: hrtimer: add `TimerMode` Andreas Hindborg
2024-11-13 23:37 ` Lyude Paul
2024-11-20 15:51 ` Andreas Hindborg [this message]
2024-10-17 13:04 ` [PATCH v3 12/13] rust: hrtimer: add clocksource selection through `ClockSource` Andreas Hindborg
2024-10-17 13:04 ` [PATCH v3 13/13] rust: hrtimer: add maintainer entry Andreas Hindborg
2024-11-13 23:39 ` [PATCH v3 00/13] hrtimer Rust API Lyude Paul
2024-11-20 15:58 ` Andreas Hindborg
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=87r0753nu7.fsf@kernel.org \
--to=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=anna-maria@linutronix.de \
--cc=benno.lossin@proton.me \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=frederic@kernel.org \
--cc=gary@garyguo.net \
--cc=linux-kernel@vger.kernel.org \
--cc=lyude@redhat.com \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tglx@linutronix.de \
--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.