[PATCH 6/7] rust: drm: gem: Add set_exportable() method

From: Daniel Almeida
Date: Tue Mar 18 2025 - 15:26:30 EST


From: Asahi Lina <lina@xxxxxxxxxxxxx>

This allows drivers to control whether a given GEM object is allowed to
be exported via PRIME to other drivers.

Signed-off-by: Asahi Lina <lina@xxxxxxxxxxxxx>
Signed-off-by: Daniel Almeida <daniel.almeida@xxxxxxxxxxxxx>
---
rust/kernel/drm/gem/mod.rs | 13 +++++++++++++
rust/kernel/drm/gem/shmem.rs | 4 ++++
2 files changed, 17 insertions(+)

diff --git a/rust/kernel/drm/gem/mod.rs b/rust/kernel/drm/gem/mod.rs
index 083faac8602885aee5ef213bb3302b79dfac4a95..3a7e9f80b414bf39301e342938ba33877bfac2cb 100644
--- a/rust/kernel/drm/gem/mod.rs
+++ b/rust/kernel/drm/gem/mod.rs
@@ -45,6 +45,10 @@ pub trait IntoGEMObject: Sized + crate::private::Sealed {
/// this owning object is valid.
fn gem_obj(&self) -> &bindings::drm_gem_object;

+ /// Returns a reference to the raw `drm_gem_object` structure, which must be valid as long as
+ /// this owning object is valid.
+ fn mut_gem_obj(&mut self) -> &mut bindings::drm_gem_object;
+
/// Converts a pointer to a `drm_gem_object` into a pointer to this type.
fn from_gem_obj(obj: *mut bindings::drm_gem_object) -> *mut Self;
}
@@ -119,6 +123,10 @@ fn gem_obj(&self) -> &bindings::drm_gem_object {
&self.obj
}

+ fn mut_gem_obj(&mut self) -> &mut bindings::drm_gem_object {
+ &mut self.obj
+ }
+
fn from_gem_obj(obj: *mut bindings::drm_gem_object) -> *mut Object<T> {
// SAFETY: All of our objects are Object<T>.
unsafe { crate::container_of!(obj, Object<T>, obj) as *mut Object<T> }
@@ -132,6 +140,11 @@ fn size(&self) -> usize {
self.gem_obj().size
}

+ /// Sets the exportable flag, which controls whether the object can be exported via PRIME.
+ fn set_exportable(&mut self, exportable: bool) {
+ self.mut_gem_obj().exportable = exportable;
+ }
+
/// Creates a new reference to the object.
fn reference(&self) -> ObjectRef<Self> {
// SAFETY: Having a reference to an Object implies holding a GEM reference
diff --git a/rust/kernel/drm/gem/shmem.rs b/rust/kernel/drm/gem/shmem.rs
index cd080d820727fb39cb91cb0617df39310b5b68c8..fdf7dd7f2408bd2857f5b72027ef48e29c9dd9e3 100644
--- a/rust/kernel/drm/gem/shmem.rs
+++ b/rust/kernel/drm/gem/shmem.rs
@@ -261,6 +261,10 @@ fn gem_obj(&self) -> &bindings::drm_gem_object {
&self.obj.base
}

+ fn mut_gem_obj(&mut self) -> &mut bindings::drm_gem_object {
+ &mut self.obj.base
+ }
+
fn from_gem_obj(obj: *mut bindings::drm_gem_object) -> *mut Object<T> {
// SAFETY: The invariant guarantees this is correct.
unsafe {

--
2.48.1