x86: clflush_page_range needs mfence
clflush is an unordered operation with respect to other memory traffic, including other CLFLUSH instructions. This needs proper fencing with mfence. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
af1e6844d6
commit
cd8ddf1a28
@ -25,12 +25,24 @@ within(unsigned long addr, unsigned long start, unsigned long end)
|
|||||||
/*
|
/*
|
||||||
* Flushing functions
|
* Flushing functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clflush_cache_range - flush a cache range with clflush
|
||||||
|
* @addr: virtual start address
|
||||||
|
* @size: number of bytes to flush
|
||||||
|
*
|
||||||
|
* clflush is an unordered instruction which needs fencing with mfence
|
||||||
|
* to avoid ordering issues.
|
||||||
|
*/
|
||||||
void clflush_cache_range(void *addr, int size)
|
void clflush_cache_range(void *addr, int size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
mb();
|
||||||
for (i = 0; i < size; i += boot_cpu_data.x86_clflush_size)
|
for (i = 0; i < size; i += boot_cpu_data.x86_clflush_size)
|
||||||
clflush(addr+i);
|
clflush(addr+i);
|
||||||
|
mb();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __cpa_flush_all(void *arg)
|
static void __cpa_flush_all(void *arg)
|
||||||
|
Loading…
Reference in New Issue
Block a user