Commit 3d6792cf authored by Chris Wilson's avatar Chris Wilson

drm/i915: Forgo last_fence active request tracking

We were using the last_fence to track the last request that used this
vma that might be interpreted by a fence register and forced ourselves
to wait for this request before modifying any fence register that
overlapped our vma. Due to requirement that we need to track any XY_BLT
command, linear or tiled, this in effect meant that we have to track the
vma for its active lifespan anyway, so we can forgo the explicit
last_fence tracking and just use the whole vma->active.

Another solution would be to pipeline the register updates, and would
help resolve some long running stalls for gen3 (but only gen 2 and 3!)
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190812174804.26180-1-chris@chris-wilson.co.uk
parent cf1c97dc
...@@ -212,9 +212,7 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) ...@@ -212,9 +212,7 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
} }
} }
if (vma->fence) if (vma->fence)
seq_printf(m, " , fence: %d%s", seq_printf(m, " , fence: %d", vma->fence->id);
vma->fence->id,
i915_active_request_isset(&vma->last_fence) ? "*" : "");
seq_puts(m, ")"); seq_puts(m, ")");
spin_lock(&obj->vma.lock); spin_lock(&obj->vma.lock);
......
...@@ -230,16 +230,14 @@ static int fence_update(struct i915_fence_reg *fence, ...@@ -230,16 +230,14 @@ static int fence_update(struct i915_fence_reg *fence,
i915_gem_object_get_tiling(vma->obj))) i915_gem_object_get_tiling(vma->obj)))
return -EINVAL; return -EINVAL;
ret = i915_active_request_retire(&vma->last_fence, ret = i915_active_wait(&vma->active);
&vma->obj->base.dev->struct_mutex);
if (ret) if (ret)
return ret; return ret;
} }
old = xchg(&fence->vma, NULL); old = xchg(&fence->vma, NULL);
if (old) { if (old) {
ret = i915_active_request_retire(&old->last_fence, ret = i915_active_wait(&old->active);
&old->obj->base.dev->struct_mutex);
if (ret) { if (ret) {
fence->vma = old; fence->vma = old;
return ret; return ret;
......
...@@ -1867,7 +1867,6 @@ static struct i915_vma *pd_vma_create(struct gen6_ppgtt *ppgtt, int size) ...@@ -1867,7 +1867,6 @@ static struct i915_vma *pd_vma_create(struct gen6_ppgtt *ppgtt, int size)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
i915_active_init(i915, &vma->active, NULL, NULL); i915_active_init(i915, &vma->active, NULL, NULL);
INIT_ACTIVE_REQUEST(&vma->last_fence);
vma->vm = &ggtt->vm; vma->vm = &ggtt->vm;
vma->ops = &pd_vma_ops; vma->ops = &pd_vma_ops;
......
...@@ -120,7 +120,6 @@ vma_create(struct drm_i915_gem_object *obj, ...@@ -120,7 +120,6 @@ vma_create(struct drm_i915_gem_object *obj,
i915_active_init(vm->i915, &vma->active, i915_active_init(vm->i915, &vma->active,
__i915_vma_active, __i915_vma_retire); __i915_vma_active, __i915_vma_retire);
INIT_ACTIVE_REQUEST(&vma->last_fence);
/* Declare ourselves safe for use inside shrinkers */ /* Declare ourselves safe for use inside shrinkers */
if (IS_ENABLED(CONFIG_LOCKDEP)) { if (IS_ENABLED(CONFIG_LOCKDEP)) {
...@@ -802,8 +801,6 @@ static void __i915_vma_destroy(struct i915_vma *vma) ...@@ -802,8 +801,6 @@ static void __i915_vma_destroy(struct i915_vma *vma)
GEM_BUG_ON(vma->node.allocated); GEM_BUG_ON(vma->node.allocated);
GEM_BUG_ON(vma->fence); GEM_BUG_ON(vma->fence);
GEM_BUG_ON(i915_active_request_isset(&vma->last_fence));
mutex_lock(&vma->vm->mutex); mutex_lock(&vma->vm->mutex);
list_del(&vma->vm_link); list_del(&vma->vm_link);
mutex_unlock(&vma->vm->mutex); mutex_unlock(&vma->vm->mutex);
...@@ -928,9 +925,6 @@ int i915_vma_move_to_active(struct i915_vma *vma, ...@@ -928,9 +925,6 @@ int i915_vma_move_to_active(struct i915_vma *vma,
obj->read_domains |= I915_GEM_GPU_DOMAINS; obj->read_domains |= I915_GEM_GPU_DOMAINS;
obj->mm.dirty = true; obj->mm.dirty = true;
if (flags & EXEC_OBJECT_NEEDS_FENCE)
__i915_active_request_set(&vma->last_fence, rq);
GEM_BUG_ON(!i915_vma_is_active(vma)); GEM_BUG_ON(!i915_vma_is_active(vma));
return 0; return 0;
} }
...@@ -961,14 +955,7 @@ int i915_vma_unbind(struct i915_vma *vma) ...@@ -961,14 +955,7 @@ int i915_vma_unbind(struct i915_vma *vma)
* before we are finished). * before we are finished).
*/ */
__i915_vma_pin(vma); __i915_vma_pin(vma);
ret = i915_active_wait(&vma->active); ret = i915_active_wait(&vma->active);
if (ret)
goto unpin;
ret = i915_active_request_retire(&vma->last_fence,
&vma->vm->i915->drm.struct_mutex);
unpin:
__i915_vma_unpin(vma); __i915_vma_unpin(vma);
if (ret) if (ret)
return ret; return ret;
......
...@@ -111,7 +111,6 @@ struct i915_vma { ...@@ -111,7 +111,6 @@ struct i915_vma {
#define I915_VMA_GGTT_WRITE BIT(14) #define I915_VMA_GGTT_WRITE BIT(14)
struct i915_active active; struct i915_active active;
struct i915_active_request last_fence;
/** /**
* Support different GGTT views into the same object. * Support different GGTT views into the same object.
......
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