summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>2016-07-21 18:43:16 -0400
committerJohn Bridgman <john.bridgman@amd.com>2016-08-27 22:28:24 -0400
commit357259e5b104fafe18b38a9209ed25f3412f4f4b (patch)
treed194e8f39f0024f29c176cc22724c786f3da9b3d
parent1e62a0fe5ca4ea7698e017114324a49005b16b4f (diff)
drm/amdgpu: Remove pinning of kfd process PD/PT BOkfd-eviction-wip
Change-Id: I3ea2109aa34984a47798c29a6a712937c4d4150b Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c117
1 files changed, 25 insertions, 92 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 54757083564e..2d51110a1151 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -247,56 +247,6 @@ static void remove_bo_from_vm(struct amdgpu_device *adev,
kfree(entry);
}
-
-static int try_pin_bo(struct amdgpu_bo *bo, uint32_t domain)
-{
- int ret = 0;
-
- if (!amdgpu_ttm_tt_get_usermm(bo->tbo.ttm)) {
- ret = amdgpu_bo_pin(bo, domain, NULL);
- if (ret != 0)
- goto error;
- } else {
- /* amdgpu_bo_pin doesn't support userptr. Therefore we
- * can use the bo->pin_count for our version of
- * pinning without conflict. */
- if (bo->pin_count == 0) {
- amdgpu_ttm_placement_from_domain(bo, domain);
- ret = ttm_bo_validate(&bo->tbo, &bo->placement,
- true, false);
- if (ret != 0) {
- pr_err("amdgpu: failed to validate BO\n");
- goto error;
- }
- }
- bo->pin_count++;
- }
-
-error:
- return ret;
-}
-
-static int unpin_bo(struct amdgpu_bo *bo)
-{
- int ret = 0;
-
- if (!amdgpu_ttm_tt_get_usermm(bo->tbo.ttm)) {
- ret = amdgpu_bo_unpin(bo);
- if (ret != 0)
- goto error;
- } else if (--bo->pin_count == 0) {
- amdgpu_ttm_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_CPU);
- ret = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
- if (ret != 0) {
- pr_err("amdgpu: failed to validate BO\n");
- goto error;
- }
- }
-
-error:
- return ret;
-}
-
static int amdgpu_amdkfd_bo_validate(struct amdgpu_bo *bo, uint32_t domain)
{
int ret = 0;
@@ -335,43 +285,37 @@ static int amdgpu_amdkfd_bo_invalidate(struct amdgpu_bo *bo)
return ret;
}
-static int try_pin_pts(struct amdgpu_vm *vm)
+static int validate_pt_pd_bos(struct amdgpu_vm *vm)
{
int i, ret = 0;
- struct amdgpu_bo *bo;
+ struct amdgpu_bo *bo, *pd = vm->page_directory;
+ struct amdkfd_vm *kvm = container_of(vm, struct amdkfd_vm, base);
- /* only pin PTs not yet pinned*/
+ /* PTs share same reservation object as PD. So only fence PD */
for (i = 0; i <= vm->max_pde_used; ++i) {
bo = vm->page_tables[i].entry.robj;
- if (!bo || bo->pin_count)
+ if (!bo)
continue;
- ret = try_pin_bo(bo, AMDGPU_GEM_DOMAIN_VRAM);
+ amdgpu_ttm_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
+ ret = ttm_bo_validate(&bo->tbo, &bo->placement,
+ false, false);
if (ret != 0) {
- pr_err("amdgpu: failed to pin PTE %d\n", i);
+ pr_err("amdgpu: failed to validate PTE %d\n", i);
break;
}
}
- return ret;
-}
-
-static void unpin_pts(struct amdgpu_vm *vm)
-{
- int i;
- struct amdgpu_bo *bo;
-
- for (i = vm->max_pde_used; i >= 0; --i) {
- bo = vm->page_tables[i].entry.robj;
-
- if (!bo || !bo->pin_count)
- continue;
-
- amdgpu_bo_reserve(bo, true);
- unpin_bo(bo);
- amdgpu_bo_unreserve(bo);
+ amdgpu_ttm_placement_from_domain(pd, AMDGPU_GEM_DOMAIN_VRAM);
+ ret = ttm_bo_validate(&pd->tbo, &pd->placement, false, false);
+ if (ret != 0) {
+ pr_err("amdgpu: failed to validate PD\n");
+ return ret;
}
+ amdgpu_bo_fence(pd, &kvm->master->eviction_fence->base, true);
+
+ return ret;
}
/**
@@ -868,9 +812,9 @@ static int map_bo_to_gpuvm(struct amdgpu_device *adev, struct amdgpu_bo *bo,
vm = bo_va->vm;
/* Pin PTs */
- ret = try_pin_pts(vm);
+ ret = validate_pt_pd_bos(vm);
if (ret != 0) {
- pr_err("amdkfd: Failed to pin PTs\n");
+ pr_err("amdkfd: Failed to validate PTs\n");
goto err_unpin_bo;
}
@@ -1182,7 +1126,6 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm,
{
int ret;
struct amdkfd_vm *new_vm;
- struct amdgpu_bo *pd;
bool vm_update_using_cpu;
struct amdgpu_device *adev = get_amdgpu_device(kgd);
@@ -1233,14 +1176,6 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm,
if (ret != 0)
pr_err("amdgpu: Failed to amdgpu_vm_clear_freed\n");
- /* Pin the PD directory */
- pd = new_vm->base.page_directory;
- amdgpu_bo_reserve(pd, true);
- ret = try_pin_bo(pd, AMDGPU_GEM_DOMAIN_VRAM);
- amdgpu_bo_unreserve(pd);
- if (ret != 0)
- pr_err("amdkfd: Failed to pin PD\n");
-
pr_debug("amdgpu: created process vm with address 0x%llx\n",
amdgpu_bo_gpu_offset(new_vm->base.page_directory));
@@ -1265,18 +1200,16 @@ void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm)
BUG_ON(vm == NULL);
pr_debug("Destroying process vm with address %p\n", vm);
+ /* Release eviction fence from PD */
+ pd = avm->page_directory;
+ amdgpu_bo_reserve(pd, false);
+ amdgpu_bo_fence(pd, NULL, false);
+ amdgpu_bo_unreserve(pd);
+
/* Release eviction fence */
if (kfd_vm->master == kfd_vm && kfd_vm->eviction_fence != NULL)
fence_put(&kfd_vm->eviction_fence->base);
- /* Unpin PTs */
- unpin_pts(avm);
- /* Unpin PD*/
- pd = avm->page_directory;
- amdgpu_bo_reserve(pd, true);
- unpin_bo(pd);
- amdgpu_bo_unreserve(pd);
-
/* Release the VM context */
amdgpu_vm_fini(adev, avm);
kfree(vm);