提交 95ff7c7d 编写于 作者: C Chris Wilson

drm/i915: Stash a pointer to the obj's resv in the vma

During execbuf, a mandatory step is that we add this request (this
fence) to each object's reservation_object. Inside execbuf, we track the
vma, and to add the fence to the reservation_object then means having to
first chase the obj, incurring another cache miss. We can reduce the
 number of cache misses by stashing a pointer to the reservation_object
in the vma itself.
Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: NJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170616140525.6394-1-chris@chris-wilson.co.uk
上级 7dd4f672
...@@ -1192,17 +1192,17 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb, ...@@ -1192,17 +1192,17 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
if (err) if (err)
goto err_request; goto err_request;
GEM_BUG_ON(!reservation_object_test_signaled_rcu(obj->resv, true)); GEM_BUG_ON(!reservation_object_test_signaled_rcu(batch->resv, true));
i915_vma_move_to_active(batch, rq, 0); i915_vma_move_to_active(batch, rq, 0);
reservation_object_lock(obj->resv, NULL); reservation_object_lock(batch->resv, NULL);
reservation_object_add_excl_fence(obj->resv, &rq->fence); reservation_object_add_excl_fence(batch->resv, &rq->fence);
reservation_object_unlock(obj->resv); reservation_object_unlock(batch->resv);
i915_vma_unpin(batch); i915_vma_unpin(batch);
i915_vma_move_to_active(vma, rq, true); i915_vma_move_to_active(vma, rq, true);
reservation_object_lock(vma->obj->resv, NULL); reservation_object_lock(vma->resv, NULL);
reservation_object_add_excl_fence(vma->obj->resv, &rq->fence); reservation_object_add_excl_fence(vma->resv, &rq->fence);
reservation_object_unlock(vma->obj->resv); reservation_object_unlock(vma->resv);
rq->batch = batch; rq->batch = batch;
...@@ -1252,7 +1252,6 @@ relocate_entry(struct i915_vma *vma, ...@@ -1252,7 +1252,6 @@ relocate_entry(struct i915_vma *vma,
struct i915_execbuffer *eb, struct i915_execbuffer *eb,
const struct i915_vma *target) const struct i915_vma *target)
{ {
struct drm_i915_gem_object *obj = vma->obj;
u64 offset = reloc->offset; u64 offset = reloc->offset;
u64 target_offset = relocation_target(reloc, target); u64 target_offset = relocation_target(reloc, target);
bool wide = eb->reloc_cache.use_64bit_reloc; bool wide = eb->reloc_cache.use_64bit_reloc;
...@@ -1260,7 +1259,7 @@ relocate_entry(struct i915_vma *vma, ...@@ -1260,7 +1259,7 @@ relocate_entry(struct i915_vma *vma,
if (!eb->reloc_cache.vaddr && if (!eb->reloc_cache.vaddr &&
(DBG_FORCE_RELOC == FORCE_GPU_RELOC || (DBG_FORCE_RELOC == FORCE_GPU_RELOC ||
!reservation_object_test_signaled_rcu(obj->resv, true))) { !reservation_object_test_signaled_rcu(vma->resv, true))) {
const unsigned int gen = eb->reloc_cache.gen; const unsigned int gen = eb->reloc_cache.gen;
unsigned int len; unsigned int len;
u32 *batch; u32 *batch;
...@@ -1320,7 +1319,7 @@ relocate_entry(struct i915_vma *vma, ...@@ -1320,7 +1319,7 @@ relocate_entry(struct i915_vma *vma,
} }
repeat: repeat:
vaddr = reloc_vaddr(obj, &eb->reloc_cache, offset >> PAGE_SHIFT); vaddr = reloc_vaddr(vma->obj, &eb->reloc_cache, offset >> PAGE_SHIFT);
if (IS_ERR(vaddr)) if (IS_ERR(vaddr))
return PTR_ERR(vaddr); return PTR_ERR(vaddr);
...@@ -1793,11 +1792,11 @@ static int eb_relocate(struct i915_execbuffer *eb) ...@@ -1793,11 +1792,11 @@ static int eb_relocate(struct i915_execbuffer *eb)
return eb_relocate_slow(eb); return eb_relocate_slow(eb);
} }
static void eb_export_fence(struct drm_i915_gem_object *obj, static void eb_export_fence(struct i915_vma *vma,
struct drm_i915_gem_request *req, struct drm_i915_gem_request *req,
unsigned int flags) unsigned int flags)
{ {
struct reservation_object *resv = obj->resv; struct reservation_object *resv = vma->resv;
/* /*
* Ignore errors from failing to allocate the new fence, we can't * Ignore errors from failing to allocate the new fence, we can't
...@@ -1856,7 +1855,7 @@ static int eb_move_to_gpu(struct i915_execbuffer *eb) ...@@ -1856,7 +1855,7 @@ static int eb_move_to_gpu(struct i915_execbuffer *eb)
const struct drm_i915_gem_exec_object2 *entry = &eb->exec[i]; const struct drm_i915_gem_exec_object2 *entry = &eb->exec[i];
struct i915_vma *vma = exec_to_vma(entry); struct i915_vma *vma = exec_to_vma(entry);
eb_export_fence(vma->obj, eb->request, entry->flags); eb_export_fence(vma, eb->request, entry->flags);
if (unlikely(entry->flags & __EXEC_OBJECT_HAS_REF)) if (unlikely(entry->flags & __EXEC_OBJECT_HAS_REF))
i915_vma_put(vma); i915_vma_put(vma);
} }
......
...@@ -90,6 +90,7 @@ vma_create(struct drm_i915_gem_object *obj, ...@@ -90,6 +90,7 @@ vma_create(struct drm_i915_gem_object *obj,
init_request_active(&vma->last_fence, NULL); init_request_active(&vma->last_fence, NULL);
vma->vm = vm; vma->vm = vm;
vma->obj = obj; vma->obj = obj;
vma->resv = obj->resv;
vma->size = obj->base.size; vma->size = obj->base.size;
vma->display_alignment = I915_GTT_MIN_ALIGNMENT; vma->display_alignment = I915_GTT_MIN_ALIGNMENT;
......
...@@ -50,6 +50,7 @@ struct i915_vma { ...@@ -50,6 +50,7 @@ struct i915_vma {
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj;
struct i915_address_space *vm; struct i915_address_space *vm;
struct drm_i915_fence_reg *fence; struct drm_i915_fence_reg *fence;
struct reservation_object *resv; /** Alias of obj->resv */
struct sg_table *pages; struct sg_table *pages;
void __iomem *iomap; void __iomem *iomap;
u64 size; u64 size;
...@@ -111,8 +112,8 @@ struct i915_vma { ...@@ -111,8 +112,8 @@ struct i915_vma {
/** /**
* Used for performing relocations during execbuffer insertion. * Used for performing relocations during execbuffer insertion.
*/ */
struct hlist_node exec_node;
struct drm_i915_gem_exec_object2 *exec_entry; struct drm_i915_gem_exec_object2 *exec_entry;
struct hlist_node exec_node;
u32 exec_handle; u32 exec_handle;
struct i915_gem_context *ctx; struct i915_gem_context *ctx;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册