[PATCH 45/45] cache1
Chris Wilson
chris at chris-wilson.co.uk
Wed Jul 29 20:44:05 UTC 2020
---
.../gpu/drm/i915/gem/i915_gem_execbuffer.c | 48 ++++++++++++++-----
.../drm/i915/gt/intel_gt_buffer_pool_types.h | 2 +-
2 files changed, 37 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index c44103a8a02f..f25991acf3e8 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -1958,12 +1958,26 @@ static unsigned int reloc_bb_flags(const struct reloc_cache *cache)
return cache->gen > 5 ? 0 : I915_DISPATCH_SECURE;
}
+static struct intel_gt_buffer_pool_node *reloc_node(struct i915_vma *vma)
+{
+ return vma->private;
+}
+
+static void reloc_close(struct reloc_cache *c)
+{
+ struct i915_vma *vma = c->head.vma;
+
+ do {
+ intel_gt_buffer_pool_put(reloc_node(vma));
+ vma = ((struct eb_relocs_link *)(c->map + c->max))->vma;
+ } while (vma);
+}
+
static int
reloc_gpu_flush(struct i915_execbuffer *eb, struct i915_request *rq, int err)
{
struct reloc_cache *cache = &eb->reloc_cache;
u32 *cs;
-
cs = (u32 *)(cache->map + cache->pos);
*cs++ = MI_BATCH_BUFFER_END;
__i915_gem_object_flush_map(cache->head.vma->obj,
@@ -2178,32 +2192,33 @@ eb_relocs_grow(struct i915_execbuffer *eb, unsigned long *count)
GEM_BUG_ON(c->pos > c->max);
remain = c->max - c->pos;
if (remain == 0) {
- struct drm_i915_gem_object *obj;
+ struct intel_gt_buffer_pool_node *pool;
struct i915_vma *vma;
struct eb_vma *ev;
- obj = i915_gem_object_create_internal(eb->i915, c->bufsz);
- if (IS_ERR(obj))
- return ERR_CAST(obj);
+ pool = intel_gt_get_buffer_pool(eb->engine->gt, c->bufsz);
+ if (IS_ERR(pool))
+ return ERR_CAST(pool);
+ i915_gem_object_set_readonly(pool->obj);
if (c->gen >= 6)
- i915_gem_object_set_cache_coherency(obj,
+ i915_gem_object_set_cache_coherency(pool->obj,
I915_CACHE_LLC);
- vma = i915_vma_instance(obj, eb->context->vm, NULL);
+ vma = i915_vma_instance(pool->obj, eb->context->vm, NULL);
if (IS_ERR(vma)) {
- i915_gem_object_put(obj);
+ intel_gt_buffer_pool_put(pool);
return ERR_CAST(vma);
}
ev = kzalloc(sizeof(*ev), GFP_KERNEL);
if (!ev) {
- i915_gem_object_put(obj);
+ intel_gt_buffer_pool_put(pool);
return ERR_PTR(-ENOMEM);
}
- vma->private = ev;
- ev->vma = vma;
+ vma->private = pool;
+ ev->vma = i915_vma_get(vma);
ev->exec = &no_entry;
ev->flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
list_add_tail(&ev->bind_link, &eb->bind_list);
@@ -2219,10 +2234,11 @@ eb_relocs_grow(struct i915_execbuffer *eb, unsigned long *count)
}
c->pos = 0;
- c->map = i915_gem_object_pin_map(obj, I915_MAP_WB);
+ c->map = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
if (IS_ERR(c->map))
return ERR_CAST(c->map);
+ memset(c->map + c->max, 0, sizeof(struct eb_relocs_link));
remain = c->max;
}
*count = min(remain, *count);
@@ -2325,6 +2341,8 @@ get_gpu_relocs(struct i915_execbuffer *eb,
i915_gem_object_flush_map(c->head.vma->obj);
i915_gem_object_unpin_map(c->head.vma->obj);
+ intel_gt_buffer_pool_put(reloc_node(c->head.vma));
+
c->head = link;
c->map = NULL;
}
@@ -2334,6 +2352,11 @@ get_gpu_relocs(struct i915_execbuffer *eb,
int err;
GEM_BUG_ON(!vma);
+
+ err = i915_active_add_request(&reloc_node(vma)->active, rq);
+ if (err < 0)
+ return ERR_PTR(err);
+
i915_vma_lock(vma);
err = i915_request_await_object(rq, vma->obj, false);
if (err == 0)
@@ -2426,6 +2449,7 @@ static int eb_relocs_gpu(struct i915_execbuffer *eb)
if (err)
break;
}
+ reloc_close(&eb->reloc_cache); /* release all remaining vma */
return reloc_gpu_flush(eb, rq, err);
}
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool_types.h b/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool_types.h
index bcf1658c9633..bb8b0312cb74 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_gt_buffer_pool_types.h
@@ -17,7 +17,7 @@ struct drm_i915_gem_object;
struct intel_gt_buffer_pool {
spinlock_t lock;
- struct list_head cache_list[4];
+ struct list_head cache_list[5];
struct delayed_work work;
};
--
2.20.1
More information about the Intel-gfx-trybot
mailing list