Re: [PATCH] drm/vmwgfx: Add new keep_resv BO param

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jan 10, 2025 at 1:53 PM Ian Forbes <ian.forbes@xxxxxxxxxxxx> wrote:
>
> Adds a new BO param that keeps the reservation locked after creation.
> This removes the need to re-reserve the BO after creation which is a
> waste of cycles.
>
> This also fixes a bug in vmw_prime_import_sg_table where the imported
> reservation is unlocked twice.
>
> Signed-off-by: Ian Forbes <ian.forbes@xxxxxxxxxxxx>
> Fixes: b32233acceff ("drm/vmwgfx: Fix prime import/export")
> ---
>  drivers/gpu/drm/vmwgfx/vmwgfx_bo.c         | 3 ++-
>  drivers/gpu/drm/vmwgfx/vmwgfx_bo.h         | 3 ++-
>  drivers/gpu/drm/vmwgfx/vmwgfx_drv.c        | 7 ++-----
>  drivers/gpu/drm/vmwgfx/vmwgfx_gem.c        | 1 +
>  drivers/gpu/drm/vmwgfx/vmwgfx_shader.c     | 7 ++-----
>  drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c | 5 ++---
>  6 files changed, 11 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> index 5f13285f83e0b..9b5b8c1f063bb 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> @@ -442,7 +442,8 @@ static int vmw_bo_init(struct vmw_private *dev_priv,
>
>         if (params->pin)
>                 ttm_bo_pin(&vmw_bo->tbo);
> -       ttm_bo_unreserve(&vmw_bo->tbo);
> +       if (!params->keep_resv)
> +               ttm_bo_unreserve(&vmw_bo->tbo);
>
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> index 07749f0a5f294..11e330c7c7f52 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> @@ -56,8 +56,9 @@ struct vmw_bo_params {
>         u32 domain;
>         u32 busy_domain;
>         enum ttm_bo_type bo_type;
> -       size_t size;
>         bool pin;
> +       bool keep_resv;
> +       size_t size;
>         struct dma_resv *resv;
>         struct sg_table *sg;
>  };
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> index 2c46897876dde..b19a062592b08 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> @@ -403,7 +403,8 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
>                 .busy_domain = VMW_BO_DOMAIN_SYS,
>                 .bo_type = ttm_bo_type_kernel,
>                 .size = PAGE_SIZE,
> -               .pin = true
> +               .pin = true,
> +               .keep_resv = true,
>         };
>
>         /*
> @@ -415,10 +416,6 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
>         if (unlikely(ret != 0))
>                 return ret;
>
> -       ret = ttm_bo_reserve(&vbo->tbo, false, true, NULL);
> -       BUG_ON(ret != 0);
> -       vmw_bo_pin_reserved(vbo, true);
> -
>         ret = ttm_bo_kmap(&vbo->tbo, 0, 1, &map);
>         if (likely(ret == 0)) {
>                 result = ttm_kmap_obj_virtual(&map, &dummy);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
> index b9857f37ca1ac..ed5015ced3920 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
> @@ -206,6 +206,7 @@ struct drm_gem_object *vmw_prime_import_sg_table(struct drm_device *dev,
>                 .bo_type = ttm_bo_type_sg,
>                 .size = attach->dmabuf->size,
>                 .pin = false,
> +               .keep_resv = true,
>                 .resv = attach->dmabuf->resv,
>                 .sg = table,
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
> index a01ca3226d0af..7fb1c88bcc475 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
> @@ -896,7 +896,8 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
>                 .busy_domain = VMW_BO_DOMAIN_SYS,
>                 .bo_type = ttm_bo_type_device,
>                 .size = size,
> -               .pin = true
> +               .pin = true,
> +               .keep_resv = true,
>         };
>
>         if (!vmw_shader_id_ok(user_key, shader_type))
> @@ -906,10 +907,6 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
>         if (unlikely(ret != 0))
>                 goto out;
>
> -       ret = ttm_bo_reserve(&buf->tbo, false, true, NULL);
> -       if (unlikely(ret != 0))
> -               goto no_reserve;
> -
>         /* Map and copy shader bytecode. */
>         ret = ttm_bo_kmap(&buf->tbo, 0, PFN_UP(size), &map);
>         if (unlikely(ret != 0)) {
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> index 621d98b376bbb..5553892d7c3e0 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> @@ -572,15 +572,14 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv,
>                 .busy_domain = domain,
>                 .bo_type = ttm_bo_type_kernel,
>                 .size = bo_size,
> -               .pin = true
> +               .pin = true,
> +               .keep_resv = true,
>         };
>
>         ret = vmw_bo_create(dev_priv, &bo_params, &vbo);
>         if (unlikely(ret != 0))
>                 return ret;
>
> -       ret = ttm_bo_reserve(&vbo->tbo, false, true, NULL);
> -       BUG_ON(ret != 0);
>         ret = vmw_ttm_populate(vbo->tbo.bdev, vbo->tbo.ttm, &ctx);
>         if (likely(ret == 0)) {
>                 struct vmw_ttm_tt *vmw_tt =
> --
> 2.34.1
>

That's a pretty nice cleanup and a fix.

Reviewed-by: Zack Rusin <zack.rusin@xxxxxxxxxxxx>

z

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature


[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux