drm/amdgpu: add some extra VM error handling
authorChristian König <christian.koenig@amd.com>
Fri, 12 May 2017 14:09:26 +0000 (16:09 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 31 May 2017 18:16:36 +0000 (14:16 -0400)
If updating the PDs fails we now invalidate all entries to try again later.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

index c11903257b947eed4e4cb7849406215c43783b5e..6af2d3c56f388ca593be7f741527f498958a8e18 100644 (file)
@@ -1103,6 +1103,32 @@ error_free:
        return r;
 }
 
+/*
+ * amdgpu_vm_invalidate_level - mark all PD levels as invalid
+ *
+ * @parent: parent PD
+ *
+ * Mark all PD level as invalid after an error.
+ */
+static void amdgpu_vm_invalidate_level(struct amdgpu_vm_pt *parent)
+{
+       unsigned pt_idx;
+
+       /*
+        * Recurse into the subdirectories. This recursion is harmless because
+        * we only have a maximum of 5 layers.
+        */
+       for (pt_idx = 0; pt_idx <= parent->last_entry_used; ++pt_idx) {
+               struct amdgpu_vm_pt *entry = &parent->entries[pt_idx];
+
+               if (!entry->bo)
+                       continue;
+
+               entry->addr = ~0ULL;
+               amdgpu_vm_invalidate_level(entry);
+       }
+}
+
 /*
  * amdgpu_vm_update_directories - make sure that all directories are valid
  *
@@ -1115,7 +1141,13 @@ error_free:
 int amdgpu_vm_update_directories(struct amdgpu_device *adev,
                                 struct amdgpu_vm *vm)
 {
-       return amdgpu_vm_update_level(adev, vm, &vm->root, 0);
+       int r;
+
+       r = amdgpu_vm_update_level(adev, vm, &vm->root, 0);
+       if (r)
+               amdgpu_vm_invalidate_level(&vm->root);
+
+       return r;
 }
 
 /**