diff options
author | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2017-03-23 14:36:31 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-03-29 23:54:15 -0400 |
commit | f34678187a339702256c70c88c3db2d1975484ce (patch) | |
tree | 2f762f5ef7ecaebfc654ffe03da435f4abd8ddfa /drivers/gpu | |
parent | 923d26db85e8188bdbfeb7f8d70dfd86d901d4f0 (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.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 3 |
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 | */ |
1391 | int amdgpu_vm_clear_freed(struct amdgpu_device *adev, | 1393 | int 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); | |||
190 | int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, | 190 | int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, |
191 | struct amdgpu_vm *vm); | 191 | struct amdgpu_vm *vm); |
192 | int amdgpu_vm_clear_freed(struct amdgpu_device *adev, | 192 | int amdgpu_vm_clear_freed(struct amdgpu_device *adev, |
193 | struct amdgpu_vm *vm); | 193 | struct amdgpu_vm *vm, |
194 | struct dma_fence **fence); | ||
194 | int amdgpu_vm_clear_invalids(struct amdgpu_device *adev, struct amdgpu_vm *vm, | 195 | int amdgpu_vm_clear_invalids(struct amdgpu_device *adev, struct amdgpu_vm *vm, |
195 | struct amdgpu_sync *sync); | 196 | struct amdgpu_sync *sync); |
196 | int amdgpu_vm_bo_update(struct amdgpu_device *adev, | 197 | int amdgpu_vm_bo_update(struct amdgpu_device *adev, |