From 6638888eeb5b3efdc611d9769d8ea752f4297a20 Mon Sep 17 00:00:00 2001 From: Jianqun Xu Date: Mon, 25 Apr 2022 20:17:36 +0800 Subject: [PATCH] drm/rockchip: use drm_gem_object_put to free object Descripted in drm_gem_object structure description: * Reference count of this object * * Please use drm_gem_object_get() to acquire and drm_gem_object_put_locked() * or drm_gem_object_put() to release a reference to a GEM * buffer object. */ struct kref refcount; It's better to release object by drm_gem_object_put. About the refcount for object of drm device, rockchip_gem_create_object -> refcount = 1 drm->driver->gem_prime_export -> refcount = 2 This patch will decrease a refcount from export, and decrease another one in rockchip_drm_direct_show_free_buffer: drm_gem_dmabuf_release -> refcount = 1 rockchip_drm_direct_show_free_buffer -> refcount = 0 Tested by rockchip_drm_self_test.c. Signed-off-by: Jianqun Xu Change-Id: I812770ed832d71121aab5212d62b96815cbe2d68 --- .../drm/rockchip/rockchip_drm_direct_show.c | 24 ++++++++++++------- drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_direct_show.c b/drivers/gpu/drm/rockchip/rockchip_drm_direct_show.c index a4799985add0..6679689f3316 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_direct_show.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_direct_show.c @@ -131,8 +131,9 @@ int rockchip_drm_direct_show_alloc_buffer(struct drm_device *drm, mutex_unlock(&drm->object_name_lock); goto err_gem_free; } - get_dma_buf(dmabuf); - drm_gem_object_get(obj); + obj->dma_buf = dmabuf; + get_dma_buf(obj->dma_buf); + drm_gem_dmabuf_release(obj->dma_buf); mutex_unlock(&drm->object_name_lock); dmabuf_fd = dma_buf_fd(dmabuf, 0); @@ -149,7 +150,7 @@ int rockchip_drm_direct_show_alloc_buffer(struct drm_device *drm, err_free_dmabuf: dma_buf_put(dmabuf); err_gem_free: - rockchip_gem_free_object(&rk_obj->base); + drm_gem_object_put(&rk_obj->base); return -ENOMEM; } @@ -157,13 +158,18 @@ err_gem_free: void rockchip_drm_direct_show_free_buffer(struct drm_device *drm, struct rockchip_drm_direct_show_buffer *buffer) { - struct dma_buf *dmabuf; + struct drm_gem_object *obj = &buffer->rk_gem_obj->base; - DRM_DS_DBG("free buffer: 0x%p, dma buf fd:%d\n", buffer->rk_gem_obj, buffer->dmabuf_fd); - dmabuf = dma_buf_get(buffer->dmabuf_fd); - dma_buf_put(dmabuf); - __close_fd(current->files, buffer->dmabuf_fd); - rockchip_gem_free_object(&buffer->rk_gem_obj->base); + DRM_DS_DBG("free buffer: 0x%p\n", buffer->rk_gem_obj); + + mutex_lock(&drm->object_name_lock); + if (obj->dma_buf) { + dma_buf_put(obj->dma_buf); + obj->dma_buf = NULL; + } + mutex_unlock(&drm->object_name_lock); + + drm_gem_object_put(obj); } struct drm_plane *rockchip_drm_direct_show_get_plane(struct drm_device *drm, char *name) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c index 065fa7fde336..bd449be5b9c0 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c @@ -101,7 +101,7 @@ static int rockchip_drm_fbdev_create(struct drm_fb_helper *helper, return 0; out: - rockchip_gem_free_object(&rk_obj->base); + drm_gem_object_put(&rk_obj->base); return ret; }