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]>
---
 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);
-- 
2.43.0

Reply via email to