On 6/22/26 11:28, Pierre-Eric Pelloux-Prayer wrote:
> The commit referenced below restarts the CS if the validation is
> still in progress. When debug_vm is enabled, all BOs from the CS
> are invalidated so we will hit an infinite loop.
> 
> To avoid that, defer BO invalidation to amdgpu_cs_parser_fini.
> 
> Fixes: 83ac717d7837 ("drm/amdgpu: restart the CS if some parts of the VM are 
> still invalidated")
> Signed-off-by: Pierre-Eric Pelloux-Prayer <[email protected]>

Reviewed-by: Christian König <[email protected]> for both patches.

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 30 ++++++++++++++------------
>  1 file changed, 16 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index d63fbc7c568d..7e75c536dab3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -1180,19 +1180,6 @@ static int amdgpu_cs_vm_handling(struct 
> amdgpu_cs_parser *p)
>               job->vm_pd_addr = amdgpu_gmc_pd_addr(vm->root.bo);
>       }
>  
> -     if (adev->debug_vm) {
> -             /* Invalidate all BOs to test for userspace bugs */
> -             amdgpu_bo_list_for_each_entry(e, p->bo_list) {
> -                     struct amdgpu_bo *bo = e->bo;
> -
> -                     /* ignore duplicates */
> -                     if (!bo)
> -                             continue;
> -
> -                     amdgpu_vm_bo_invalidate(bo, false);
> -             }
> -     }
> -
>       return 0;
>  }
>  
> @@ -1382,6 +1369,8 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
>  /* Cleanup the parser structure */
>  static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser)
>  {
> +     struct amdgpu_device *adev = parser->adev;
> +     struct amdgpu_bo_list_entry *e;
>       unsigned int i;
>  
>       amdgpu_sync_free(&parser->sync);
> @@ -1397,8 +1386,21 @@ static void amdgpu_cs_parser_fini(struct 
> amdgpu_cs_parser *parser)
>  
>       if (parser->ctx)
>               amdgpu_ctx_put(parser->ctx);
> -     if (parser->bo_list)
> +     if (parser->bo_list) {
> +             if (adev->debug_vm) {
> +                     /* Invalidate all BOs to test for userspace bugs */
> +                     amdgpu_bo_list_for_each_entry(e, parser->bo_list) {
> +                             struct amdgpu_bo *bo = e->bo;
> +
> +                             /* ignore duplicates */
> +                             if (!bo)
> +                                     continue;
> +
> +                             amdgpu_vm_bo_invalidate(bo, false);
> +                     }
> +             }
>               amdgpu_bo_list_put(parser->bo_list);
> +     }
>  
>       for (i = 0; i < parser->nchunks; i++)
>               kvfree(parser->chunks[i].kdata);

Reply via email to