Skip to content

Commit

Permalink
drm/i915/selftests: Provide full mb() around clflush
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Chris Wilson committed Jul 6, 2018
1 parent 8b293eb commit 3a32497
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);

Expand Down

0 comments on commit 3a32497

Please sign in to comment.