FAILED: patch "[PATCH] drm/i915: Unconditionally flush any chipset buffers before" failed to apply to 4.7-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.7-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
dcd79934b0dd803fdb29216fbd6f4a899a66f466Mon Sep 17 00:00:00 2001
From: Chris Wilson <[email protected]>
Date: Thu, 18 Aug 2016 17:16:40 +0100
Subject: [PATCH] drm/i915: Unconditionally flush any chipset buffers before
execbuf
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
If userspace is asynchronously streaming into the batch or other execobjects, we may not flush those writes along with a change in cache domain (as there is no change). Therefore those writes may end up in internal chipset buffers and not visible to the GPU upon execution. We must issue a flush command or otherwise we encounter incoherency in the batchbuffers and the GPU executing invalid commands (i.e. hanging) quite regularly.
v2: Throw a paranoid wmb() into the general flush so that we remain consistent with before.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90841
drivers/gpu/drm/i915/i915_drv.h +1 -0
@@ -3591,6 +3591,7 @@ int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle);/* belongs in i915_gem_gtt.h */ static inline void i915_gem_chipset_flush (struct drm_i915_private *dev_priv) { +wmb ();if (INTEL_GEN (dev_priv) <6 )intel_gtt_chipset_flush (); }
drivers/gpu/drm/i915/i915_gem_execbuffer.c +3 -10
@@ -943,8 +943,6 @@ i915_gem_execbuffer_move_to_gpu(struct drm_i915_gem_request *req, {const unsigned other_rings = ~intel_engine_flag (req->engine);struct i915_vma *vma; -uint32_t flush_domains =0 ; -bool flush_chipset = false;int ret;list_for_each_entry (vma, vmas, exec_list) {
@@ -957,16 +955,11 @@ i915_gem_execbuffer_move_to_gpu(struct drm_i915_gem_request *req, }if (obj->base.write_domain &I915_GEM_DOMAIN_CPU ) - flush_chipset |=i915_gem_clflush_object (obj, false); - - flush_domains |= obj->base.write_domain; +i915_gem_clflush_object (obj, false); } -if (flush_chipset) -i915_gem_chipset_flush (req->engine->i915); - -if (flush_domains &I915_GEM_DOMAIN_GTT ) -wmb (); +/* Unconditionally flush any chipset caches (for streaming writes). */ +i915_gem_chipset_flush (req->engine->i915);/* Unconditionally invalidate gpu caches and ensure that we do flush * any residual writes from the previous batch.