[PATCH] drm/vmwgfx: Switch to exclusively using GEM references
Zack Rusin
zack.rusin at broadcom.com
Wed Mar 19 03:21:47 UTC 2025
On Fri, Jan 31, 2025 at 3:04 PM Ian Forbes <ian.forbes at broadcom.com> wrote:
>
> Currently we use a combination of TTM and GEM reference counting which is
> cumbersome. TTM references are used for kernel internal BOs and operations
> like validation. Simply switching the ttm_bo_(get|put) calls to their
> GEM equivalents is insufficient as not all BOs are GEM BOs so we must set
> the GEM vtable for all BOs even if they are not exposed to userspace.
>
> Suggested-by: Christian König <christian.koenig at amd.com>
> Signed-off-by: Ian Forbes <ian.forbes at broadcom.com>
> ---
> drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 4 ++--
> drivers/gpu/drm/vmwgfx/vmwgfx_bo.h | 4 ++--
> drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c | 2 +-
> drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 4 +---
> drivers/gpu/drm/vmwgfx/vmwgfx_gem.c | 18 ++----------------
> drivers/gpu/drm/vmwgfx/vmwgfx_mob.c | 3 +--
> drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 8 ++++----
> drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 2 +-
> drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 4 +---
> drivers/gpu/drm/vmwgfx/vmwgfx_validation.c | 7 +++----
> 10 files changed, 18 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> index 676fd84f35cc..609bf4067b07 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> @@ -36,8 +36,7 @@ static void vmw_bo_release(struct vmw_bo *vbo)
> {
> struct vmw_resource *res;
>
> - WARN_ON(vbo->tbo.base.funcs &&
> - kref_read(&vbo->tbo.base.refcount) != 0);
> + WARN_ON(kref_read(&vbo->tbo.base.refcount) != 0);
> vmw_bo_unmap(vbo);
>
> xa_destroy(&vbo->detached_resources);
> @@ -469,6 +468,7 @@ int vmw_bo_create(struct vmw_private *vmw,
> if (unlikely(ret != 0))
> goto out_error;
>
> + (*p_bo)->tbo.base.funcs = &vmw_gem_object_funcs;
> return ret;
> out_error:
> *p_bo = NULL;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> index e97cae2365c8..791951fe019c 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> @@ -204,12 +204,12 @@ static inline void vmw_bo_unreference(struct vmw_bo **buf)
>
> *buf = NULL;
> if (tmp_buf)
> - ttm_bo_put(&tmp_buf->tbo);
> + drm_gem_object_put(&tmp_buf->tbo.base);
> }
>
> static inline struct vmw_bo *vmw_bo_reference(struct vmw_bo *buf)
> {
> - ttm_bo_get(&buf->tbo);
> + drm_gem_object_get(&buf->tbo.base);
> return buf;
> }
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
> index a7c07692262b..98331c4c0335 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
> @@ -432,7 +432,7 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
> * for the new COTable. Initially pin the buffer object to make sure
> * we can use tryreserve without failure.
> */
> - ret = vmw_gem_object_create(dev_priv, &bo_params, &buf);
> + ret = vmw_bo_create(dev_priv, &bo_params, &buf);
> if (ret) {
> DRM_ERROR("Failed initializing new cotable MOB.\n");
> goto out_done;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> index 5c1d82a73c32..81382cd58ba2 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> @@ -843,9 +843,7 @@ static inline bool vmw_resource_mob_attached(const struct vmw_resource *res)
> * GEM related functionality - vmwgfx_gem.c
> */
> struct vmw_bo_params;
> -int vmw_gem_object_create(struct vmw_private *vmw,
> - struct vmw_bo_params *params,
> - struct vmw_bo **p_vbo);
> +extern const struct drm_gem_object_funcs vmw_gem_object_funcs;
> extern int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv,
> struct drm_file *filp,
> uint32_t size,
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
> index ed5015ced392..026c9b699604 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
> @@ -140,7 +140,7 @@ static const struct vm_operations_struct vmw_vm_ops = {
> .close = ttm_bo_vm_close,
> };
>
> -static const struct drm_gem_object_funcs vmw_gem_object_funcs = {
> +const struct drm_gem_object_funcs vmw_gem_object_funcs = {
> .free = vmw_gem_object_free,
> .open = vmw_gem_object_open,
> .close = vmw_gem_object_close,
> @@ -154,20 +154,6 @@ static const struct drm_gem_object_funcs vmw_gem_object_funcs = {
> .vm_ops = &vmw_vm_ops,
> };
>
> -int vmw_gem_object_create(struct vmw_private *vmw,
> - struct vmw_bo_params *params,
> - struct vmw_bo **p_vbo)
> -{
> - int ret = vmw_bo_create(vmw, params, p_vbo);
> -
> - if (ret != 0)
> - goto out_no_bo;
> -
> - (*p_vbo)->tbo.base.funcs = &vmw_gem_object_funcs;
> -out_no_bo:
> - return ret;
> -}
> -
> int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv,
> struct drm_file *filp,
> uint32_t size,
> @@ -183,7 +169,7 @@ int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv,
> .pin = false
> };
>
> - ret = vmw_gem_object_create(dev_priv, ¶ms, p_vbo);
> + ret = vmw_bo_create(dev_priv, ¶ms, p_vbo);
> if (ret != 0)
> goto out_no_bo;
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
> index 7055cbefc768..d8204d4265d3 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
> @@ -282,8 +282,7 @@ static int vmw_otable_batch_setup(struct vmw_private *dev_priv,
> }
>
> vmw_bo_unpin_unlocked(&batch->otable_bo->tbo);
> - ttm_bo_put(&batch->otable_bo->tbo);
> - batch->otable_bo = NULL;
> + vmw_bo_unreference(&batch->otable_bo);
> return ret;
> }
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
> index c4d5fe5f330f..388011696941 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
> @@ -347,7 +347,7 @@ static int vmw_resource_buf_alloc(struct vmw_resource *res,
> return 0;
> }
>
> - ret = vmw_gem_object_create(res->dev_priv, &bo_params, &gbo);
> + ret = vmw_bo_create(res->dev_priv, &bo_params, &gbo);
> if (unlikely(ret != 0))
> goto out_no_bo;
>
> @@ -531,9 +531,9 @@ vmw_resource_check_buffer(struct ww_acquire_ctx *ticket,
> }
>
> INIT_LIST_HEAD(&val_list);
> - ttm_bo_get(&res->guest_memory_bo->tbo);
> val_buf->bo = &res->guest_memory_bo->tbo;
> val_buf->num_shared = 0;
> + drm_gem_object_get(&val_buf->bo->base);
> list_add_tail(&val_buf->head, &val_list);
> ret = ttm_eu_reserve_buffers(ticket, &val_list, interruptible, NULL);
> if (unlikely(ret != 0))
> @@ -557,7 +557,7 @@ vmw_resource_check_buffer(struct ww_acquire_ctx *ticket,
> out_no_validate:
> ttm_eu_backoff_reservation(ticket, &val_list);
> out_no_reserve:
> - ttm_bo_put(val_buf->bo);
> + drm_gem_object_put(&val_buf->bo->base);
> val_buf->bo = NULL;
> if (guest_memory_dirty)
> vmw_user_bo_unref(&res->guest_memory_bo);
> @@ -619,7 +619,7 @@ vmw_resource_backoff_reservation(struct ww_acquire_ctx *ticket,
> INIT_LIST_HEAD(&val_list);
> list_add_tail(&val_buf->head, &val_list);
> ttm_eu_backoff_reservation(ticket, &val_list);
> - ttm_bo_put(val_buf->bo);
> + drm_gem_object_put(&val_buf->bo->base);
> val_buf->bo = NULL;
> }
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
> index cee2dc70cf8c..23dc404ad623 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
> @@ -445,7 +445,7 @@ vmw_sou_primary_plane_prepare_fb(struct drm_plane *plane,
> * resume the overlays, this is preferred to failing to alloc.
> */
> vmw_overlay_pause_all(dev_priv);
> - ret = vmw_gem_object_create(dev_priv, &bo_params, &vps->uo.buffer);
> + ret = vmw_bo_create(dev_priv, &bo_params, &vps->uo.buffer);
> vmw_overlay_resume_all(dev_priv);
> if (ret)
> return ret;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
> index 896f171f8093..bc7e522d336e 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
> @@ -850,9 +850,7 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
> .pin = false
> };
>
> - ret = vmw_gem_object_create(dev_priv,
> - ¶ms,
> - &res->guest_memory_bo);
> + ret = vmw_bo_create(dev_priv, ¶ms, &res->guest_memory_bo);
> if (unlikely(ret != 0)) {
> vmw_resource_unreference(&res);
> goto out_unlock;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c b/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c
> index e7625b3f71e0..7ee93e7191c7 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c
> @@ -262,9 +262,8 @@ int vmw_validation_add_bo(struct vmw_validation_context *ctx,
> bo_node->hash.key);
> }
> val_buf = &bo_node->base;
> - val_buf->bo = ttm_bo_get_unless_zero(&vbo->tbo);
> - if (!val_buf->bo)
> - return -ESRCH;
> + vmw_bo_reference(vbo);
> + val_buf->bo = &vbo->tbo;
> val_buf->num_shared = 0;
> list_add_tail(&val_buf->head, &ctx->bo_list);
> }
> @@ -656,7 +655,7 @@ void vmw_validation_unref_lists(struct vmw_validation_context *ctx)
> struct vmw_validation_res_node *val;
>
> list_for_each_entry(entry, &ctx->bo_list, base.head) {
> - ttm_bo_put(entry->base.bo);
> + drm_gem_object_put(&entry->base.bo->base);
> entry->base.bo = NULL;
> }
>
> --
> 2.45.2
>
Yea, that's probably a long time coming. As a followup it'd be good to
get rid of vmw_user_bo_ref/vmw_user_bo_unref now that they're exactly
the same as vmw_bo_reference/vmw_bo_unreference.
Reviewed-by: Zack Rusin <zack.rusin at broadcom.com>
z
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5414 bytes
Desc: S/MIME Cryptographic Signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20250318/b8badf7f/attachment-0001.bin>
More information about the dri-devel
mailing list