diff options
author | Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> | 2016-07-21 18:43:16 -0400 |
---|---|---|
committer | John Bridgman <john.bridgman@amd.com> | 2016-08-27 22:28:24 -0400 |
commit | 357259e5b104fafe18b38a9209ed25f3412f4f4b (patch) | |
tree | d194e8f39f0024f29c176cc22724c786f3da9b3d | |
parent | 1e62a0fe5ca4ea7698e017114324a49005b16b4f (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.c | 117 |
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); |