]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
drm/i915: fix pm refcounting on fence error in execbuf
authorDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Fri, 3 Feb 2017 22:45:29 +0000 (14:45 -0800)
committerChris Wilson <chris@chris-wilson.co.uk>
Sat, 4 Feb 2017 09:42:07 +0000 (09:42 +0000)
Fences are creted/checked before the pm ref is taken, so if we jump to
pre_mutex_err we will uncorrectly call intel_runtime_pm_put.

v2: Massage unwind error paths

Fixes: fec0445caa27 (drm/i915: Support explicit fencing for execbuf)
Testcase: igt/gem_exec_params
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1486161930-11764-1-git-send-email-daniele.ceraolospurio@intel.com
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/i915_gem_execbuffer.c

index 91c2393199a316c9f1487a45073df21731d767df..26c26a6675df0e9df4fa374476a63cb728a7892b 100644 (file)
@@ -1644,18 +1644,15 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
 
        if (args->flags & I915_EXEC_FENCE_IN) {
                in_fence = sync_file_get_fence(lower_32_bits(args->rsvd2));
-               if (!in_fence) {
-                       ret = -EINVAL;
-                       goto pre_mutex_err;
-               }
+               if (!in_fence)
+                       return -EINVAL;
        }
 
        if (args->flags & I915_EXEC_FENCE_OUT) {
                out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
                if (out_fence_fd < 0) {
                        ret = out_fence_fd;
-                       out_fence_fd = -1;
-                       goto pre_mutex_err;
+                       goto err_in_fence;
                }
        }
 
@@ -1878,6 +1875,7 @@ pre_mutex_err:
        intel_runtime_pm_put(dev_priv);
        if (out_fence_fd != -1)
                put_unused_fd(out_fence_fd);
+err_in_fence:
        dma_fence_put(in_fence);
        return ret;
 }