aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2017-03-23 14:36:31 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-03-29 23:54:15 -0400
commitf34678187a339702256c70c88c3db2d1975484ce (patch)
tree2f762f5ef7ecaebfc654ffe03da435f4abd8ddfa /drivers/gpu
parent923d26db85e8188bdbfeb7f8d70dfd86d901d4f0 (diff)
drm/amdgpu: add optional fence out-parameter to amdgpu_vm_clear_freed
We will add the fence to freed buffer objects in a later commit, to ensure that the underlying memory can only be re-used after all references in page tables have been cleared. Signed-off-by: Nicolai Hähnle <nicolai.haehnle@amd.com> Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c21
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h3
4 files changed, 19 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 419fab50dc54..e83a6dcf2f68 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -785,7 +785,7 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
785 if (r) 785 if (r)
786 return r; 786 return r;
787 787
788 r = amdgpu_vm_clear_freed(adev, vm); 788 r = amdgpu_vm_clear_freed(adev, vm, NULL);
789 if (r) 789 if (r)
790 return r; 790 return r;
791 791
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index c71c087727b8..5e068eefcaec 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -540,7 +540,7 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
540 if (r) 540 if (r)
541 goto error; 541 goto error;
542 542
543 r = amdgpu_vm_clear_freed(adev, vm); 543 r = amdgpu_vm_clear_freed(adev, vm, NULL);
544 if (r) 544 if (r)
545 goto error; 545 goto error;
546 546
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 4fe892e3600d..696860132f04 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1382,6 +1382,8 @@ static void amdgpu_vm_prt_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1382 * 1382 *
1383 * @adev: amdgpu_device pointer 1383 * @adev: amdgpu_device pointer
1384 * @vm: requested vm 1384 * @vm: requested vm
1385 * @fence: optional resulting fence (unchanged if no work needed to be done
1386 * or if an error occurred)
1385 * 1387 *
1386 * Make sure all freed BOs are cleared in the PT. 1388 * Make sure all freed BOs are cleared in the PT.
1387 * Returns 0 for success. 1389 * Returns 0 for success.
@@ -1389,10 +1391,11 @@ static void amdgpu_vm_prt_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1389 * PTs have to be reserved and mutex must be locked! 1391 * PTs have to be reserved and mutex must be locked!
1390 */ 1392 */
1391int amdgpu_vm_clear_freed(struct amdgpu_device *adev, 1393int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
1392 struct amdgpu_vm *vm) 1394 struct amdgpu_vm *vm,
1395 struct dma_fence **fence)
1393{ 1396{
1394 struct amdgpu_bo_va_mapping *mapping; 1397 struct amdgpu_bo_va_mapping *mapping;
1395 struct dma_fence *fence = NULL; 1398 struct dma_fence *f = NULL;
1396 int r; 1399 int r;
1397 1400
1398 while (!list_empty(&vm->freed)) { 1401 while (!list_empty(&vm->freed)) {
@@ -1401,15 +1404,21 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
1401 list_del(&mapping->list); 1404 list_del(&mapping->list);
1402 1405
1403 r = amdgpu_vm_bo_split_mapping(adev, NULL, 0, NULL, vm, mapping, 1406 r = amdgpu_vm_bo_split_mapping(adev, NULL, 0, NULL, vm, mapping,
1404 0, 0, &fence); 1407 0, 0, &f);
1405 amdgpu_vm_free_mapping(adev, vm, mapping, fence); 1408 amdgpu_vm_free_mapping(adev, vm, mapping, f);
1406 if (r) { 1409 if (r) {
1407 dma_fence_put(fence); 1410 dma_fence_put(f);
1408 return r; 1411 return r;
1409 } 1412 }
1413 }
1410 1414
1415 if (fence && f) {
1416 dma_fence_put(*fence);
1417 *fence = f;
1418 } else {
1419 dma_fence_put(f);
1411 } 1420 }
1412 dma_fence_put(fence); 1421
1413 return 0; 1422 return 0;
1414 1423
1415} 1424}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index ab0429d12992..cbef85bef296 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -190,7 +190,8 @@ void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id);
190int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, 190int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
191 struct amdgpu_vm *vm); 191 struct amdgpu_vm *vm);
192int amdgpu_vm_clear_freed(struct amdgpu_device *adev, 192int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
193 struct amdgpu_vm *vm); 193 struct amdgpu_vm *vm,
194 struct dma_fence **fence);
194int amdgpu_vm_clear_invalids(struct amdgpu_device *adev, struct amdgpu_vm *vm, 195int amdgpu_vm_clear_invalids(struct amdgpu_device *adev, struct amdgpu_vm *vm,
195 struct amdgpu_sync *sync); 196 struct amdgpu_sync *sync);
196int amdgpu_vm_bo_update(struct amdgpu_device *adev, 197int amdgpu_vm_bo_update(struct amdgpu_device *adev,