GEM shmem objects imported through gem_prime_import_sg_table wrapping
drm_gem_shmem_prime_import_sg_table() do not own their SG table.
SGTableMap::drop() must not free it since it will be freed on exporter
side once the DMAbuf is not used anymore.
Fixes: 616c229ab010 ("rust: drm: gem: Introduce shmem::Object::sg_table()")
Cc: <[email protected]> # no in-tree users
Signed-off-by: Janne Grunau <[email protected]>
---
rust/kernel/drm/gem/shmem.rs | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/rust/kernel/drm/gem/shmem.rs b/rust/kernel/drm/gem/shmem.rs
index 1df3554893cc..d0f89ad2202f 100644
--- a/rust/kernel/drm/gem/shmem.rs
+++ b/rust/kernel/drm/gem/shmem.rs
@@ -596,9 +596,13 @@ impl<T: DriverObject> Drop for SGTableMap<T> {
fn drop(&mut self) {
// SAFETY: `obj` is always valid via our type invariants
let obj = unsafe { self.obj.as_ref() };
+ if obj.is_imported() {
+ return;
+ }
let _lock = DmaResvGuard::new(obj);
// SAFETY: We acquired the lock needed for calling this function above
+ // and the GEM object is not imported.
unsafe { bindings::__drm_gem_shmem_free_sgt_locked(obj.as_raw_shmem())
};
}
}
--
2.56.0