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 <jay.xu@rock-chips.com>
Change-Id: I812770ed832d71121aab5212d62b96815cbe2d68
This commit is contained in:
Jianqun Xu
2022-04-25 20:17:36 +08:00
committed by Tao Huang
parent c2d31c3bd7
commit 6638888eeb
2 changed files with 16 additions and 10 deletions

View File

@@ -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)

View File

@@ -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;
}