From: Daniel Vetter <daniel.vetter@ffwll.ch>
To: "Christian König" <ckoenig.leichtzumerken@gmail.com>
Cc: matthew.brost@intel.com, thomas.hellstrom@linux.intel.com,
dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 4/8] drm/vmwgfx: use GEM references instead of TTMs
Date: Thu, 25 Jul 2024 14:16:02 +0200 [thread overview]
Message-ID: <ZqJCAolDFvhQ7ysI@phenom.ffwll.local> (raw)
In-Reply-To: <20240723121750.2086-4-christian.koenig@amd.com>
On Tue, Jul 23, 2024 at 02:17:46PM +0200, Christian König wrote:
> Instead of a TTM reference grab a GEM reference whenever necessary.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
> Cc: Zack Rusin <zack.rusin@broadcom.com>
> Cc: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
There's a ttm_bo_put in vmwgfx_mob.c that you didn't convert, is there a
reason for that? And the mix of vmw_bo_(un)reference and
drm_gem_object_get/put in vmwgfx_resource.c is a bit confusing, I'd just
refcount the res->guest_memory_bo instead so that you can use the vmw_bo_
functions.
-Sima
> ---
> drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 4 ++--
> drivers/gpu/drm/vmwgfx/vmwgfx_bo.h | 19 ++-----------------
> drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c | 4 ++--
> drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 4 ++--
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 6 +++---
> drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c | 2 +-
> drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 16 ++++++++--------
> drivers/gpu/drm/vmwgfx/vmwgfx_shader.c | 4 ++--
> drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 2 +-
> 9 files changed, 23 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> index 00144632c600..3caaacb124ec 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> @@ -501,7 +501,7 @@ static int vmw_user_bo_synccpu_release(struct drm_file *filp,
> if (!(flags & drm_vmw_synccpu_allow_cs)) {
> atomic_dec(&vmw_bo->cpu_writers);
> }
> - vmw_user_bo_unref(&vmw_bo);
> + vmw_bo_unreference(&vmw_bo);
> }
>
> return ret;
> @@ -543,7 +543,7 @@ int vmw_user_bo_synccpu_ioctl(struct drm_device *dev, void *data,
> return ret;
>
> ret = vmw_user_bo_synccpu_grab(vbo, arg->flags);
> - vmw_user_bo_unref(&vbo);
> + vmw_bo_unreference(&vbo);
> if (unlikely(ret != 0)) {
> if (ret == -ERESTARTSYS || ret == -EBUSY)
> return -EBUSY;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> index f349642e6190..42a58d57409d 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> @@ -188,30 +188,15 @@ 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;
> }
>
> -static inline struct vmw_bo *vmw_user_bo_ref(struct vmw_bo *vbo)
> -{
> - drm_gem_object_get(&vbo->tbo.base);
> - return vbo;
> -}
> -
> -static inline void vmw_user_bo_unref(struct vmw_bo **buf)
> -{
> - struct vmw_bo *tmp_buf = *buf;
> -
> - *buf = NULL;
> - if (tmp_buf)
> - drm_gem_object_put(&tmp_buf->tbo.base);
> -}
> -
> static inline struct vmw_bo *to_vmw_bo(struct drm_gem_object *gobj)
> {
> return container_of((gobj), struct vmw_bo, tbo.base);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
> index a7c07692262b..6b700ebd71b1 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
> @@ -502,7 +502,7 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
>
> vmw_resource_mob_attach(res);
> /* Let go of the old mob. */
> - vmw_user_bo_unref(&old_buf);
> + vmw_bo_unreference(&old_buf);
> res->id = vcotbl->type;
>
> ret = dma_resv_reserve_fences(bo->base.resv, 1);
> @@ -521,7 +521,7 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
> out_wait:
> ttm_bo_unpin(bo);
> ttm_bo_unreserve(bo);
> - vmw_user_bo_unref(&buf);
> + vmw_bo_unreference(&buf);
>
> out_done:
> MKS_STAT_TIME_POP(MKSSTAT_KERN_COTABLE_RESIZE);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
> index 2e52d73eba48..be29b9ff8901 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
> @@ -1166,7 +1166,7 @@ static int vmw_translate_mob_ptr(struct vmw_private *dev_priv,
> vmw_bo_placement_set(vmw_bo, VMW_BO_DOMAIN_MOB, VMW_BO_DOMAIN_MOB);
> ret = vmw_validation_add_bo(sw_context->ctx, vmw_bo);
> tmp_bo = vmw_bo;
> - vmw_user_bo_unref(&tmp_bo);
> + vmw_bo_unreference(&tmp_bo);
> if (unlikely(ret != 0))
> return ret;
>
> @@ -1223,7 +1223,7 @@ static int vmw_translate_guest_ptr(struct vmw_private *dev_priv,
> VMW_BO_DOMAIN_GMR | VMW_BO_DOMAIN_VRAM);
> ret = vmw_validation_add_bo(sw_context->ctx, vmw_bo);
> tmp_bo = vmw_bo;
> - vmw_user_bo_unref(&tmp_bo);
> + vmw_bo_unreference(&tmp_bo);
> if (unlikely(ret != 0))
> return ret;
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> index 13b2820cae51..f8158b8d2843 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> @@ -1476,8 +1476,8 @@ static int vmw_create_bo_proxy(struct drm_device *dev,
> /* Reserve and switch the backing mob. */
> mutex_lock(&res->dev_priv->cmdbuf_mutex);
> (void) vmw_resource_reserve(res, false, true);
> - vmw_user_bo_unref(&res->guest_memory_bo);
> - res->guest_memory_bo = vmw_user_bo_ref(bo_mob);
> + vmw_bo_unreference(&res->guest_memory_bo);
> + res->guest_memory_bo = vmw_bo_reference(bo_mob);
> res->guest_memory_offset = 0;
> vmw_resource_unreserve(res, false, false, false, NULL, 0);
> mutex_unlock(&res->dev_priv->cmdbuf_mutex);
> @@ -1670,7 +1670,7 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
> err_out:
> /* vmw_user_lookup_handle takes one ref so does new_fb */
> if (bo)
> - vmw_user_bo_unref(&bo);
> + vmw_bo_unreference(&bo);
> if (surface)
> vmw_surface_unreference(&surface);
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
> index c45b4724e414..c5860f62ec53 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
> @@ -451,7 +451,7 @@ int vmw_overlay_ioctl(struct drm_device *dev, void *data,
>
> ret = vmw_overlay_update_stream(dev_priv, buf, arg, true);
>
> - vmw_user_bo_unref(&buf);
> + vmw_bo_unreference(&buf);
>
> out_unlock:
> mutex_unlock(&overlay->mutex);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
> index 848dba09981b..cb786da99fd3 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
> @@ -141,7 +141,7 @@ static void vmw_resource_release(struct kref *kref)
> if (res->coherent)
> vmw_bo_dirty_release(res->guest_memory_bo);
> ttm_bo_unreserve(bo);
> - vmw_user_bo_unref(&res->guest_memory_bo);
> + vmw_bo_unreference(&res->guest_memory_bo);
> }
>
> if (likely(res->hw_destroy != NULL)) {
> @@ -457,11 +457,11 @@ void vmw_resource_unreserve(struct vmw_resource *res,
> vmw_resource_mob_detach(res);
> if (res->coherent)
> vmw_bo_dirty_release(res->guest_memory_bo);
> - vmw_user_bo_unref(&res->guest_memory_bo);
> + vmw_bo_unreference(&res->guest_memory_bo);
> }
>
> if (new_guest_memory_bo) {
> - res->guest_memory_bo = vmw_user_bo_ref(new_guest_memory_bo);
> + res->guest_memory_bo = vmw_bo_reference(new_guest_memory_bo);
>
> /*
> * The validation code should already have added a
> @@ -522,7 +522,7 @@ vmw_resource_check_buffer(struct ww_acquire_ctx *ticket,
> }
>
> INIT_LIST_HEAD(&val_list);
> - ttm_bo_get(&res->guest_memory_bo->tbo);
> + drm_gem_object_get(&res->guest_memory_bo->tbo.base);
> val_buf->bo = &res->guest_memory_bo->tbo;
> val_buf->num_shared = 0;
> list_add_tail(&val_buf->head, &val_list);
> @@ -548,10 +548,10 @@ 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);
> + vmw_bo_unreference(&res->guest_memory_bo);
>
> return ret;
> }
> @@ -610,7 +610,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;
> }
>
> @@ -727,7 +727,7 @@ int vmw_resource_validate(struct vmw_resource *res, bool intr,
> goto out_no_validate;
> else if (!res->func->needs_guest_memory && res->guest_memory_bo) {
> WARN_ON_ONCE(vmw_resource_mob_attached(res));
> - vmw_user_bo_unref(&res->guest_memory_bo);
> + vmw_bo_unreference(&res->guest_memory_bo);
> }
>
> return 0;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
> index a01ca3226d0a..6b8e984695ed 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
> @@ -180,7 +180,7 @@ static int vmw_gb_shader_init(struct vmw_private *dev_priv,
>
> res->guest_memory_size = size;
> if (byte_code) {
> - res->guest_memory_bo = vmw_user_bo_ref(byte_code);
> + res->guest_memory_bo = vmw_bo_reference(byte_code);
> res->guest_memory_offset = offset;
> }
> shader->size = size;
> @@ -809,7 +809,7 @@ static int vmw_shader_define(struct drm_device *dev, struct drm_file *file_priv,
> shader_type, num_input_sig,
> num_output_sig, tfile, shader_handle);
> out_bad_arg:
> - vmw_user_bo_unref(&buffer);
> + vmw_bo_unreference(&buffer);
> return ret;
> }
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
> index e7a744dfcecf..c275bb074a60 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
> @@ -1505,7 +1505,7 @@ vmw_gb_surface_define_internal(struct drm_device *dev,
> if (ret == 0) {
> if (res->guest_memory_bo->tbo.base.size < res->guest_memory_size) {
> VMW_DEBUG_USER("Surface backup buffer too small.\n");
> - vmw_user_bo_unref(&res->guest_memory_bo);
> + vmw_bo_unreference(&res->guest_memory_bo);
> ret = -EINVAL;
> goto out_unlock;
> } else {
> --
> 2.34.1
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
next prev parent reply other threads:[~2024-07-25 12:16 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-23 12:17 [PATCH 1/8] drm/amdgpu: use GEM references instead of TTMs Christian König
2024-07-23 12:17 ` [PATCH 2/8] drm/radeon: " Christian König
2024-07-25 12:02 ` Daniel Vetter
2024-07-23 12:17 ` [PATCH 3/8] drm/loongson: " Christian König
2024-07-25 12:03 ` Daniel Vetter
2024-07-23 12:17 ` [PATCH 4/8] drm/vmwgfx: " Christian König
2024-07-25 12:16 ` Daniel Vetter [this message]
2024-07-23 12:17 ` [PATCH 5/8] drm/vmwgfx: partially revert "Adapt validation code for reference-free lookups" Christian König
2024-07-25 12:34 ` Daniel Vetter
2024-08-27 10:03 ` Thomas Hellström
2024-07-23 12:17 ` [PATCH 6/8] drm/ttm: revert "Export ttm_bo_get_unless_zero()" Christian König
2024-07-25 12:36 ` Daniel Vetter
2024-07-25 13:19 ` Danilo Krummrich
2024-07-23 12:17 ` [PATCH 7/8] drm/ttm: use GEM references for VM mappings Christian König
2024-07-23 12:17 ` [PATCH 8/8] drm/ttm: make ttm_bo_get internal Christian König
2024-07-25 12:01 ` [PATCH 1/8] drm/amdgpu: use GEM references instead of TTMs Daniel Vetter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZqJCAolDFvhQ7ysI@phenom.ffwll.local \
--to=daniel.vetter@ffwll.ch \
--cc=ckoenig.leichtzumerken@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=matthew.brost@intel.com \
--cc=thomas.hellstrom@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.