drm/i915: Access to snooped system memory through the GTT is incoherent
authorChris Wilson <chris@chris-wilson.co.uk>
Sun, 16 Dec 2012 12:43:36 +0000 (12:43 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 17 Dec 2012 11:28:23 +0000 (12:28 +0100)
We ignore all the user requests to handle flushing to the GTT domain if
the user requests such on a snoopable bo, and as such access through the
GTT to such pages remains incoherent. The specs even warn that such
behaviour is undefined - a strong reason never to do so.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_gem.c

index 6380c6083cb26db0567dd030751b09a4ab3feee2..d15c86279d02181957791c01a508419303f6827e 100644 (file)
@@ -1341,6 +1341,12 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 
        trace_i915_gem_object_fault(obj, page_offset, true, write);
 
+       /* Access to snoopable pages through the GTT is incoherent. */
+       if (obj->cache_level != I915_CACHE_NONE && !HAS_LLC(dev)) {
+               ret = -EINVAL;
+               goto unlock;
+       }
+
        /* Now bind it into the GTT if needed */
        ret = i915_gem_object_pin(obj, 0, true, false);
        if (ret)