From: "Benno Lossin" <lossin@kernel.org>
To: "Boqun Feng" <boqun.feng@gmail.com>
Cc: "Danilo Krummrich" <dakr@kernel.org>,
<gregkh@linuxfoundation.org>, <rafael@kernel.org>,
<ojeda@kernel.org>, <alex.gaynor@gmail.com>, <gary@garyguo.net>,
<bjorn3_gh@protonmail.com>, <a.hindborg@kernel.org>,
<aliceryhl@google.com>, <tmgross@umich.edu>,
<david.m.ertman@intel.com>, <ira.weiny@intel.com>,
<leon@kernel.org>, <kwilczynski@kernel.org>,
<bhelgaas@google.com>, <rust-for-linux@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-pci@vger.kernel.org>
Subject: Re: [PATCH v4 5/5] rust: devres: implement register_release()
Date: Sat, 28 Jun 2025 09:53:06 +0200 [thread overview]
Message-ID: <DAY059Y669BX.2GVKH6RBG80B6@kernel.org> (raw)
In-Reply-To: <aF-N-luMxFTurl91@Mac.home>
On Sat Jun 28, 2025 at 8:38 AM CEST, Boqun Feng wrote:
> On Sat, Jun 28, 2025 at 08:06:52AM +0200, Benno Lossin wrote:
>> On Sat Jun 28, 2025 at 12:06 AM CEST, Boqun Feng wrote:
>> > On Fri, Jun 27, 2025 at 01:19:53AM +0200, Benno Lossin wrote:
>> >> On Thu Jun 26, 2025 at 10:48 PM CEST, Danilo Krummrich wrote:
>> >> > On Thu, Jun 26, 2025 at 01:37:22PM -0700, Boqun Feng wrote:
>> >> >> On Thu, Jun 26, 2025 at 10:00:43PM +0200, Danilo Krummrich wrote:
>> >> >> > +/// [`Devres`]-releaseable resource.
>> >> >> > +///
>> >> >> > +/// Register an object implementing this trait with [`register_release`]. Its `release`
>> >> >> > +/// function will be called once the device is being unbound.
>> >> >> > +pub trait Release {
>> >> >> > + /// The [`ForeignOwnable`] pointer type consumed by [`register_release`].
>> >> >> > + type Ptr: ForeignOwnable;
>> >> >> > +
>> >> >> > + /// Called once the [`Device`] given to [`register_release`] is unbound.
>> >> >> > + fn release(this: Self::Ptr);
>> >> >> > +}
>> >> >> > +
>> >> >>
>> >> >> I would like to point out the limitation of this design, say you have a
>> >> >> `Foo` that can ipml `Release`, with this, I think you could only support
>> >> >> either `Arc<Foo>` or `KBox<Foo>`. You cannot support both as the input
>> >> >> for `register_release()`. Maybe we want:
>> >> >>
>> >> >> pub trait Release<Ptr: ForeignOwnable> {
>> >> >> fn release(this: Ptr);
>> >> >> }
>> >> >
>> >> > Good catch! I think this wasn't possible without ForeignOwnable::Target.
>> >>
>> >> Hmm do we really need that? Normally you either store a type in a shared
>> >
>> > I think it might be quite common, for example, `Foo` may be a general
>> > watchdog for a subsystem, for one driver, there might be multiple
>> > devices that could feed the dog, for another driver, there might be only
>> > one. For the first case we need Arc<Watchdog> or the second we can do
>> > Box<Watchdog>.
>>
>> I guess then the original `&self` design is better? Not sure...
>>
>
> This is what you said in v3:
>
> """
> and then `register_release` is:
>
> pub fn register_release<T: Release>(dev: &Device<Bound>, data: T::Ptr) -> Result
>
> This way, one can store a `Box<T>` and get access to the `T` at the end.
> Or if they store the value in an `Arc<T>`, they have the option to clone
> it and give it to somewhere else.
> """
>
> I think that's the reason why we think the current version (the
> associate type design) is better than `&self`?
Yeah and I'd still say that that statement is true.
> The generic type design (i.e. Release<P: ForeignOwnable>) just further
> allows this "different behaviors between Box and Arc" for the same type
> T. I think it's a natural extension of the current design and provides
> some better flexibility.
I think that extension is going to end up being too verbose.
>> > What's the downside?
>>
>> You'll need to implement `Release` twice:
>>
>
> Only if you need to support both for `Foo`, right? You can impl only one
> if you only need one.
>
> Also you can do:
>
> impl<P: ForeignOwnable<Target=Foo> + Deref<Target=Foo>> Release<P> for Foo {
> fn release(this: P) {
> this.deref().do_sth();
> }
> }
Please no. If this is a regular pattern, then let's go back to `&self`.
You lose all benefits of the generic design if you do it like this,
because you don't know the concrete type of the foreign ownable.
> if you want Box and Arc case share the similar behavior, right?
>
>> impl Release<Box<Self>> for Foo {
>> fn release(this: Box<Self>) {
>> /* ... */
>> }
>> }
>>
>> impl Release<Arc<Self>> for Foo {
>> fn release(this: Arc<Self>) {
>> /* ... */
>> }
>> }
>>
>> This also means that you can have different behavior for `Box` and
>> `Arc`...
>
> That's the point, as one of the benefits you mentioned above for the
> associate type design, just extending it to the same type.
I'd say that's too verbose for something that's rather supposed to be
simple.
Hmm @Danilo, do you have any use-cases in mind or already done?
---
Cheers,
Benno
next prev parent reply other threads:[~2025-06-28 7:53 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-26 20:00 [PATCH v4 0/5] Improvements for Devres Danilo Krummrich
2025-06-26 20:00 ` [PATCH v4 1/5] rust: revocable: support fallible PinInit types Danilo Krummrich
2025-06-26 20:00 ` [PATCH v4 2/5] rust: devres: replace Devres::new_foreign_owned() Danilo Krummrich
2025-06-26 20:00 ` [PATCH v4 3/5] rust: devres: get rid of Devres' inner Arc Danilo Krummrich
2025-06-26 20:14 ` Boqun Feng
2025-06-26 23:33 ` Benno Lossin
2025-06-26 23:53 ` Danilo Krummrich
2025-06-27 9:01 ` Benno Lossin
2025-06-27 19:59 ` Benno Lossin
2025-06-26 20:00 ` [PATCH v4 4/5] rust: types: ForeignOwnable: Add type Target Danilo Krummrich
2025-06-26 20:20 ` Boqun Feng
2025-06-26 23:17 ` Benno Lossin
2025-06-26 23:21 ` Boqun Feng
2025-06-26 23:36 ` Benno Lossin
2025-06-26 23:45 ` Boqun Feng
2025-06-26 23:55 ` Boqun Feng
2025-06-27 9:05 ` Benno Lossin
2025-06-26 23:22 ` Benno Lossin
2025-06-27 19:53 ` Miguel Ojeda
2025-07-01 11:49 ` Alice Ryhl
2025-06-26 20:00 ` [PATCH v4 5/5] rust: devres: implement register_release() Danilo Krummrich
2025-06-26 20:37 ` Boqun Feng
2025-06-26 20:48 ` Danilo Krummrich
2025-06-26 21:16 ` Boqun Feng
2025-06-26 21:20 ` Danilo Krummrich
2025-06-26 21:21 ` Boqun Feng
2025-06-26 23:19 ` Benno Lossin
2025-06-27 22:06 ` Boqun Feng
2025-06-28 6:06 ` Benno Lossin
2025-06-28 6:38 ` Boqun Feng
2025-06-28 7:53 ` Benno Lossin [this message]
2025-06-28 9:58 ` Danilo Krummrich
2025-06-28 12:13 ` Benno Lossin
2025-06-28 12:32 ` Danilo Krummrich
2025-06-29 15:11 ` [PATCH v4 0/5] Improvements for Devres Danilo Krummrich
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=DAY059Y669BX.2GVKH6RBG80B6@kernel.org \
--to=lossin@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=bhelgaas@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=dakr@kernel.org \
--cc=david.m.ertman@intel.com \
--cc=gary@garyguo.net \
--cc=gregkh@linuxfoundation.org \
--cc=ira.weiny@intel.com \
--cc=kwilczynski@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=ojeda@kernel.org \
--cc=rafael@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--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.