[Intel-gfx] [PATCH 2/2] drm/i915/gem: Fallback to using a plain kmap if reloc address space is limited

Chris Wilson chris at chris-wilson.co.uk
Wed Aug 19 10:39:52 UTC 2020


Since the processor may not support vmap with WC, or the system may be
limited in virtual address space and so may fail to create such a vmap,
fallback to using a plain kmap of the system pages and flush the buffer
on completion.

Reported-by: Pavel Machek <pavel at ucw.cz>
Fixes: 964a9b0f611e ("drm/i915/gem: Use chained reloc batches")
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
Cc: Pavel Machek <pavel at ucw.cz>
Cc: <stable at vger.kernel.org> # v5.8+
---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    | 25 +++++++++++++------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index a09f04eee417..44df98d85b38 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -950,6 +950,21 @@ static void reloc_cache_init(struct reloc_cache *cache,
 
 #define RELOC_TAIL 4
 
+static u32 *__reloc_gpu_map(struct reloc_cache *cache,
+			    struct intel_gt_buffer_pool_node *pool)
+{
+	u32 *map;
+
+	map = i915_gem_object_pin_map(pool->obj,
+				      cache->has_llc ?
+				      I915_MAP_FORCE_WB :
+				      I915_MAP_FORCE_WC);
+	if (IS_ERR(map)) /* try a plain kmap (and flush) if no WC maps */
+		map = i915_gem_object_pin_map(pool->obj, I915_MAP_FORCE_WB);
+
+	return map;
+}
+
 static int reloc_gpu_chain(struct reloc_cache *cache)
 {
 	struct intel_gt_buffer_pool_node *pool;
@@ -996,10 +1011,7 @@ static int reloc_gpu_chain(struct reloc_cache *cache)
 	*cmd++ = lower_32_bits(batch->node.start);
 	*cmd++ = upper_32_bits(batch->node.start); /* Always 0 for gen<8 */
 
-	cmd = i915_gem_object_pin_map(batch->obj,
-				      cache->has_llc ?
-				      I915_MAP_FORCE_WB :
-				      I915_MAP_FORCE_WC);
+	cmd = __reloc_gpu_map(cache, pool);
 	if (IS_ERR(cmd)) {
 		/* We will replace the BBS with BBE upon flushing the rq */
 		err = PTR_ERR(cmd);
@@ -1096,10 +1108,7 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
 	if (IS_ERR(pool))
 		return PTR_ERR(pool);
 
-	cmd = i915_gem_object_pin_map(pool->obj,
-				      cache->has_llc ?
-				      I915_MAP_FORCE_WB :
-				      I915_MAP_FORCE_WC);
+	cmd = __reloc_gpu_map(cache, pool);
 	if (IS_ERR(cmd)) {
 		err = PTR_ERR(cmd);
 		goto out_pool;
-- 
2.20.1



More information about the Intel-gfx mailing list