rust: hrtimer: allow timer restart from timer handler

Allow timer handlers to report that they want a timer to be restarted after
the timer handler has finished executing.

Acked-by: Frederic Weisbecker <frederic@kernel.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Benno Lossin <benno.lossin@proton.me>
Reviewed-by: Tamir Duberstein <tamird@gmail.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Link: https://lore.kernel.org/r/20250309-hrtimer-v3-v6-12-rc2-v12-4-73586e2bd5f1@kernel.org
Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
This commit is contained in:
Andreas Hindborg 2025-03-09 16:18:55 +01:00
parent d7bf4786b5
commit 94e05a66ea
2 changed files with 20 additions and 4 deletions

View file

@ -212,7 +212,7 @@ pub trait HrTimerCallback {
type Pointer<'a>: RawHrTimerCallback; type Pointer<'a>: RawHrTimerCallback;
/// Called by the timer logic when the timer fires. /// Called by the timer logic when the timer fires.
fn run(this: <Self::Pointer<'_> as RawHrTimerCallback>::CallbackTarget<'_>) fn run(this: <Self::Pointer<'_> as RawHrTimerCallback>::CallbackTarget<'_>) -> HrTimerRestart
where where
Self: Sized; Self: Sized;
} }
@ -311,6 +311,24 @@ pub unsafe trait HasHrTimer<T> {
} }
} }
/// Restart policy for timers.
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
#[repr(u32)]
pub enum HrTimerRestart {
/// Timer should not be restarted.
#[allow(clippy::unnecessary_cast)]
NoRestart = bindings::hrtimer_restart_HRTIMER_NORESTART as u32,
/// Timer should be restarted.
#[allow(clippy::unnecessary_cast)]
Restart = bindings::hrtimer_restart_HRTIMER_RESTART as u32,
}
impl HrTimerRestart {
fn into_c(self) -> bindings::hrtimer_restart {
self as bindings::hrtimer_restart
}
}
/// Use to implement the [`HasHrTimer<T>`] trait. /// Use to implement the [`HasHrTimer<T>`] trait.
/// ///
/// See [`module`] documentation for an example. /// See [`module`] documentation for an example.

View file

@ -95,8 +95,6 @@ where
// allocation from other `Arc` clones. // allocation from other `Arc` clones.
let receiver = unsafe { ArcBorrow::from_raw(data_ptr) }; let receiver = unsafe { ArcBorrow::from_raw(data_ptr) };
T::run(receiver); T::run(receiver).into_c()
bindings::hrtimer_restart_HRTIMER_NORESTART
} }
} }