From: Andreas Hindborg <a.hindborg@kernel.org>
To: "Tamir Duberstein" <tamird@gmail.com>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
"Anna-Maria Behnsen" <anna-maria@linutronix.de>,
"Frederic Weisbecker" <frederic@kernel.org>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Danilo Krummrich" <dakr@kernel.org>,
"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>,
"Lyude Paul" <lyude@redhat.com>,
"Guangbo Cui" <2407018371@qq.com>,
"Dirk Behme" <dirk.behme@gmail.com>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v8 02/14] rust: hrtimer: introduce hrtimer support
Date: Fri, 21 Feb 2025 09:36:57 +0100 [thread overview]
Message-ID: <87ldtzhexi.fsf@kernel.org> (raw)
In-Reply-To: <CAJ-ks9mNidHZvWkFJE1jExc2oVk_bbJpiO_DRMrWu5nYhTpKgg@mail.gmail.com> (Tamir Duberstein's message of "Thu, 20 Feb 2025 16:37:13 -0500")
"Tamir Duberstein" <tamird@gmail.com> writes:
> On Thu, Feb 20, 2025 at 4:19 PM Andreas Hindborg <a.hindborg@kernel.org> wrote:
>>
>> "Tamir Duberstein" <tamird@gmail.com> writes:
>>
>> > On Tue, Feb 18, 2025 at 8:29 AM Andreas Hindborg <a.hindborg@kernel.org> wrote:
>> >>
>>
>> [...]
>>
>> >> +//! ## State Diagram
>> >> +//!
>> >> +//! ```text
>> >> +//! <-- Stop ----
>> >> +//! <-- Cancel --
>> >> +//! --- Start -->
>> >> +//! +---------+ +---------+
>> >> +//! O--->| Stopped | | Running |---o
>> >> +//! +---------+ +---------+ |
>> >> +//! ^ |
>> >> +//! <- Expire -- | |
>> >> +//! o------o
>> >> +//! Restart
>> >> +//! ```
>> >> +//!
>> >> +//! A timer is initialized in the **stopped** state. A stopped timer can be
>> >> +//! **started** with an **expiry** time. After the timer is started, it is
>> >> +//! **running**. When the timer **expires**, the timer handler is executed.
>> >> +//! After the handler has executed, the timer may be **restarted** or
>> >> +//! **stopped**. A running timer can be **canceled** before it's handler is
>> >
>> > "it's" = it is. This should be "its" (possessive).
>>
>> Thanks 👍
>>
>> > Just to be clear, after the handler has executed and before the timer
>> > has been **restarted** or **stopped** the timer is still in the
>> > **running** state?
>>
>> It depends on the return value of the handler. If the handler returns restart,
>> the timer the timer does not enter the stopped state. If the handler
>> returns stop, the timer enters the stopped state.
>>
>> The timer is still considered to be in running state the handler is
>> running.
>>
>> I can add this info to the section.
>
> Yeah, some clarification here would be useful.
I'll add a paragraph 👍
[...]
>> >> + /// Get a pointer to the contained `bindings::hrtimer`.
>> >> + ///
>> >> + /// # Safety
>> >> + ///
>> >> + /// `ptr` must point to a live allocation of at least the size of `Self`.
>> >> + unsafe fn raw_get(ptr: *const Self) -> *mut bindings::hrtimer {
>> >> + // SAFETY: The field projection to `timer` does not go out of bounds,
>> >> + // because the caller of this function promises that `ptr` points to an
>> >> + // allocation of at least the size of `Self`.
>> >> + unsafe { Opaque::raw_get(core::ptr::addr_of!((*ptr).timer)) }
>> >> + }
>> >
>> > Can you help me understand why the various functions here operate on
>> > *const Self? I understand the need to obtain a C pointer to interact
>> > with bindings, but I don't understand why we're dealing in raw
>> > pointers to the abstraction rather than references.
>>
>> We cannot reference the `bindings::hrtimer` without wrapping it in
>> `Opaque`. This would be the primary reason. At other times, we cannot
>> produce references because we might not be able to prove that we satisfy
>> the safety requirements for turning a pointer into a reference. If we
>> are just doing offset arithmetic anyway, we don't need a reference.
>
> Why do we have a pointer, rather than a reference, to Self in the
> first place? I think this is the key thing I don't understand.
Perhaps it makes more sense if you look at the context. One of the entry
points to `HrTimer::raw_get` is via `<ArcHrTimerHandle as
HrTimerHandle>::cancel`. This user facing method takes `&mut self`. The
handle contains an arc to a type that contains a `Timer` and implements
`HasHrTImer`. To get to the timer, we need to do pointer manipulation.
We only know how to get the `Timer` field via the `OFFSET`. The natural
return value from the offset operation is a raw pointer. Rather than
convert back to a reference, we stay in pointer land when we call
`HrTimer::raw_cancel`, because we need a pointer to the
`bindings::hrtimer` anyway, not a reference.
>
>>
>>
>> > This extends to
>> > HrTimerPointer, which is intended to be implemented by *pointers to*
>> > structs that embed `HrTimer`; why isn't it implemented on by the
>> > embedder itself?
>>
>> Not sure what you mean here. If you refer to for instance the
>> implementation of `HrTimerPointer for Arc<T>`, I get why you might
>> wonder, why does `HasHrTimer::start` not take a reference instead of a
>> pointer? We could do that, but we would just immediately break it down
>> again in the implementation of `HasHrTimer::start`. Might still be a
>> good idea though.
>
> I was trying to say that my question (which I clarified above,
> hopefully) extends to the description and name of this trait.
> Specifically for this trait I don't understand why its semantics are
> described in terms of pointers rather than references (and AsRef, to
> allow for Arc and friends).
All user facing APIs use references, not pointers. The raw pointer
interfaces are for internal use only. I don't think we would gain
anything from using `AsRef` internally. Perhaps you could clarify a bit more?
>
>> >
>> > I realize we discussed this on v6, sorry for not keeping up there.
>>
>> No worries, it is good that we discuss this.
>>
>> [...]
>>
>> >> +
>> >> +/// A handle representing a potentially running timer.
>> >> +///
>> >> +/// More than one handle representing the same timer might exist.
>> >> +///
>> >> +/// # Safety
>> >> +///
>> >> +/// When dropped, the timer represented by this handle must be cancelled, if it
>> >> +/// is running. If the timer handler is running when the handle is dropped, the
>> >> +/// drop method must wait for the handler to finish before returning.
>> >
>> > Between this comment and the comment on cancel we say "if it is
>> > running" 3 times. Can we say it just once, on the method, and here say
>> > that cancel must be called in Drop?
>>
>> Well, the comment on `cancel` is just a description of what the function
>> does. This piece of text is a safety requirement.
>>
>> We could make the safety requirement for implementing the trait "Implement
>> the methods according to their documentation". But that would not help with
>> the drop requirement.
>
> My suggestion is that the safety comment read: when dropped,
> [Self::cancel] must be called. Something like that.
We don't care how the timer is canceled, it just has to be canceled. It
does not have to be by calling `Self::cancel`.
Best regards,
Andreas Hindborg
next prev parent reply other threads:[~2025-02-21 8:37 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <aIJ0ymzdUceCN05hwJpth4erH5u2SHYzYl52wGeT3uiO9bdk92ZkEmEEq9a9NXsInJYSz9uziwq-1fvdsXoeDA==@protonmail.internalid>
2025-02-18 13:27 ` [PATCH v8 00/14] hrtimer Rust API Andreas Hindborg
2025-02-18 13:27 ` [PATCH v8 01/14] rust: time: Add Ktime::from_ns() Andreas Hindborg
2025-02-19 11:58 ` Benno Lossin
2025-02-19 14:53 ` Andreas Hindborg
2025-02-18 13:27 ` [PATCH v8 02/14] rust: hrtimer: introduce hrtimer support Andreas Hindborg
2025-02-20 17:04 ` Tamir Duberstein
2025-02-20 21:18 ` Andreas Hindborg
2025-02-20 21:37 ` Tamir Duberstein
2025-02-21 8:19 ` Andreas Hindborg
2025-02-21 13:04 ` Tamir Duberstein
2025-02-21 13:17 ` Andreas Hindborg
2025-02-21 14:19 ` Tamir Duberstein
2025-02-21 8:36 ` Andreas Hindborg [this message]
2025-02-21 13:14 ` Tamir Duberstein
2025-02-21 13:28 ` Andreas Hindborg
2025-02-21 14:21 ` Tamir Duberstein
2025-02-22 18:25 ` Andreas Hindborg
2025-02-22 18:41 ` Tamir Duberstein
2025-02-21 14:40 ` Boqun Feng
2025-02-21 14:46 ` Tamir Duberstein
2025-02-21 15:19 ` Boqun Feng
2025-02-21 19:46 ` Tamir Duberstein
2025-02-21 22:37 ` Boqun Feng
2025-02-22 1:08 ` Tamir Duberstein
2025-02-22 1:38 ` Boqun Feng
2025-02-22 9:25 ` Andreas Hindborg
2025-02-22 11:40 ` Andreas Hindborg
2025-02-22 21:25 ` Boqun Feng
2025-02-20 23:46 ` Benno Lossin
2025-02-21 9:03 ` Andreas Hindborg
2025-02-21 10:15 ` Andreas Hindborg
2025-02-21 11:05 ` Benno Lossin
2025-02-21 12:17 ` Andreas Hindborg
2025-02-22 9:37 ` Benno Lossin
2025-02-22 11:27 ` Andreas Hindborg
2025-02-21 9:05 ` Andreas Hindborg
2025-02-21 11:29 ` Frederic Weisbecker
2025-02-21 11:44 ` Andreas Hindborg
2025-02-18 13:27 ` [PATCH v8 03/14] rust: sync: add `Arc::as_ptr` Andreas Hindborg
2025-02-20 23:18 ` Benno Lossin
2025-02-18 13:27 ` [PATCH v8 04/14] rust: hrtimer: implement `HrTimerPointer` for `Arc` Andreas Hindborg
2025-02-18 13:27 ` [PATCH v8 05/14] rust: hrtimer: allow timer restart from timer handler Andreas Hindborg
2025-02-20 23:47 ` Benno Lossin
2025-02-21 9:09 ` Andreas Hindborg
2025-02-21 10:15 ` Benno Lossin
2025-02-18 13:27 ` [PATCH v8 06/14] rust: hrtimer: add `UnsafeHrTimerPointer` Andreas Hindborg
2025-02-20 23:18 ` Benno Lossin
2025-02-18 13:27 ` [PATCH v8 07/14] rust: hrtimer: add `hrtimer::ScopedHrTimerPointer` Andreas Hindborg
2025-02-18 13:27 ` [PATCH v8 08/14] rust: hrtimer: implement `UnsafeHrTimerPointer` for `Pin<&T>` Andreas Hindborg
2025-02-18 13:27 ` [PATCH v8 09/14] rust: hrtimer: implement `UnsafeHrTimerPointer` for `Pin<&mut T>` Andreas Hindborg
2025-02-18 13:27 ` [PATCH v8 10/14] rust: alloc: add `Box::into_pin` Andreas Hindborg
2025-02-20 23:20 ` Benno Lossin
2025-02-21 9:10 ` Andreas Hindborg
2025-02-18 13:27 ` [PATCH v8 11/14] rust: hrtimer: implement `HrTimerPointer` for `Pin<Box<T>>` Andreas Hindborg
2025-02-18 13:27 ` [PATCH v8 12/14] rust: hrtimer: add `HrTimerMode` Andreas Hindborg
2025-02-20 23:23 ` Benno Lossin
2025-02-21 9:17 ` Andreas Hindborg
2025-02-21 10:19 ` Benno Lossin
2025-02-21 11:39 ` Andreas Hindborg
2025-02-22 9:34 ` Benno Lossin
2025-02-18 13:27 ` [PATCH v8 13/14] rust: hrtimer: add clocksource selection through `ClockSource` Andreas Hindborg
2025-02-20 23:27 ` Benno Lossin
2025-02-21 9:29 ` Andreas Hindborg
2025-02-21 10:22 ` Benno Lossin
2025-02-18 13:27 ` [PATCH v8 14/14] rust: hrtimer: add maintainer entry Andreas Hindborg
2025-02-19 11:02 ` [PATCH v8 00/14] hrtimer Rust API Andreas Hindborg
2025-02-20 21:03 ` Frederic Weisbecker
2025-02-21 8:40 ` Andreas Hindborg
2025-02-21 11:20 ` Frederic Weisbecker
2025-02-22 13:04 ` Miguel Ojeda
2025-02-22 13:10 ` Miguel Ojeda
2025-03-05 17:34 ` Frederic Weisbecker
2025-02-20 22:35 ` Frederic Weisbecker
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=87ldtzhexi.fsf@kernel.org \
--to=a.hindborg@kernel.org \
--cc=2407018371@qq.com \
--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=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=dirk.behme@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=tamird@gmail.com \
--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.