drm/i915: Skip clflushes for all non-page backed objects
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 22 Feb 2017 11:40:47 +0000 (11:40 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 22 Feb 2017 12:12:14 +0000 (12:12 +0000)
Generalise the skip for physical and stolen objects by skipping anything
we do not have a valid address for inside the sg.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170222114049.28456-4-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem.c

index c9ee2a99ffc0f89a8bf55f10fe80106b56a8a492..00213c28279642fc6e19360af9b8289234378421 100644 (file)
@@ -3140,14 +3140,19 @@ void i915_gem_clflush_object(struct drm_i915_gem_object *obj,
         * to GPU, and we can ignore the cache flush because it'll happen
         * again at bind time.
         */
-       if (!obj->mm.pages)
+       if (!obj->mm.pages) {
+               GEM_BUG_ON(obj->base.write_domain != I915_GEM_DOMAIN_CPU);
                return;
+       }
 
        /*
         * Stolen memory is always coherent with the GPU as it is explicitly
         * marked as wc by the system, or the system is cache-coherent.
+        * Similarly, we only access struct pages through the CPU cache, so
+        * anything not backed by physical memory we consider to be always
+        * coherent and not need clflushing.
         */
-       if (obj->stolen || obj->phys_handle)
+       if (!i915_gem_object_has_struct_page(obj))
                return;
 
        /* If the GPU is snooping the contents of the CPU cache,