From: Greg KH <gregkh@linuxfoundation.org>
To: Danilo Krummrich <dakr@redhat.com>
Cc: rafael@kernel.org, bhelgaas@google.com, ojeda@kernel.org,
alex.gaynor@gmail.com, wedsonaf@gmail.com, boqun.feng@gmail.com,
gary@garyguo.net, bjorn3_gh@protonmail.com,
benno.lossin@proton.me, a.hindborg@samsung.com,
aliceryhl@google.com, airlied@gmail.com,
fujita.tomonori@gmail.com, lina@asahilina.net,
pstanner@redhat.com, ajanulgu@redhat.com, lyude@redhat.com,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-pci@vger.kernel.org
Subject: Re: [RFC PATCH 01/11] rust: add abstraction for struct device
Date: Mon, 20 May 2024 20:00:23 +0200 [thread overview]
Message-ID: <2024052038-deviancy-criteria-e4fe@gregkh> (raw)
In-Reply-To: <20240520172554.182094-2-dakr@redhat.com>
On Mon, May 20, 2024 at 07:25:38PM +0200, Danilo Krummrich wrote:
> Add an (always) reference counted abstraction for a generic struct
> device. This abstraction encapsulates existing struct device instances
> and manages its reference count.
>
> Subsystems may use this abstraction as a base to abstract subsystem
> specific device instances based on a generic struct device.
>
> Co-developed-by: Wedson Almeida Filho <wedsonaf@gmail.com>
> Signed-off-by: Wedson Almeida Filho <wedsonaf@gmail.com>
> Signed-off-by: Danilo Krummrich <dakr@redhat.com>
> ---
> rust/helpers.c | 1 +
> rust/kernel/device.rs | 76 +++++++++++++++++++++++++++++++++++++++++++
What's the status of moving .rs files next to their respective .c files
in the build system? Keeping them separate like this just isn't going
to work, sorry.
> --- /dev/null
> +++ b/rust/kernel/device.rs
> @@ -0,0 +1,76 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +//! Generic devices that are part of the kernel's driver model.
> +//!
> +//! C header: [`include/linux/device.h`](../../../../include/linux/device.h)
relative paths for a common "include <linux/device.h" type of thing?
Rust can't handle include paths from directories?
> +
> +use crate::{
> + bindings,
> + types::{ARef, Opaque},
> +};
> +use core::ptr;
> +
> +/// A ref-counted device.
> +///
> +/// # Invariants
> +///
> +/// The pointer stored in `Self` is non-null and valid for the lifetime of the ARef instance. In
> +/// particular, the ARef instance owns an increment on underlying object’s reference count.
> +#[repr(transparent)]
> +pub struct Device(Opaque<bindings::device>);
> +
> +impl Device {
> + /// Creates a new ref-counted instance of an existing device pointer.
> + ///
> + /// # Safety
> + ///
> + /// Callers must ensure that `ptr` is valid, non-null, and has a non-zero reference count.
Callers NEVER care about the reference count of a struct device, anyone
poking in that is asking for trouble.
And why non-NULL? Can't you check for that here? Shouldn't you check
for that here? Many driver core functions can handle a NULL pointer
just fine (i.e. get/put_device() can), why should Rust code assume that
a pointer passed to it from the C layer is going to have stricter rules
than the C layer can provide?
> + pub unsafe fn from_raw(ptr: *mut bindings::device) -> ARef<Self> {
> + // SAFETY: By the safety requirements, ptr is valid.
> + // Initially increase the reference count by one to compensate for the final decrement once
> + // this newly created `ARef<Device>` instance is dropped.
> + unsafe { bindings::get_device(ptr) };
> +
> + // CAST: `Self` is a `repr(transparent)` wrapper around `bindings::device`.
> + let ptr = ptr.cast::<Self>();
> +
> + // SAFETY: By the safety requirements, ptr is valid.
> + unsafe { ARef::from_raw(ptr::NonNull::new_unchecked(ptr)) }
> + }
> +
> + /// Obtain the raw `struct device *`.
> + pub(crate) fn as_raw(&self) -> *mut bindings::device {
> + self.0.get()
> + }
> +
> + /// Convert a raw `struct device` pointer to a `&Device`.
> + ///
> + /// # Safety
> + ///
> + /// Callers must ensure that `ptr` is valid, non-null, and has a non-zero reference count for
> + /// the entire duration when the returned reference exists.
Again, non-NULL might not be true, and reference counts are never
tracked by any user EXCEPT to increment/decrement it, you never know if
it is 0 or not, all you know is that if a pointer is given to you by the
driver core to a 'struct device' for a function that it is a valid
reference at that point in time, or maybe NULL, until your function
returns. Anything after that can not be counted on.
thanks,
greg k-h
next prev parent reply other threads:[~2024-05-20 18:00 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-20 17:25 [RFC PATCH 00/11] [RFC] Device / Driver and PCI Rust abstractions Danilo Krummrich
2024-05-20 17:25 ` [RFC PATCH 01/11] rust: add abstraction for struct device Danilo Krummrich
2024-05-20 18:00 ` Greg KH [this message]
2024-05-20 18:24 ` Miguel Ojeda
2024-05-20 20:22 ` Danilo Krummrich
2024-05-21 9:24 ` Greg KH
2024-05-21 20:42 ` Danilo Krummrich
2024-06-04 14:17 ` Greg KH
2024-06-04 16:23 ` Danilo Krummrich
2024-05-20 17:25 ` [RFC PATCH 02/11] rust: add driver abstraction Danilo Krummrich
2024-05-20 18:14 ` Greg KH
2024-05-20 22:30 ` Danilo Krummrich
2024-05-21 9:35 ` Greg KH
2024-05-21 9:59 ` Greg KH
2024-05-21 22:21 ` Danilo Krummrich
2024-06-04 14:27 ` Greg KH
2024-06-04 15:41 ` Danilo Krummrich
2024-06-04 16:00 ` Greg KH
2024-06-04 20:06 ` Danilo Krummrich
2024-05-21 5:42 ` Dave Airlie
2024-05-21 8:04 ` Greg KH
2024-05-21 22:42 ` Danilo Krummrich
2024-05-29 11:10 ` Dirk Behme
2024-05-30 5:58 ` Dirk Behme
2024-05-20 17:25 ` [RFC PATCH 03/11] rust: add rcu abstraction Danilo Krummrich
2024-05-20 17:25 ` [RFC PATCH 04/11] rust: add revocable mutex Danilo Krummrich
2024-05-20 17:25 ` [RFC PATCH 05/11] rust: add revocable objects Danilo Krummrich
2024-05-31 8:35 ` Dirk Behme
2024-05-20 17:25 ` [RFC PATCH 06/11] rust: add device::Data Danilo Krummrich
2024-05-20 17:25 ` [RFC PATCH 07/11] rust: add `dev_*` print macros Danilo Krummrich
2024-05-20 17:25 ` [RFC PATCH 08/11] rust: add devres abstraction Danilo Krummrich
2024-05-29 12:00 ` Dirk Behme
2024-06-03 7:20 ` Dirk Behme
2024-05-20 17:25 ` [RFC PATCH 09/11] rust: add basic PCI driver abstractions Danilo Krummrich
2024-05-20 17:25 ` [RFC PATCH 10/11] rust: add basic abstractions for iomem operations Danilo Krummrich
2024-05-20 22:32 ` Miguel Ojeda
2024-05-21 2:07 ` Dave Airlie
2024-05-21 3:01 ` Wedson Almeida Filho
2024-05-21 8:03 ` Philipp Stanner
2024-05-25 19:24 ` Wedson Almeida Filho
2024-05-21 2:59 ` Danilo Krummrich
2024-05-21 7:36 ` Philipp Stanner
2024-05-21 9:18 ` Miguel Ojeda
2024-05-21 18:36 ` Danilo Krummrich
2024-05-20 17:25 ` [RFC PATCH 11/11] rust: PCI: add BAR request and ioremap Danilo Krummrich
2024-05-20 23:27 ` Miguel Ojeda
2024-05-21 11:22 ` Danilo Krummrich
2024-05-20 18:14 ` [RFC PATCH 00/11] [RFC] Device / Driver and PCI Rust abstractions Greg KH
2024-05-20 18:16 ` Greg KH
2024-05-20 19:50 ` Danilo Krummrich
2024-05-21 9:21 ` Greg KH
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=2024052038-deviancy-criteria-e4fe@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=a.hindborg@samsung.com \
--cc=airlied@gmail.com \
--cc=ajanulgu@redhat.com \
--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@redhat.com \
--cc=fujita.tomonori@gmail.com \
--cc=gary@garyguo.net \
--cc=lina@asahilina.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lyude@redhat.com \
--cc=ojeda@kernel.org \
--cc=pstanner@redhat.com \
--cc=rafael@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=wedsonaf@gmail.com \
/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.