drm/i915/gem: Flush the pwrite through the chipset before signaling
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 6 Dec 2019 10:55:23 +0000 (10:55 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 6 Dec 2019 11:39:12 +0000 (11:39 +0000)
Before we signal the fence to indicate completion, ensure the pwrite
through the indirect GGTT is coherent (as best as we know) in memory.
Any listeners to the fence may start immediately and sample from the
backing store prior to the writes being posted, thus seeing stale data.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191206105527.1130413-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem.c

index 98b65b718e1a3879f0e2788c14a6ec27500da8f2..919d3a723c50a203f6088164a54a48dc13f7d489 100644 (file)
@@ -670,11 +670,12 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
                user_data += page_length;
                offset += page_length;
        }
+
+       intel_gt_flush_ggtt_writes(ggtt->vm.gt);
        intel_frontbuffer_flush(obj->frontbuffer, ORIGIN_CPU);
 
        i915_gem_object_unlock_fence(obj, fence);
 out_unpin:
-       intel_gt_flush_ggtt_writes(ggtt->vm.gt);
        if (drm_mm_node_allocated(&node)) {
                ggtt->vm.clear_range(&ggtt->vm, node.start, node.size);
                remove_mappable_node(ggtt, &node);