Hi

Am 22.09.25 um 10:34 schrieb Christian König:
On 19.09.25 17:54, Melissa Wen wrote:
This reverts commit 5307dce878d4126e1b375587318955bd019c3741.

We've already reverted all other commits related to dma_bug handling and
there is still something wrong with this approach that does not allow
unloading a driver. By reverting this commit, we'd just go back ot the
old behavior.
I don't think we want to do this.

Keeping the backing store alive for DMA-bufs while they are used for scanout is 
actually a really important bug fix.

That bug has rarely seen seen in practice. At least I'm not aware of any such report. And it's also just half of the fix IIRC. Not being able to unload the module is a regression OTOH. I'd rather go back to the old status quo than now having to deal with two problems.

Best regards
Thomas


Regards,
Christian.

Signed-off-by: Melissa Wen <m...@igalia.com>
---
  drivers/gpu/drm/drm_gem.c                    | 44 ++------------------
  drivers/gpu/drm/drm_gem_framebuffer_helper.c | 16 ++++---
  drivers/gpu/drm/drm_internal.h               |  2 -
  3 files changed, 11 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 09f80a84d61a..12efc04fb896 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -213,35 +213,6 @@ void drm_gem_private_object_fini(struct drm_gem_object 
*obj)
  }
  EXPORT_SYMBOL(drm_gem_private_object_fini);
-static void drm_gem_object_handle_get(struct drm_gem_object *obj)
-{
-       struct drm_device *dev = obj->dev;
-
-       drm_WARN_ON(dev, !mutex_is_locked(&dev->object_name_lock));
-
-       if (obj->handle_count++ == 0)
-               drm_gem_object_get(obj);
-}
-
-/**
- * drm_gem_object_handle_get_unlocked - acquire reference on user-space handles
- * @obj: GEM object
- *
- * Acquires a reference on the GEM buffer object's handle. Required
- * to keep the GEM object alive. Call drm_gem_object_handle_put_unlocked()
- * to release the reference.
- */
-void drm_gem_object_handle_get_unlocked(struct drm_gem_object *obj)
-{
-       struct drm_device *dev = obj->dev;
-
-       guard(mutex)(&dev->object_name_lock);
-
-       drm_WARN_ON(dev, !obj->handle_count); /* first ref taken in create-tail 
helper */
-       drm_gem_object_handle_get(obj);
-}
-EXPORT_SYMBOL(drm_gem_object_handle_get_unlocked);
-
  /**
   * drm_gem_object_handle_free - release resources bound to userspace handles
   * @obj: GEM object to clean up.
@@ -272,14 +243,8 @@ static void drm_gem_object_exported_dma_buf_free(struct 
drm_gem_object *obj)
        }
  }
-/**
- * drm_gem_object_handle_put_unlocked - releases reference on user-space 
handles
- * @obj: GEM object
- *
- * Releases a reference on the GEM buffer object's handle. Possibly releases
- * the GEM buffer object and associated dma-buf objects.
- */
-void drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj)
+static void
+drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj)
  {
        struct drm_device *dev = obj->dev;
        bool final = false;
@@ -304,7 +269,6 @@ void drm_gem_object_handle_put_unlocked(struct 
drm_gem_object *obj)
        if (final)
                drm_gem_object_put(obj);
  }
-EXPORT_SYMBOL(drm_gem_object_handle_put_unlocked);
/*
   * Called at device or object close to release the file's
@@ -434,8 +398,8 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
        int ret;
WARN_ON(!mutex_is_locked(&dev->object_name_lock));
-
-       drm_gem_object_handle_get(obj);
+       if (obj->handle_count++ == 0)
+               drm_gem_object_get(obj);
/*
         * Get the user-visible handle using idr.  Preload and perform
diff --git a/drivers/gpu/drm/drm_gem_framebuffer_helper.c 
b/drivers/gpu/drm/drm_gem_framebuffer_helper.c
index e364fa36ee36..4bc89d33df59 100644
--- a/drivers/gpu/drm/drm_gem_framebuffer_helper.c
+++ b/drivers/gpu/drm/drm_gem_framebuffer_helper.c
@@ -101,7 +101,7 @@ void drm_gem_fb_destroy(struct drm_framebuffer *fb)
        unsigned int i;
for (i = 0; i < fb->format->num_planes; i++)
-               drm_gem_object_handle_put_unlocked(fb->obj[i]);
+               drm_gem_object_put(fb->obj[i]);
drm_framebuffer_cleanup(fb);
        kfree(fb);
@@ -179,10 +179,8 @@ int drm_gem_fb_init_with_funcs(struct drm_device *dev,
                if (!objs[i]) {
                        drm_dbg_kms(dev, "Failed to lookup GEM object\n");
                        ret = -ENOENT;
-                       goto err_gem_object_handle_put_unlocked;
+                       goto err_gem_object_put;
                }
-               drm_gem_object_handle_get_unlocked(objs[i]);
-               drm_gem_object_put(objs[i]);
min_size = (height - 1) * mode_cmd->pitches[i]
                         + drm_format_info_min_pitch(info, i, width)
@@ -192,22 +190,22 @@ int drm_gem_fb_init_with_funcs(struct drm_device *dev,
                        drm_dbg_kms(dev,
                                    "GEM object size (%zu) smaller than minimum size 
(%u) for plane %d\n",
                                    objs[i]->size, min_size, i);
-                       drm_gem_object_handle_put_unlocked(objs[i]);
+                       drm_gem_object_put(objs[i]);
                        ret = -EINVAL;
-                       goto err_gem_object_handle_put_unlocked;
+                       goto err_gem_object_put;
                }
        }
ret = drm_gem_fb_init(dev, fb, info, mode_cmd, objs, i, funcs);
        if (ret)
-               goto err_gem_object_handle_put_unlocked;
+               goto err_gem_object_put;
return 0; -err_gem_object_handle_put_unlocked:
+err_gem_object_put:
        while (i > 0) {
                --i;
-               drm_gem_object_handle_put_unlocked(objs[i]);
+               drm_gem_object_put(objs[i]);
        }
        return ret;
  }
diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index ec1bf58e5714..5265eac81077 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -163,8 +163,6 @@ void drm_sysfs_lease_event(struct drm_device *dev);
/* drm_gem.c */
  int drm_gem_init(struct drm_device *dev);
-void drm_gem_object_handle_get_unlocked(struct drm_gem_object *obj);
-void drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj);
  int drm_gem_handle_create_tail(struct drm_file *file_priv,
                               struct drm_gem_object *obj,
                               u32 *handlep);

--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


Reply via email to