Skip to content

Commit

Permalink
drm/radeon: update the VM after setting BO address v4
Browse files Browse the repository at this point in the history
This way the necessary VM update is kicked off immediately
if all BOs involved are in GPU accessible memory.

v2: fix vm lock
v3: immediately update unmaps as well
v4: use drm_free_large instead of kfree

Tested-by: Kai Wasserbäch <kai@dev.carbon-project.org>
Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
  • Loading branch information
Christian König authored and Alex Deucher committed Nov 20, 2014
1 parent d1968e1 commit 2f2624c
Showing 1 changed file with 64 additions and 0 deletions.
64 changes: 64 additions & 0 deletions drivers/gpu/drm/radeon/radeon_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,68 @@ int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data,
return r;
}

/**
* radeon_gem_va_update_vm -update the bo_va in its VM
*
* @rdev: radeon_device pointer
* @bo_va: bo_va to update
*
* Update the bo_va directly after setting it's address. Errors are not
* vital here, so they are not reported back to userspace.
*/
static void radeon_gem_va_update_vm(struct radeon_device *rdev,
struct radeon_bo_va *bo_va)
{
struct ttm_validate_buffer tv, *entry;
struct radeon_cs_reloc *vm_bos;
struct ww_acquire_ctx ticket;
struct list_head list;
unsigned domain;
int r;

INIT_LIST_HEAD(&list);

tv.bo = &bo_va->bo->tbo;
tv.shared = true;
list_add(&tv.head, &list);

vm_bos = radeon_vm_get_bos(rdev, bo_va->vm, &list);
if (!vm_bos)
return;

r = ttm_eu_reserve_buffers(&ticket, &list, true);
if (r)
goto error_free;

list_for_each_entry(entry, &list, head) {
domain = radeon_mem_type_to_domain(entry->bo->mem.mem_type);
/* if anything is swapped out don't swap it in here,
just abort and wait for the next CS */
if (domain == RADEON_GEM_DOMAIN_CPU)
goto error_unreserve;
}

mutex_lock(&bo_va->vm->mutex);
r = radeon_vm_clear_freed(rdev, bo_va->vm);
if (r)
goto error_unlock;

if (bo_va->it.start)
r = radeon_vm_bo_update(rdev, bo_va, &bo_va->bo->tbo.mem);

error_unlock:
mutex_unlock(&bo_va->vm->mutex);

error_unreserve:
ttm_eu_backoff_reservation(&ticket, &list);

error_free:
drm_free_large(vm_bos);

if (r)
DRM_ERROR("Couldn't update BO_VA (%d)\n", r);
}

int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
struct drm_file *filp)
{
Expand Down Expand Up @@ -612,6 +674,8 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
default:
break;
}
if (!r)
radeon_gem_va_update_vm(rdev, bo_va);
args->operation = RADEON_VA_RESULT_OK;
if (r) {
args->operation = RADEON_VA_RESULT_ERROR;
Expand Down

0 comments on commit 2f2624c

Please sign in to comment.