Re: [PATCH] drm/vmwgfx: Add error path for xa_store in vmw_bo_add_detached_resource

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

 



On Tue, Feb 25, 2025 at 9:54 AM Keisuke Nishimura
<keisuke.nishimura@xxxxxxxx> wrote:
>
> The xa_store() may fail due to memory allocation failure because there
> is no guarantee that the index is already used. This fix introduces new
> paths to handle the error.
>
> This patch also aligns the order of function calls by calling
> vmw_bo_add_detached_resource() before ttm_prime_object_init() in order
> to allow consistent error handling.
>
> Fixes: d6667f0ddf46 ("drm/vmwgfx: Fix handling of dumb buffers")
> Signed-off-by: Keisuke Nishimura <keisuke.nishimura@xxxxxxxx>
> ---
>  drivers/gpu/drm/vmwgfx/vmwgfx_bo.c      |  4 ++--
>  drivers/gpu/drm/vmwgfx/vmwgfx_bo.h      |  2 +-
>  drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 16 ++++++++++++++--
>  3 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> index 9b5b8c1f063b..aa13e4061ff1 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> @@ -848,9 +848,9 @@ void vmw_bo_placement_set_default_accelerated(struct vmw_bo *bo)
>         vmw_bo_placement_set(bo, domain, domain);
>  }
>
> -void vmw_bo_add_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res)
> +int vmw_bo_add_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res)
>  {
> -       xa_store(&vbo->detached_resources, (unsigned long)res, res, GFP_KERNEL);
> +       return xa_err(xa_store(&vbo->detached_resources, (unsigned long)res, res, GFP_KERNEL));
>  }
>
>  void vmw_bo_del_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res)
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> index 11e330c7c7f5..51790a11fe64 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> @@ -141,7 +141,7 @@ void vmw_bo_move_notify(struct ttm_buffer_object *bo,
>                         struct ttm_resource *mem);
>  void vmw_bo_swap_notify(struct ttm_buffer_object *bo);
>
> -void vmw_bo_add_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res);
> +int vmw_bo_add_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res);
>  void vmw_bo_del_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res);
>  struct vmw_surface *vmw_bo_surface(struct vmw_bo *vbo);
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
> index 5721c74da3e0..1f7626f6ac0b 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
> @@ -871,7 +871,12 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
>                         vmw_resource_unreference(&res);
>                         goto out_unlock;
>                 }
> -               vmw_bo_add_detached_resource(res->guest_memory_bo, res);
> +
> +               ret = vmw_bo_add_detached_resource(res->guest_memory_bo, res);
> +               if (unlikely(ret != 0)) {
> +                       vmw_resource_unreference(&res);
> +                       goto out_unlock;
> +               }
>         }
>
>         tmp = vmw_resource_reference(&srf->res);
> @@ -1670,6 +1675,14 @@ vmw_gb_surface_define_internal(struct drm_device *dev,
>
>         }
>
> +       if (res->guest_memory_bo) {
> +               ret = vmw_bo_add_detached_resource(res->guest_memory_bo, res);
> +               if (unlikely(ret != 0)) {
> +                       vmw_resource_unreference(&res);
> +                       goto out_unlock;
> +               }
> +       }
> +
>         tmp = vmw_resource_reference(res);
>         ret = ttm_prime_object_init(tfile, res->guest_memory_size, &user_srf->prime,
>                                     VMW_RES_SURFACE,
> @@ -1684,7 +1697,6 @@ vmw_gb_surface_define_internal(struct drm_device *dev,
>         rep->handle      = user_srf->prime.base.handle;
>         rep->backup_size = res->guest_memory_size;
>         if (res->guest_memory_bo) {
> -               vmw_bo_add_detached_resource(res->guest_memory_bo, res);
>                 rep->buffer_map_handle =
>                         drm_vma_node_offset_addr(&res->guest_memory_bo->tbo.base.vma_node);
>                 rep->buffer_size = res->guest_memory_bo->tbo.base.size;
> --
> 2.34.1
>

Looks good. Thank you for the patch! I'll push it to drm-misc-next for
now because I'd like it alongside the cursor rework.

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