* Note that on shared LLC platforms we still apply the heavy flush for
         * I915_CACHE_NONE objects, under the assumption that this is going to
         * be used for scanout.
+        *
+        * Update: On some hardware there is now also the 'Bypass LLC' MOCS
+        * entry, which defeats our @cache_coherent tracking, since userspace
+        * can freely bypass the CPU cache when touching the pages with the GPU,
+        * where the kernel is completely unaware. On such platform we need
+        * apply the sledgehammer-on-acquire regardless of the @cache_coherent.
         */
        unsigned int cache_dirty:1;
 
 
        if (i915_gem_object_needs_bit17_swizzle(obj))
                i915_gem_object_do_bit_17_swizzle(obj, st);
 
+       /*
+        * EHL and JSL add the 'Bypass LLC' MOCS entry, which should make it
+        * possible for userspace to bypass the GTT caching bits set by the
+        * kernel, as per the given object cache_level. This is troublesome
+        * since the heavy flush we apply when first gathering the pages is
+        * skipped if the kernel thinks the object is coherent with the GPU. As
+        * a result it might be possible to bypass the cache and read the
+        * contents of the page directly, which could be stale data. If it's
+        * just a case of userspace shooting themselves in the foot then so be
+        * it, but since i915 takes the stance of always zeroing memory before
+        * handing it to userspace, we need to prevent this.
+        *
+        * By setting cache_dirty here we make the clflush in set_pages
+        * unconditional on such platforms.
+        */
+       if (IS_JSL_EHL(i915) && obj->flags & I915_BO_ALLOC_USER)
+               obj->cache_dirty = true;
+
        __i915_gem_object_set_pages(obj, st, sg_page_sizes);
 
        return 0;