Skip to content

Commit

Permalink
drm/i915/gtt: Allocate va range only if vma is not bound
Browse files Browse the repository at this point in the history
When we have bound vma into an address space, the layout
of page table structures is immutable. So we can be absolutely
certain that if vma is already bound, there is no need to
(re)allocate a virtual address range for it.

v2: - add sanity checks and remove superfluous GLOBAL_BIND set
    - we might do update for an unbound vma (Chris)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90224
Testcase: igt/gem_exec_big #bdw
Reported-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Michel Thierry <michel.thierry@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
  • Loading branch information
Mika Kuoppala authored and Jani Nikula committed Apr 30, 2015
1 parent 245054a commit 75d04a3
Showing 1 changed file with 22 additions and 17 deletions.
39 changes: 22 additions & 17 deletions drivers/gpu/drm/i915/i915_gem_gtt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1928,8 +1928,6 @@ static int ggtt_bind_vma(struct i915_vma *vma,
vma->vm->insert_entries(vma->vm, pages,
vma->node.start,
cache_level, pte_flags);

vma->bound |= GLOBAL_BIND;
}

if (dev_priv->mm.aliasing_ppgtt && flags & LOCAL_BIND) {
Expand Down Expand Up @@ -2804,21 +2802,13 @@ i915_get_ggtt_vma_pages(struct i915_vma *vma)
int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
u32 flags)
{
int ret = 0;
u32 bind_flags = 0;

if (vma->vm->allocate_va_range) {
trace_i915_va_alloc(vma->vm, vma->node.start,
vma->node.size,
VM_TO_TRACE_NAME(vma->vm));
int ret;
u32 bind_flags;

ret = vma->vm->allocate_va_range(vma->vm,
vma->node.start,
vma->node.size);
if (ret)
return ret;
}
if (WARN_ON(flags == 0))
return -EINVAL;

bind_flags = 0;
if (flags & PIN_GLOBAL)
bind_flags |= GLOBAL_BIND;
if (flags & PIN_USER)
Expand All @@ -2829,8 +2819,23 @@ int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
else
bind_flags &= ~vma->bound;

if (bind_flags)
ret = vma->vm->bind_vma(vma, cache_level, bind_flags);
if (bind_flags == 0)
return 0;

if (vma->bound == 0 && vma->vm->allocate_va_range) {
trace_i915_va_alloc(vma->vm,
vma->node.start,
vma->node.size,
VM_TO_TRACE_NAME(vma->vm));

ret = vma->vm->allocate_va_range(vma->vm,
vma->node.start,
vma->node.size);
if (ret)
return ret;
}

ret = vma->vm->bind_vma(vma, cache_level, bind_flags);
if (ret)
return ret;

Expand Down

0 comments on commit 75d04a3

Please sign in to comment.