drm_gem_is_prime_exported_dma_buf() is a bool predicate that open-codes
the core PRIME self-import check. Its only caller, the shmem importer,
then repeats the dma_buf->priv lookup and the reference get.

Replace it with drm_gem_prime_dma_buf_to_gem(), a thin wrapper around
drm_gem_prime_self_import() that returns the backing GEM object -- with
a reference taken -- for a core-PRIME self-export, or NULL otherwise.
This consolidates self-import handling onto drm_gem_prime_self_import()
and lets drm_gem_shmem_prime_import_no_map() reuse the object directly.

Unlike the removed predicate, the helper takes a reference on the
returned object; the sole caller already wanted the referenced object.

Assisted-by: GitHub-Copilot:claude-opus-4.8
Signed-off-by: Niranjana Vishwanathapura <[email protected]>
---
 drivers/gpu/drm/drm_gem_shmem_helper.c | 14 ++++++--------
 drivers/gpu/drm/drm_prime.c            | 26 +++++++++++++++-----------
 include/drm/drm_prime.h                |  4 ++--
 3 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c 
b/drivers/gpu/drm/drm_gem_shmem_helper.c
index d654a22a30de..a0e161f2333e 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -954,15 +954,13 @@ struct drm_gem_object 
*drm_gem_shmem_prime_import_no_map(struct drm_device *dev,
        size_t size;
        int ret;
 
-       if (drm_gem_is_prime_exported_dma_buf(dev, dma_buf)) {
-               /*
-                * Importing dmabuf exported from our own gem increases
-                * refcount on gem itself instead of f_count of dmabuf.
-                */
-               obj = dma_buf->priv;
-               drm_gem_object_get(obj);
+       /*
+        * Importing a dmabuf exported from our own gem increases the refcount
+        * on the gem itself instead of the f_count of the dmabuf.
+        */
+       obj = drm_gem_prime_dma_buf_to_gem(dev, dma_buf);
+       if (obj)
                return obj;
-       }
 
        attach = dma_buf_attach(dma_buf, dev->dev);
        if (IS_ERR(attach))
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 588910c250b8..275c5661528d 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -933,23 +933,27 @@ EXPORT_SYMBOL(drm_gem_prime_export);
 
 
 /**
- * drm_gem_is_prime_exported_dma_buf -
- * checks if the DMA-BUF was exported from a GEM object belonging to @dev.
+ * drm_gem_prime_dma_buf_to_gem - GEM object backing a self-exported PRIME 
dma-buf
  * @dev: drm_device to check against
  * @dma_buf: dma-buf object to import
  *
- * Return: true if the DMA-BUF was exported from a GEM object belonging
- * to @dev, false otherwise.
+ * If @dma_buf is a PRIME export of a GEM object that belongs to @dev and uses
+ * the core PRIME dma-buf ops, return that GEM object with an extra reference
+ * taken, so a self-import reuses the GEM object instead of referencing the
+ * dma-buf file. Returns NULL for a foreign dma-buf or one using driver-private
+ * ops; such drivers call drm_gem_prime_self_import() with their own ops.
+ *
+ * The returned object carries a reference the caller must drop with
+ * drm_gem_object_put().
+ *
+ * Return: the referenced GEM object on self-import, or NULL otherwise.
  */
-
-bool drm_gem_is_prime_exported_dma_buf(struct drm_device *dev,
-                                      struct dma_buf *dma_buf)
+struct drm_gem_object *drm_gem_prime_dma_buf_to_gem(struct drm_device *dev,
+                                                   struct dma_buf *dma_buf)
 {
-       struct drm_gem_object *obj = dma_buf->priv;
-
-       return (dma_buf->ops == &drm_gem_prime_dmabuf_ops) && (obj->dev == dev);
+       return drm_gem_prime_self_import(dev, dma_buf, 
&drm_gem_prime_dmabuf_ops);
 }
-EXPORT_SYMBOL(drm_gem_is_prime_exported_dma_buf);
+EXPORT_SYMBOL(drm_gem_prime_dma_buf_to_gem);
 
 /**
  * drm_gem_prime_import_dev - core implementation of the import callback
diff --git a/include/drm/drm_prime.h b/include/drm/drm_prime.h
index d378404f8ab4..02665205aed1 100644
--- a/include/drm/drm_prime.h
+++ b/include/drm/drm_prime.h
@@ -101,8 +101,8 @@ struct dma_buf *drm_gem_prime_export(struct drm_gem_object 
*obj,
 unsigned long drm_prime_get_contiguous_size(struct sg_table *sgt);
 
 /* helper functions for importing */
-bool drm_gem_is_prime_exported_dma_buf(struct drm_device *dev,
-                                      struct dma_buf *dma_buf);
+struct drm_gem_object *drm_gem_prime_dma_buf_to_gem(struct drm_device *dev,
+                                                   struct dma_buf *dma_buf);
 
 struct drm_gem_object *drm_gem_prime_import_dev(struct drm_device *dev,
                                                struct dma_buf *dma_buf,
-- 
2.43.0

Reply via email to