drm/i915: Use maximum write flush for pwrite_gtt
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 18 Jul 2019 14:54:05 +0000 (15:54 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 18 Jul 2019 19:05:05 +0000 (20:05 +0100)
As recently disovered by forcing big-core (!llc) machines to use the GTT
paths, we need our full GTT write flush before manipulating the GTT PTE
or else the writes may be directed to the wrong page.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Matthew Auld <matthew.william.auld@gmail.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: stable@vger.kernel.org
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190718145407.21352-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem.c

index fed0bc421a558c6871c07b8e6cace07c96110e58..c6ba350e6e4fb8a53519afe2db3fcd32d3987bb4 100644 (file)
@@ -610,7 +610,8 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
                unsigned int page_length = PAGE_SIZE - page_offset;
                page_length = remain < page_length ? remain : page_length;
                if (node.allocated) {
-                       wmb(); /* flush the write before we modify the GGTT */
+                       /* flush the write before we modify the GGTT */
+                       intel_gt_flush_ggtt_writes(ggtt->vm.gt);
                        ggtt->vm.insert_page(&ggtt->vm,
                                             i915_gem_object_get_dma_address(obj, offset >> PAGE_SHIFT),
                                             node.start, I915_CACHE_NONE, 0);
@@ -639,8 +640,8 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
        i915_gem_object_unlock_fence(obj, fence);
 out_unpin:
        mutex_lock(&i915->drm.struct_mutex);
+       intel_gt_flush_ggtt_writes(ggtt->vm.gt);
        if (node.allocated) {
-               wmb();
                ggtt->vm.clear_range(&ggtt->vm, node.start, node.size);
                remove_mappable_node(&node);
        } else {