提交 afcd950c 编写于 作者: C Chris Wilson 提交者: Daniel Vetter

drm: Avoid the double clflush on the last cache line in drm_clflush_virt_range()

As the clflush operates on cache lines, and we can flush any byte
address, in order to flush all bytes given in the range we issue an
extra clflush on the last byte to ensure the last cacheline is flushed.
We can can the iteration to be over the actual cache lines to avoid this
double clflush on the last byte.
Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
Cc: Imre Deak <imre.deak@intel.com>
Reviewed-by: NImre Deak <imre.deak@intel.com>
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 2465ff62
...@@ -130,11 +130,12 @@ drm_clflush_virt_range(void *addr, unsigned long length) ...@@ -130,11 +130,12 @@ drm_clflush_virt_range(void *addr, unsigned long length)
{ {
#if defined(CONFIG_X86) #if defined(CONFIG_X86)
if (cpu_has_clflush) { if (cpu_has_clflush) {
const int size = boot_cpu_data.x86_clflush_size;
void *end = addr + length; void *end = addr + length;
addr = (void *)(((unsigned long)addr) & -size);
mb(); mb();
for (; addr < end; addr += boot_cpu_data.x86_clflush_size) for (; addr < end; addr += size)
clflushopt(addr); clflushopt(addr);
clflushopt(end - 1);
mb(); mb();
return; return;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册