diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 32 |
1 files changed, 8 insertions, 24 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 139bd6347fc4..cca8fc931bbb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -1370,37 +1370,22 @@ static void amdgpu_vm_update_pde(struct amdgpu_pte_update_params *params, | |||
1370 | } | 1370 | } |
1371 | 1371 | ||
1372 | /* | 1372 | /* |
1373 | * amdgpu_vm_invalidate_level - mark all PD levels as invalid | 1373 | * amdgpu_vm_invalidate_pds - mark all PDs as invalid |
1374 | * | 1374 | * |
1375 | * @adev: amdgpu_device pointer | 1375 | * @adev: amdgpu_device pointer |
1376 | * @vm: related vm | 1376 | * @vm: related vm |
1377 | * @parent: parent PD | ||
1378 | * @level: VMPT level | ||
1379 | * | 1377 | * |
1380 | * Mark all PD level as invalid after an error. | 1378 | * Mark all PD level as invalid after an error. |
1381 | */ | 1379 | */ |
1382 | static void amdgpu_vm_invalidate_level(struct amdgpu_device *adev, | 1380 | static void amdgpu_vm_invalidate_pds(struct amdgpu_device *adev, |
1383 | struct amdgpu_vm *vm, | 1381 | struct amdgpu_vm *vm) |
1384 | struct amdgpu_vm_pt *parent, | ||
1385 | unsigned level) | ||
1386 | { | 1382 | { |
1387 | unsigned pt_idx, num_entries; | 1383 | struct amdgpu_vm_pt_cursor cursor; |
1388 | 1384 | struct amdgpu_vm_pt *entry; | |
1389 | /* | ||
1390 | * Recurse into the subdirectories. This recursion is harmless because | ||
1391 | * we only have a maximum of 5 layers. | ||
1392 | */ | ||
1393 | num_entries = amdgpu_vm_num_entries(adev, level); | ||
1394 | for (pt_idx = 0; pt_idx < num_entries; ++pt_idx) { | ||
1395 | struct amdgpu_vm_pt *entry = &parent->entries[pt_idx]; | ||
1396 | |||
1397 | if (!entry->base.bo) | ||
1398 | continue; | ||
1399 | 1385 | ||
1400 | if (!entry->base.moved) | 1386 | for_each_amdgpu_vm_pt_dfs_safe(adev, vm, cursor, entry) |
1387 | if (entry->base.bo && !entry->base.moved) | ||
1401 | amdgpu_vm_bo_relocated(&entry->base); | 1388 | amdgpu_vm_bo_relocated(&entry->base); |
1402 | amdgpu_vm_invalidate_level(adev, vm, entry, level + 1); | ||
1403 | } | ||
1404 | } | 1389 | } |
1405 | 1390 | ||
1406 | /* | 1391 | /* |
@@ -1497,8 +1482,7 @@ restart: | |||
1497 | return 0; | 1482 | return 0; |
1498 | 1483 | ||
1499 | error: | 1484 | error: |
1500 | amdgpu_vm_invalidate_level(adev, vm, &vm->root, | 1485 | amdgpu_vm_invalidate_pds(adev, vm); |
1501 | adev->vm_manager.root_level); | ||
1502 | amdgpu_job_free(job); | 1486 | amdgpu_job_free(job); |
1503 | return r; | 1487 | return r; |
1504 | } | 1488 | } |