[PATCH 45/45] cache1

Chris Wilson chris at chris-wilson.co.uk
Wed Jul 29 14:03:30 UTC 2020


---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    | 45 ++++++++++++++-----
 1 file changed, 34 insertions(+), 11 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..e74f99693e41 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -1958,6 +1958,19 @@ 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)
+{
+	while (c->head.vma) {
+		intel_gt_buffer_pool_put(reloc_node(c->head.vma));
+		c->head = *(struct eb_relocs_link *)(c->map + c->max);
+	}
+}
+
 static int
 reloc_gpu_flush(struct i915_execbuffer *eb, struct i915_request *rq, int err)
 {
@@ -1969,6 +1982,7 @@ reloc_gpu_flush(struct i915_execbuffer *eb, struct i915_request *rq, int err)
 	__i915_gem_object_flush_map(cache->head.vma->obj,
 				    0, (void *)cs - (void *)cache->map);
 	i915_gem_object_unpin_map(cache->head.vma->obj);
+	reloc_close(cache); /* release the remaining vma on an error flush */
 
 	if (rq->engine->emit_init_breadcrumb)
 		err = rq->engine->emit_init_breadcrumb(rq);
@@ -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)
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list