anv: Pull all clflushing into a clflush_range helper

All this cache line address calculation stuff is tricky.  Let's not
duplicate it more places than we have to.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Jason Ekstrand 2017-02-20 10:37:34 -08:00
parent 16b187c8bb
commit f408971deb
2 changed files with 13 additions and 20 deletions

View file

@ -1486,18 +1486,11 @@ clflush_mapped_ranges(struct anv_device *device,
{
for (uint32_t i = 0; i < count; i++) {
ANV_FROM_HANDLE(anv_device_memory, mem, ranges[i].memory);
void *p = mem->map + (ranges[i].offset & ~CACHELINE_MASK);
void *end;
if (ranges[i].offset >= mem->map_size)
continue;
if (ranges[i].offset + ranges[i].size > mem->map_size)
end = mem->map + mem->map_size;
else
end = mem->map + ranges[i].offset + ranges[i].size;
while (p < end) {
__builtin_ia32_clflush(p);
p += CACHELINE_SIZE;
}
anv_clflush_range(mem->map + ranges[i].offset,
MIN2(ranges[i].size, mem->map_size - ranges[i].offset));
}
}

View file

@ -436,28 +436,28 @@ struct anv_state_stream {
#define CACHELINE_MASK 63
static inline void
anv_flush_range(void *start, size_t size)
anv_clflush_range(void *start, size_t size)
{
void *p = (void *) (((uintptr_t) start) & ~CACHELINE_MASK);
void *end = start + size;
__builtin_ia32_mfence();
while (p < end) {
__builtin_ia32_clflush(p);
p += CACHELINE_SIZE;
}
}
static inline void
anv_flush_range(void *start, size_t size)
{
__builtin_ia32_mfence();
anv_clflush_range(start, size);
}
static inline void
anv_invalidate_range(void *start, size_t size)
{
void *p = (void *) (((uintptr_t) start) & ~CACHELINE_MASK);
void *end = start + size;
while (p < end) {
__builtin_ia32_clflush(p);
p += CACHELINE_SIZE;
}
anv_clflush_range(start, size);
__builtin_ia32_mfence();
}