Skip to content

Commit

Permalink
drm/i915: First try the previous execbuffer location
Browse files Browse the repository at this point in the history
When choosing a slot for an execbuffer, we ideally want to use the same
address as last time (so that we don't have to rebind it) and the same
address as expected by the user (so that we don't have to fixup any
relocations pointing to it). If we first try to bind the incoming
execbuffer->offset from the user, or the currently bound offset that
should hopefully achieve the goal of avoiding the rebind cost and the
relocation penalty. However, if the object is not currently bound there
we don't want to arbitrarily unbind an object in our chosen position and
so choose to rebind/relocate the incoming object instead. After we
report the new position back to the user, on the next pass the
relocations should have settled down.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtien@linux.intel.com>
  • Loading branch information
Chris Wilson committed Jun 16, 2017
1 parent dade2a6 commit 616d9ce
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 4 deletions.
12 changes: 8 additions & 4 deletions drivers/gpu/drm/i915/i915_gem_execbuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,10 +336,15 @@ eb_pin_vma(struct i915_execbuffer *eb,
{
u64 flags;

flags = vma->node.start;
flags |= PIN_USER | PIN_NONBLOCK | PIN_OFFSET_FIXED;
if (vma->node.size)
flags = vma->node.start;
else
flags = entry->offset & PIN_OFFSET_MASK;

flags |= PIN_USER | PIN_NOEVICT | PIN_OFFSET_FIXED;
if (unlikely(entry->flags & EXEC_OBJECT_NEEDS_GTT))
flags |= PIN_GLOBAL;

if (unlikely(i915_vma_pin(vma, 0, 0, flags)))
return;

Expand Down Expand Up @@ -469,8 +474,7 @@ eb_add_vma(struct i915_execbuffer *eb,
__exec_to_vma(entry) = (uintptr_t)vma;

err = 0;
if (vma->node.size)
eb_pin_vma(eb, entry, vma);
eb_pin_vma(eb, entry, vma);
if (eb_vma_misplaced(entry, vma)) {
eb_unreserve_vma(vma, entry);

Expand Down
6 changes: 6 additions & 0 deletions drivers/gpu/drm/i915/i915_gem_gtt.c
Original file line number Diff line number Diff line change
Expand Up @@ -3402,6 +3402,9 @@ int i915_gem_gtt_reserve(struct i915_address_space *vm,
if (err != -ENOSPC)
return err;

if (flags & PIN_NOEVICT)
return -ENOSPC;

err = i915_gem_evict_for_node(vm, node, flags);
if (err == 0)
err = drm_mm_reserve_node(&vm->mm, node);
Expand Down Expand Up @@ -3516,6 +3519,9 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
if (err != -ENOSPC)
return err;

if (flags & PIN_NOEVICT)
return -ENOSPC;

/* No free space, pick a slot at random.
*
* There is a pathological case here using a GTT shared between
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/i915/i915_gem_gtt.h
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,7 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
#define PIN_MAPPABLE BIT(1)
#define PIN_ZONE_4G BIT(2)
#define PIN_NONFAULT BIT(3)
#define PIN_NOEVICT BIT(4)

#define PIN_MBZ BIT(5) /* I915_VMA_PIN_OVERFLOW */
#define PIN_GLOBAL BIT(6) /* I915_VMA_GLOBAL_BIND */
Expand Down

0 comments on commit 616d9ce

Please sign in to comment.