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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox