55 lines
2 KiB
Diff
55 lines
2 KiB
Diff
commit 389a55581e30607af0fcde6cdb4e54f189cf46cf
|
|
Author: Chris Wilson <chris@chris-wilson.co.uk>
|
|
Date: Tue Nov 29 15:12:16 2011 +0000
|
|
|
|
drm/i915: Only clear the GPU domains upon a successful finish
|
|
|
|
By clearing the GPU read domains before waiting upon the buffer, we run
|
|
the risk of the wait being interrupted and the domains prematurely
|
|
cleared. The next time we attempt to wait upon the buffer (after
|
|
userspace handles the signal), we believe that the buffer is idle and so
|
|
skip the wait.
|
|
|
|
There are a number of bugs across all generations which show signs of an
|
|
overly haste reuse of active buffers.
|
|
|
|
Such as:
|
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=29046
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=35863
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=38952
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=40282
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=41098
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=41102
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=41284
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=42141
|
|
|
|
A couple of those pre-date i915_gem_object_finish_gpu(), so may be
|
|
unrelated (such as a wild write from a userspace command buffer), but
|
|
this does look like a convincing cause for most of those bugs.
|
|
|
|
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
|
Cc: stable@kernel.org
|
|
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
|
Reviewed-by: Eugeni Dodonov <eugeni.dodonov@intel.com>
|
|
|
|
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
|
index d560175..036bc58 100644
|
|
--- a/drivers/gpu/drm/i915/i915_gem.c
|
|
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
|
@@ -3087,10 +3087,13 @@ i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj)
|
|
return ret;
|
|
}
|
|
|
|
+ ret = i915_gem_object_wait_rendering(obj);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
/* Ensure that we invalidate the GPU's caches and TLBs. */
|
|
obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
|
|
-
|
|
- return i915_gem_object_wait_rendering(obj);
|
|
+ return 0;
|
|
}
|
|
|
|
/**
|