drm/i915/selftests: Provide full mb() around clflush
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 6 Jul 2018 17:49:26 +0000 (18:49 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 6 Jul 2018 20:28:11 +0000 (21:28 +0100)
clflush is an unserialised instruction and the IA manual strongly advises
you to serialise it with a mb. To be cautious, apply one before and one
after, so that it is serialised with both writes and reads without
worrying too much about the required direction.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180706174926.4712-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/selftests/i915_gem_coherency.c

index 1de7c1402fd5a724893606ed9aeba38a5dcecf23..3a095c37c1203ba7a5e2a72bd29d5d40395d9039 100644 (file)
@@ -42,11 +42,21 @@ static int cpu_set(struct drm_i915_gem_object *obj,
 
        page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT);
        map = kmap_atomic(page);
-       if (needs_clflush & CLFLUSH_BEFORE)
+
+       if (needs_clflush & CLFLUSH_BEFORE) {
+               mb();
                clflush(map+offset_in_page(offset) / sizeof(*map));
+               mb();
+       }
+
        map[offset_in_page(offset) / sizeof(*map)] = v;
-       if (needs_clflush & CLFLUSH_AFTER)
+
+       if (needs_clflush & CLFLUSH_AFTER) {
+               mb();
                clflush(map+offset_in_page(offset) / sizeof(*map));
+               mb();
+       }
+
        kunmap_atomic(map);
 
        i915_gem_obj_finish_shmem_access(obj);
@@ -68,8 +78,13 @@ static int cpu_get(struct drm_i915_gem_object *obj,
 
        page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT);
        map = kmap_atomic(page);
-       if (needs_clflush & CLFLUSH_BEFORE)
+
+       if (needs_clflush & CLFLUSH_BEFORE) {
+               mb();
                clflush(map+offset_in_page(offset) / sizeof(*map));
+               mb();
+       }
+
        *v = map[offset_in_page(offset) / sizeof(*map)];
        kunmap_atomic(map);