]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: Don't use GPU relocations prior to cmdparser stalls
authorChris Wilson <chris@chris-wilson.co.uk>
Sat, 26 Aug 2017 13:56:20 +0000 (14:56 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 29 Aug 2017 09:41:33 +0000 (10:41 +0100)
If we are using the cmdparser, we will have to copy the batch and so
stall for the relocations. Rather than prolong that stall by adding more
relocation requests, just use CPU relocations and do the stall upfront.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170826135620.25949-1-chris@chris-wilson.co.uk
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
drivers/gpu/drm/i915/i915_gem_execbuffer.c

index dcce69a23309a102fc7530cfc76b666779fc37d2..7741c1c39037fbf90bdc976a2c4e69fa76bc1d36 100644 (file)
@@ -268,6 +268,11 @@ static inline u64 gen8_noncanonical_addr(u64 address)
        return address & GENMASK_ULL(GEN8_HIGH_ADDRESS_BIT, 0);
 }
 
+static inline bool eb_use_cmdparser(const struct i915_execbuffer *eb)
+{
+       return eb->engine->needs_cmd_parser && eb->batch_len;
+}
+
 static int eb_create(struct i915_execbuffer *eb)
 {
        if (!(eb->args->flags & I915_EXEC_HANDLE_LUT)) {
@@ -1159,6 +1164,10 @@ static u32 *reloc_gpu(struct i915_execbuffer *eb,
        if (unlikely(!cache->rq)) {
                int err;
 
+               /* If we need to copy for the cmdparser, we will stall anyway */
+               if (eb_use_cmdparser(eb))
+                       return ERR_PTR(-EWOULDBLOCK);
+
                err = __reloc_gpu_alloc(eb, vma, len);
                if (unlikely(err))
                        return ERR_PTR(err);
@@ -2293,7 +2302,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,
                goto err_vma;
        }
 
-       if (eb.engine->needs_cmd_parser && eb.batch_len) {
+       if (eb_use_cmdparser(&eb)) {
                struct i915_vma *vma;
 
                vma = eb_parse(&eb, drm_is_current_master(file));