Commit 8e0310f0 authored by Christian König's avatar Christian König

drm/radeon: stop using TTMs fault callback

We already implemented the fault handler ourself,
just open code what is necessary here.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarDave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/392322/
parent 0b5aebec
...@@ -775,7 +775,7 @@ void radeon_bo_move_notify(struct ttm_buffer_object *bo, ...@@ -775,7 +775,7 @@ void radeon_bo_move_notify(struct ttm_buffer_object *bo,
radeon_update_memory_usage(rbo, new_mem->mem_type, 1); radeon_update_memory_usage(rbo, new_mem->mem_type, 1);
} }
int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo) vm_fault_t radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
{ {
struct ttm_operation_ctx ctx = { false, false }; struct ttm_operation_ctx ctx = { false, false };
struct radeon_device *rdev; struct radeon_device *rdev;
...@@ -798,7 +798,7 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo) ...@@ -798,7 +798,7 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
/* Can't move a pinned BO to visible VRAM */ /* Can't move a pinned BO to visible VRAM */
if (rbo->tbo.pin_count > 0) if (rbo->tbo.pin_count > 0)
return -EINVAL; return VM_FAULT_SIGBUS;
/* hurrah the memory is not visible ! */ /* hurrah the memory is not visible ! */
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM); radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
...@@ -812,16 +812,20 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo) ...@@ -812,16 +812,20 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
r = ttm_bo_validate(bo, &rbo->placement, &ctx); r = ttm_bo_validate(bo, &rbo->placement, &ctx);
if (unlikely(r == -ENOMEM)) { if (unlikely(r == -ENOMEM)) {
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT); radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
return ttm_bo_validate(bo, &rbo->placement, &ctx); r = ttm_bo_validate(bo, &rbo->placement, &ctx);
} else if (unlikely(r != 0)) { } else if (likely(!r)) {
return r; offset = bo->mem.start << PAGE_SHIFT;
/* this should never happen */
if ((offset + size) > rdev->mc.visible_vram_size)
return VM_FAULT_SIGBUS;
} }
offset = bo->mem.start << PAGE_SHIFT; if (unlikely(r == -EBUSY || r == -ERESTARTSYS))
/* this should never happen */ return VM_FAULT_NOPAGE;
if ((offset + size) > rdev->mc.visible_vram_size) else if (unlikely(r))
return -EINVAL; return VM_FAULT_SIGBUS;
ttm_bo_move_to_lru_tail_unlocked(bo);
return 0; return 0;
} }
......
...@@ -163,7 +163,7 @@ extern int radeon_bo_check_tiling(struct radeon_bo *bo, bool has_moved, ...@@ -163,7 +163,7 @@ extern int radeon_bo_check_tiling(struct radeon_bo *bo, bool has_moved,
extern void radeon_bo_move_notify(struct ttm_buffer_object *bo, extern void radeon_bo_move_notify(struct ttm_buffer_object *bo,
bool evict, bool evict,
struct ttm_resource *new_mem); struct ttm_resource *new_mem);
extern int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo); extern vm_fault_t radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo);
extern int radeon_bo_get_surface_reg(struct radeon_bo *bo); extern int radeon_bo_get_surface_reg(struct radeon_bo *bo);
extern void radeon_bo_fence(struct radeon_bo *bo, struct radeon_fence *fence, extern void radeon_bo_fence(struct radeon_bo *bo, struct radeon_fence *fence,
bool shared); bool shared);
......
...@@ -803,7 +803,6 @@ static struct ttm_bo_driver radeon_bo_driver = { ...@@ -803,7 +803,6 @@ static struct ttm_bo_driver radeon_bo_driver = {
.move = &radeon_bo_move, .move = &radeon_bo_move,
.verify_access = &radeon_verify_access, .verify_access = &radeon_verify_access,
.move_notify = &radeon_bo_move_notify, .move_notify = &radeon_bo_move_notify,
.fault_reserve_notify = &radeon_bo_fault_reserve_notify,
.io_mem_reserve = &radeon_ttm_io_mem_reserve, .io_mem_reserve = &radeon_ttm_io_mem_reserve,
}; };
...@@ -904,17 +903,29 @@ void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size) ...@@ -904,17 +903,29 @@ void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size)
static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf) static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf)
{ {
struct ttm_buffer_object *bo; struct ttm_buffer_object *bo = vmf->vma->vm_private_data;
struct radeon_device *rdev; struct radeon_device *rdev = radeon_get_rdev(bo->bdev);
vm_fault_t ret; vm_fault_t ret;
bo = (struct ttm_buffer_object *)vmf->vma->vm_private_data;
if (bo == NULL)
return VM_FAULT_NOPAGE;
rdev = radeon_get_rdev(bo->bdev);
down_read(&rdev->pm.mclk_lock); down_read(&rdev->pm.mclk_lock);
ret = ttm_bo_vm_fault(vmf);
ret = ttm_bo_vm_reserve(bo, vmf);
if (ret)
goto unlock_mclk;
ret = radeon_bo_fault_reserve_notify(bo);
if (ret)
goto unlock_resv;
ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot,
TTM_BO_VM_NUM_PREFAULT, 1);
if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
goto unlock_mclk;
unlock_resv:
dma_resv_unlock(bo->base.resv);
unlock_mclk:
up_read(&rdev->pm.mclk_lock); up_read(&rdev->pm.mclk_lock);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment