[PATCH 1/1] drm/amdgpu: Free user pages if amdgpu_cs_parser_bos failed
Felix Kuehling
felix.kuehling at amd.com
Thu Apr 28 13:51:18 UTC 2022
Am 2022-04-27 um 19:07 schrieb Philip Yang:
> Otherwise userspace resubmit the BOs again will trigger kernel WARNING
> and fail the command submission.
>
> Signed-off-by: Philip Yang <Philip.Yang at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index ea28942b0ede..44dcbef80229 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -550,7 +550,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
There is another error case a few lines up, if kvmalloc_array fails. I
think that needs to be handled with a goto out_free_user_pages as well.
> if (r) {
> kvfree(e->user_pages);
> e->user_pages = NULL;
The above two lines can be removed. The loop under out_free_user_pages
should handle this.
Regards,
Felix
> - return r;
> + goto out_free_user_pages;
> }
>
> for (i = 0; i < bo->tbo.ttm->num_pages; i++) {
> @@ -567,7 +567,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
> if (unlikely(r != 0)) {
> if (r != -ERESTARTSYS)
> DRM_ERROR("ttm_eu_reserve_buffers failed.\n");
> - goto out;
> + goto out_free_user_pages;
> }
>
> amdgpu_bo_list_for_each_entry(e, p->bo_list) {
> @@ -649,7 +649,19 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
> }
> ttm_eu_backoff_reservation(&p->ticket, &p->validated);
> }
> -out:
> +
> +out_free_user_pages:
> + if (r) {
> + amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
> + struct amdgpu_bo *bo = ttm_to_amdgpu_bo(e->tv.bo);
> +
> + if (!e->user_pages)
> + continue;
> + amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm);
> + kvfree(e->user_pages);
> + e->user_pages = NULL;
> + }
> + }
> return r;
> }
>
More information about the amd-gfx
mailing list