summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_execbuffer.c
diff options
context:
space:
mode:
authorDaniele Ceraolo Spurio2017-02-03 23:45:29 +0100
committerChris Wilson2017-02-04 10:42:07 +0100
commit4a04e371228937d104fd03d5219f8c25fda29757 (patch)
tree3b89fba5b2ddf8afbb4b3eccf9233ed6a0c773f6 /drivers/gpu/drm/i915/i915_gem_execbuffer.c
parentdrm/i915: Allow large objects to be tiled on gen2/3 (diff)
downloadkernel-qcow2-linux-4a04e371228937d104fd03d5219f8c25fda29757.tar.gz
kernel-qcow2-linux-4a04e371228937d104fd03d5219f8c25fda29757.tar.xz
kernel-qcow2-linux-4a04e371228937d104fd03d5219f8c25fda29757.zip
drm/i915: fix pm refcounting on fence error in execbuf
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>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 91c2393199a3..26c26a6675df 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -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;
}