From: Danilo Krummrich <dakr@kernel.org>
To: Christian Schrefl <chrisi.schrefl@gmail.com>
Cc: "Miguel Ojeda" <ojeda@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>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Arnd Bergmann" <arnd@arndb.de>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Lee Jones" <lee@kernel.org>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Gerald Wisböck" <gerald.wisboeck@feather.ink>,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 1/2] rust: miscdevice: add additional data to MiscDeviceRegistration
Date: Sat, 17 May 2025 15:42:29 +0200 [thread overview]
Message-ID: <aCiSRZjOETsD8MhX@pollux> (raw)
In-Reply-To: <20250517-b4-rust_miscdevice_registrationdata-v3-1-cdb33e228d37@gmail.com>
On Sat, May 17, 2025 at 01:33:49PM +0200, Christian Schrefl wrote:
> +pub struct MiscDeviceRegistration<T: MiscDevice> {
> #[pin]
> inner: Opaque<bindings::miscdevice>,
> + #[pin]
> + data: UnsafePinned<T::RegistrationData>,
> _t: PhantomData<T>,
> }
I recommend not to store data within a Registration type itself.
I know that this is designed with the focus on using misc device directly from
the module scope; and in this context it works great.
However, it becomes quite suboptimal when used from a driver scope. For
instance, if the misc device is registered within a platform driver's probe()
function.
I know this probably isn't supported yet. At least, I assume it isn't supported
"officially", given that the abstraction does not provide an option to set a
parent device. Yet I think we should consider it.
The reason this is suboptimal is that, from the callbacks of a misc device we
may want to access device resources from the platform device.
Since device resources have to be protected with Devres, we'd need to access
them with Revocable::try_access_with() for instance.
However, it would be much better if we had proof that the parent device of the
misc device (i.e. the platform device) is bound (i.e. provide a &Device<Bound>)
and hence are able to access device resources directly.
The only way to prove this, is to prove that the misc device registration is
guaranteed to be removed when the parent device (i.e. the platform driver) is
unbound.
And this we can only prove if we wrap MiscDeviceRegistration itself in a
Devres; we don't want MiscDeviceRegistration to out-live the driver it was
registered by anyways, so that's a free optimization.
If the data above is stored directly in the MiscDeviceRegistration however it
means that we can only access it through a Devres<MiscDeviceRegistration>, which
would be annoying.
To be fair, storing data in MiscDeviceRegistration is not the main issue of why
this is suboptimal in driver, but it adds to the problem.
In general, the design of MiscDeviceRegistration is a bit suboptimal to be used
within drivers. For drivers it works much better when the Registration type
really *only* represents the state of a thing being registered, such that we can
guard it with Devres *without* any downsides or additional complexity. One
example for that would be the drm::driver::Registration [1].
If we want misc device to work optimally with drivers as well, we need to split
things in two types: `misc::Device`:
struct Device<T: MiscDevice> {
#[pin]
misc: Opaque<bindings::miscdevice>,
#[pin]
data: UnsafePinned<T::RegistrationData>,
_t: PhantomData<T>,
}
and `misc::Registration`:
struct Registration(ARef<misc::Device>);
and make the `misc::Device` own the data, not the `misc::Registration`.
This way we can wrap misc::Registration into a Devres, with all guarantees it
gives us and an no downsides.
I'm not saying that I want to block this patch, especially given that using the
misc device abstraction doesn't seem to be supported to be used from drivers,
but please understand that the design of the misc device abstraction, while it
works fine for the module scope, really is sub-optimal for the use within
drivers and hence should be re-worked.
Can we please either do the re-work right away or add a proper TODO?
[1] https://gitlab.freedesktop.org/drm/nova/-/blob/nova-next/rust/kernel/drm/driver.rs?ref_type=heads#L121
next prev parent reply other threads:[~2025-05-17 13:42 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-17 11:33 [PATCH v3 0/2] rust: miscdevice: add additional data to MiscDeviceRegistration Christian Schrefl
2025-05-17 11:33 ` [PATCH v3 1/2] " Christian Schrefl
2025-05-17 13:42 ` Danilo Krummrich [this message]
2025-05-19 18:16 ` Boqun Feng
2025-05-21 11:55 ` Greg Kroah-Hartman
2025-05-21 12:04 ` Greg Kroah-Hartman
2025-05-21 12:16 ` Christian Schrefl
2025-05-21 13:00 ` Greg Kroah-Hartman
2025-05-21 23:01 ` Alice Ryhl
2025-05-21 14:12 ` Danilo Krummrich
2025-05-21 14:41 ` Christian Schrefl
2025-05-17 11:33 ` [PATCH v3 2/2] rust: miscdevice: adjust the rust_misc_device sample to use RegistrationData Christian Schrefl
2025-05-19 18:06 ` [PATCH v3 0/2] rust: miscdevice: add additional data to MiscDeviceRegistration Alice Ryhl
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=aCiSRZjOETsD8MhX@pollux \
--to=dakr@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=arnd@arndb.de \
--cc=benno.lossin@proton.me \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=chrisi.schrefl@gmail.com \
--cc=daniel.almeida@collabora.com \
--cc=gary@garyguo.net \
--cc=gerald.wisboeck@feather.ink \
--cc=gregkh@linuxfoundation.org \
--cc=lee@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ojeda@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).