From: "Benno Lossin" <lossin@kernel.org>
To: "Danilo Krummrich" <dakr@kernel.org>
Cc: <gregkh@linuxfoundation.org>, <rafael@kernel.org>,
<ojeda@kernel.org>, <alex.gaynor@gmail.com>,
<boqun.feng@gmail.com>, <gary@garyguo.net>,
<bjorn3_gh@protonmail.com>, <benno.lossin@proton.me>,
<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 2/8] rust: device: add drvdata accessors
Date: Sat, 05 Jul 2025 23:38:04 +0200 [thread overview]
Message-ID: <DB4G2QJ8LA5W.384ECLNXUM0CY@kernel.org> (raw)
In-Reply-To: <aGk_YBCGqrO-A6bG@cassiopeiae>
On Sat Jul 5, 2025 at 5:06 PM CEST, Danilo Krummrich wrote:
> On Sat, Jul 05, 2025 at 01:15:06PM +0200, Benno Lossin wrote:
>> On Sat Jun 21, 2025 at 9:43 PM CEST, Danilo Krummrich wrote:
>> > +impl Device<Internal> {
>> > + /// Store a pointer to the bound driver's private data.
>> > + pub fn set_drvdata(&self, data: impl ForeignOwnable) {
>> > + // SAFETY: By the type invariants, `self.as_raw()` is a valid pointer to a `struct device`.
>> > + unsafe { bindings::dev_set_drvdata(self.as_raw(), data.into_foreign().cast()) }
>> > + }
>> > +
>> > + /// Take ownership of the private data stored in this [`Device`].
>> > + ///
>> > + /// # Safety
>> > + ///
>> > + /// - Must only be called once after a preceding call to [`Device::set_drvdata`].
>> > + /// - The type `T` must match the type of the `ForeignOwnable` previously stored by
>> > + /// [`Device::set_drvdata`].
>> > + pub unsafe fn drvdata_obtain<T: ForeignOwnable>(&self) -> T {
>> > + // SAFETY: By the type invariants, `self.as_raw()` is a valid pointer to a `struct device`.
>> > + let ptr = unsafe { bindings::dev_get_drvdata(self.as_raw()) };
>> > +
>> > + // SAFETY: By the safety requirements of this function, `ptr` comes from a previous call to
>> > + // `into_foreign()`.
>>
>> Well, you're also relying on `dev_get_drvdata` to return the same
>> pointer that was given to `dev_set_drvdata`.
>>
>> Otherwise the safety docs look fine.
>
> Great! What do you think about:
>
> diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs
> index 146eba147d2f..b01cb8e8dab3 100644
> --- a/rust/kernel/device.rs
> +++ b/rust/kernel/device.rs
> @@ -80,8 +80,11 @@ pub unsafe fn drvdata_obtain<T: ForeignOwnable>(&self) -> T {
> // SAFETY: By the type invariants, `self.as_raw()` is a valid pointer to a `struct device`.
> let ptr = unsafe { bindings::dev_get_drvdata(self.as_raw()) };
>
> - // SAFETY: By the safety requirements of this function, `ptr` comes from a previous call to
> - // `into_foreign()`.
> + // SAFETY:
> + // - By the safety requirements of this function, `ptr` comes from a previous call to
> + // `into_foreign()`.
> + // - `dev_get_drvdata()` guarantees to return the same pointer given to `dev_set_drvdata()`
> + // in `into_foreign()`.
Looks good, though I haven't done a full review, but you can have my:
Acked-by: Benno Lossin <lossin@kernel.org>
---
Cheers,
Benno
> unsafe { T::from_foreign(ptr.cast()) }
> }
next prev parent reply other threads:[~2025-07-05 21:38 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-21 19:43 [PATCH 0/8] Device: generic accessors for drvdata + Driver::unbind() Danilo Krummrich
2025-06-21 19:43 ` [PATCH 1/8] rust: device: introduce device::Internal Danilo Krummrich
2025-07-01 9:26 ` Greg KH
2025-07-01 10:41 ` Danilo Krummrich
2025-07-01 12:32 ` Danilo Krummrich
2025-07-03 15:06 ` Greg KH
2025-06-21 19:43 ` [PATCH 2/8] rust: device: add drvdata accessors Danilo Krummrich
2025-07-01 9:27 ` Greg KH
2025-07-01 10:58 ` Danilo Krummrich
2025-07-01 13:12 ` Danilo Krummrich
2025-07-05 11:15 ` Benno Lossin
2025-07-05 15:06 ` Danilo Krummrich
2025-07-05 21:38 ` Benno Lossin [this message]
2025-07-07 7:46 ` Alexandre Courbot
2025-07-07 9:40 ` Danilo Krummrich
2025-06-21 19:43 ` [PATCH 3/8] rust: platform: use generic device " Danilo Krummrich
2025-06-21 19:43 ` [PATCH 4/8] rust: pci: " Danilo Krummrich
2025-07-01 9:30 ` Greg KH
2025-06-21 19:43 ` [PATCH 5/8] rust: auxiliary: " Danilo Krummrich
2025-06-21 19:43 ` [PATCH 6/8] rust: platform: implement Driver::unbind() Danilo Krummrich
2025-06-21 19:43 ` [PATCH 7/8] rust: pci: " Danilo Krummrich
2025-06-21 19:43 ` [PATCH 8/8] samples: rust: pci: reset pci-testdev in unbind() Danilo Krummrich
2025-07-01 9:25 ` [PATCH 0/8] Device: generic accessors for drvdata + Driver::unbind() Greg KH
2025-07-01 10:40 ` Danilo Krummrich
2025-07-07 7:18 ` Alexandre Courbot
2025-07-07 9:26 ` Danilo Krummrich
2025-07-08 22:25 ` 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=DB4G2QJ8LA5W.384ECLNXUM0CY@kernel.org \
--to=lossin@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=benno.lossin@proton.me \
--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.