On 5/14/26 07:20, Danilo Krummrich wrote:
On Thu Mar 26, 2026 at 7:53 AM CET, Alvin Sun wrote:
Add name(), refcount(), is_imported(), is_exported(), and mmap_offset()
to BaseObject so drivers can expose GEM state in debugfs.
Signed-off-by: Alvin Sun <[email protected]>
---
rust/kernel/drm/gem/mod.rs | 49 +++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 46 insertions(+), 3 deletions(-)
diff --git a/rust/kernel/drm/gem/mod.rs b/rust/kernel/drm/gem/mod.rs
index 276ba3c53475d..b6188c8873ece 100644
--- a/rust/kernel/drm/gem/mod.rs
+++ b/rust/kernel/drm/gem/mod.rs
@@ -21,9 +21,13 @@
},
error::to_result,
prelude::*,
- sync::aref::{
- ARef,
- AlwaysRefCounted, //
+ sync::{
+ aref::{
+ ARef,
+ AlwaysRefCounted, //
+ },
+ atomic::Relaxed,
+ Refcount, //
},
types::Opaque,
};
@@ -177,6 +181,45 @@ fn size(&self) -> usize {
unsafe { (*self.as_raw()).size }
}
+ /// Returns the name of the object.
+ #[inline]
+ fn name(&self) -> i32 {
+ // SAFETY: `self.as_raw()` is guaranteed to be a pointer to a valid
`struct drm_gem_object`.
+ unsafe { (*self.as_raw()).name }
+ }
+
+ /// Returns the reference count of the object.
+ #[inline]
+ fn refcount(&self) -> u32 {
+ // SAFETY: `self.as_raw()` is guaranteed to be a pointer to a valid
`struct drm_gem_object`.
+ let raw_refcount = unsafe { &raw mut (*self.as_raw()).refcount
}.cast::<Refcount>();
+ // SAFETY: `raw_refcount` has the same layout as `Refcount`.
+ let refcount = unsafe { &*raw_refcount };
+
+ refcount.as_atomic().load(Relaxed) as u32
+ }
How is this reference count useful in debugfs? In any case, please don't expose
I'm just following the pattern of Panthor's debugfs output.
object reference counts, it motivates abuse.
Can't we just prove a common Debug impl for GEM objects instead of providing all
those accessors?
A generic Debug impl for GemObject? Other drivers like Nova might need
different
output in a different style.
How about a dedicated debugfs data structure for GEM Object instead? Say, a
get_debugfs_info() method that handles synchronization internally and avoids
exposing unnecessary interfaces?
+
+ /// Returns true if the object is imported.
+ #[inline]
+ fn is_imported(&self) -> bool {
+ // SAFETY: `self.as_raw()` is guaranteed to be a pointer to a valid
`struct drm_gem_object`.
+ !unsafe { (*self.as_raw()).import_attach }.is_null()
+ }
+
+ /// Returns true if the object is exported.
+ #[inline]
+ fn is_exported(&self) -> bool {
+ // SAFETY: `self.as_raw()` is guaranteed to be a pointer to a valid
`struct drm_gem_object`.
+ !unsafe { (*self.as_raw()).dma_buf }.is_null()
+ }
+
+ /// Returns the offset for mmap, or 0 if no offset has been allocated.
+ #[inline]
+ fn mmap_offset(&self) -> u64 {
+ // SAFETY: `self.as_raw()` is guaranteed to be a pointer to a valid
`struct drm_gem_object`.
+ unsafe { (*self.as_raw()).vma_node.vm_node.start }
+ }
+
/// Creates a new handle for the object associated with a given `File`
/// (or returns an existing one).
fn create_handle<D, F>(&self, file: &drm::File<F>) -> Result<u32>
--
2.43.0