From: Lyude Paul <lyude@redhat.com>
To: dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org,
linux-kernel@vger.kernel.org
Cc: "David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"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>,
"Danilo Krummrich" <dakr@kernel.org>,
"Asahi Lina" <lina@asahilina.net>,
"Daniel Almeida" <daniel.almeida@collabora.com>
Subject: [PATCH v2 09/12] rust: drm: gem: Introduce OwnedSGTable
Date: Wed, 21 May 2025 16:29:16 -0400 [thread overview]
Message-ID: <20250521204654.1610607-10-lyude@redhat.com> (raw)
In-Reply-To: <20250521204654.1610607-1-lyude@redhat.com>
Currently we expose the ability to retrieve an SGTable for an shmem gem
object using gem::shmem::Object::<T>::sg_table(). However, this only gives us a
borrowed reference. This being said - retrieving an SGTable is a fallible
operation, and as such it's reasonable that a driver may want to hold
onto an SGTable for longer then a reference would allow in order to avoid
having to deal with fallibility every time they want to access the SGTable.
One such driver with this usecase is the Asahi driver.
So to support this, let's introduce OwnedSGTable - which both holds a
pointer to the SGTable and a reference to its respective GEM object in
order to keep the GEM object alive for as long as the OwnedSGTable. The
type can be used identically to a normal SGTable.
Signed-off-by: Lyude Paul <lyude@redhat.com>
---
rust/kernel/drm/gem/shmem.rs | 29 +++++++++++++++++++++--------
1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/rust/kernel/drm/gem/shmem.rs b/rust/kernel/drm/gem/shmem.rs
index c38fca715429e..bff038df93334 100644
--- a/rust/kernel/drm/gem/shmem.rs
+++ b/rust/kernel/drm/gem/shmem.rs
@@ -20,7 +20,7 @@
prelude::*,
types::{ARef, Opaque},
container_of,
- scatterlist,
+ scatterlist::SGTable,
};
use core::{
mem::MaybeUninit,
@@ -172,23 +172,36 @@ extern "C" fn free_callback(obj: *mut bindings::drm_gem_object) {
let _ = unsafe { KBox::from_raw(this) };
}
- /// Creates (if necessary) and returns a scatter-gather table of DMA pages for this object.
+ /// Creates (if necessary) and returns an immutable reference to a scatter-gather table of DMA
+ /// pages for this object.
///
/// This will pin the object in memory.
- pub fn sg_table(&self) -> Result<SGTable<T>> {
+ #[inline]
+ pub fn sg_table(&self) -> Result<&SGTable> {
// SAFETY:
// - drm_gem_shmem_get_pages_sgt is thread-safe.
// - drm_gem_shmem_get_pages_sgt returns either a valid pointer to a scatterlist, or an
// error pointer.
let sgt = from_err_ptr(unsafe { bindings::drm_gem_shmem_get_pages_sgt(self.as_shmem()) })?;
- Ok(SGTable {
- // SAFETY: We checked that `sgt` is not an error pointer, so it must be a valid pointer
- // to a scatterlist.
- sgt: NonNull::from(unsafe { scatterlist::SGTable::as_ref(sgt) }),
+ // SAFETY: We checked above that `sgt` is not an error pointer, so it must be a valid
+ // pointer to a scatterlist
+ Ok(unsafe { SGTable::as_ref(sgt) })
+ }
+
+ /// Creates (if necessary) and returns an owned scatter-gather table of DMA pages for this
+ /// object.
+ ///
+ /// This is the same as [`sg_table`](Self::sg_table), except that it instead returns a
+ /// [`OwnedSGTable`] which holds a reference to the associated gem object.
+ ///
+ /// This will pin the object in memory.
+ pub fn owned_sg_table(&self) -> Result<OwnedSGTable<T>> {
+ Ok(OwnedSGTable {
+ sgt: self.sg_table()?.into(),
// INVARIANT: We take an owned refcount to `self` here, ensuring that `sgt` remains
// valid for as long as this `OwnedSGTable`.
- _owner: self.into()
+ _owner: self.into(),
})
}
--
2.49.0
next prev parent reply other threads:[~2025-05-21 20:48 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-21 20:29 [PATCH v2 00/12] Rust abstractions for shmem-backed GEM objects Lyude Paul
2025-05-21 20:29 ` [PATCH v2 01/12] rust: helpers: Add bindings/wrappers for dma_resv_lock Lyude Paul
2025-05-22 8:44 ` Christian König
2025-05-22 15:03 ` Daniel Almeida
2025-05-21 20:29 ` [PATCH v2 02/12] rust: drm: gem: Add raw_dma_resv() function Lyude Paul
2025-05-21 20:29 ` [PATCH v2 03/12] drm/gem/shmem: Extract drm_gem_shmem_init() from drm_gem_shmem_create() Lyude Paul
2025-05-21 20:29 ` [PATCH v2 04/12] drm/gem/shmem: Extract drm_gem_shmem_release() from drm_gem_shmem_free() Lyude Paul
2025-05-21 20:29 ` [PATCH v2 05/12] rust: gem: Introduce BaseDriverObject::Args Lyude Paul
2025-05-21 20:29 ` [PATCH v2 06/12] rust: drm: gem: Add OpaqueObject Lyude Paul
2025-05-21 20:29 ` [PATCH v2 07/12] rust: drm: gem: shmem: Add DRM shmem helper abstraction Lyude Paul
2025-05-21 20:29 ` [PATCH v2 08/12] rust: drm: gem: shmem: Add share_dma_resv to ObjectConfig Lyude Paul
2025-05-21 20:29 ` Lyude Paul [this message]
2025-05-21 20:29 ` [PATCH v2 10/12] rust: Add dma_buf stub bindings Lyude Paul
2025-05-21 20:29 ` [PATCH v2 11/12] rust: drm: gem: Add export() callback Lyude Paul
2025-05-21 20:29 ` [PATCH v2 12/12] rust: drm: gem: Add BaseObject::prime_export() Lyude Paul
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=20250521204654.1610607-10-lyude@redhat.com \
--to=lyude@redhat.com \
--cc=a.hindborg@kernel.org \
--cc=airlied@gmail.com \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--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=dri-devel@lists.freedesktop.org \
--cc=gary@garyguo.net \
--cc=lina@asahilina.net \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=simona@ffwll.ch \
--cc=tmgross@umich.edu \
--cc=tzimmermann@suse.de \
/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
all inboxes | Powered by JetHome®