[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <875xgubpat.fsf@kernel.org>
Date: Tue, 17 Jun 2025 13:06:18 +0200
From: Andreas Hindborg <a.hindborg@...nel.org>
To: "Lyude Paul" <lyude@...hat.com>
Cc: <rust-for-linux@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
"Boqun Feng" <boqun.feng@...il.com>, "FUJITA Tomonori"
<fujita.tomonori@...il.com>, "Frederic Weisbecker" <frederic@...nel.org>,
"Thomas Gleixner" <tglx@...utronix.de>, "Anna-Maria Behnsen"
<anna-maria@...utronix.de>, "John Stultz" <jstultz@...gle.com>, "Stephen
Boyd" <sboyd@...nel.org>, "Miguel Ojeda" <ojeda@...nel.org>, "Alex
Gaynor" <alex.gaynor@...il.com>, "Gary Guo" <gary@...yguo.net>,
Björn
Roy Baron <bjorn3_gh@...tonmail.com>, "Benno Lossin" <lossin@...nel.org>,
"Alice Ryhl" <aliceryhl@...gle.com>, "Trevor Gross" <tmgross@...ch.edu>,
"Danilo Krummrich" <dakr@...nel.org>
Subject: Re: [PATCH v5 3/7] rust: hrtimer: Add HrTimer::raw_forward() and
forward()
"Lyude Paul" <lyude@...hat.com> writes:
> Within the hrtimer API there are quite a number of functions that can only
> be safely called from one of two contexts:
>
> * When we have exclusive access to the hrtimer and the timer is not active.
> * When we're within the hrtimer's callback context as it is being executed.
>
> This commit adds bindings for hrtimer_forward() for the first such context,
> along with HrTimer::raw_forward() for later use in implementing the
> hrtimer_forward() in the latter context.
>
> Signed-off-by: Lyude Paul <lyude@...hat.com>
>
> ---
> V4:
> * Fix the safety contract for raw_forward()
> * Require Pin<&mut Self>, not &mut self
> * Drop incorrect UniquePin example
> * Rewrite documentation a bit (re: Andreas)
>
> Signed-off-by: Lyude Paul <lyude@...hat.com>
> ---
> rust/kernel/time/hrtimer.rs | 48 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 48 insertions(+)
>
> diff --git a/rust/kernel/time/hrtimer.rs b/rust/kernel/time/hrtimer.rs
> index c775d7abdf5ce..6fdd54e3328c5 100644
> --- a/rust/kernel/time/hrtimer.rs
> +++ b/rust/kernel/time/hrtimer.rs
> @@ -168,6 +168,54 @@ pub(crate) unsafe fn raw_cancel(this: *const Self) -> bool {
> // handled on the C side.
> unsafe { bindings::hrtimer_cancel(c_timer_ptr) != 0 }
> }
> +
> + /// Forward the timer expiry for a given timer pointer.
> + ///
> + /// # Safety
> + ///
> + /// - `self_ptr` must point to a valid `Self`.
> + /// - The caller must either have exclusive access to the data pointed at by `self_ptr`, or be
> + /// within the context of the timer callback.
> + #[inline]
> + unsafe fn raw_forward(self_ptr: *mut Self, now: HrTimerInstant<T>, interval: Delta) -> u64
> + where
> + T: HasHrTimer<T>,
> + {
> + // SAFETY:
> + // * The C API requirements for this function are fulfilled by our safety contract.
> + // * `self_ptr` is guaranteed to point to a valid `Self` via our safety contract
> + unsafe {
> + bindings::hrtimer_forward(
> + Self::raw_get(self_ptr),
> + now.into_nanos(),
> + interval.into_nanos(),
> + )
> + }
> + }
> +
> + /// Conditionally forward the timer.
> + ///
> + /// If the timer expires after `now`, this function does nothing and returns 0. If the timer
> + /// expired at or before `now`, this function forwards the timer by `interval` until the timer
> + /// expires after `now` and then returns the number of times the timer was forwarded by
> + /// `interval`.
> + ///
> + /// This function is mainly useful for timer types which can provide exclusive access to the
> + /// timer when the timer is not running. For forwarding the timer from within the timer callback
> + /// context, see [`HrTimerCallbackContext::forward()`].
I think rustdoc is going to complain about this link being broken. Can
you add the last sentence when add the target of the link?
Best regards,
Andreas Hindborg
Powered by blists - more mailing lists