MIPS: cache: Provide cache flush operations for XFS
Until now flush_kernel_vmap_range() and invalidate_kernel_vmap_range() did not exist on MIPS resulting in heavy cache corruption on XFS filesystems. Left for the post-3.0 time: optimization and make this work with highmem, too. Since the combination of highmem + cache aliases atm doesn't work this isn't a regression. Signed-off-by: Ralf Baechle <ralf@linux-mips.org> Patchwork: https://patchwork.linux-mips.org/patch/2505/
This commit is contained in:
@@ -722,6 +722,39 @@ static void r4k_flush_icache_all(void)
|
||||
r4k_blast_icache();
|
||||
}
|
||||
|
||||
struct flush_kernel_vmap_range_args {
|
||||
unsigned long vaddr;
|
||||
int size;
|
||||
};
|
||||
|
||||
static inline void local_r4k_flush_kernel_vmap_range(void *args)
|
||||
{
|
||||
struct flush_kernel_vmap_range_args *vmra = args;
|
||||
unsigned long vaddr = vmra->vaddr;
|
||||
int size = vmra->size;
|
||||
|
||||
/*
|
||||
* Aliases only affect the primary caches so don't bother with
|
||||
* S-caches or T-caches.
|
||||
*/
|
||||
if (cpu_has_safe_index_cacheops && size >= dcache_size)
|
||||
r4k_blast_dcache();
|
||||
else {
|
||||
R4600_HIT_CACHEOP_WAR_IMPL;
|
||||
blast_dcache_range(vaddr, vaddr + size);
|
||||
}
|
||||
}
|
||||
|
||||
static void r4k_flush_kernel_vmap_range(unsigned long vaddr, int size)
|
||||
{
|
||||
struct flush_kernel_vmap_range_args args;
|
||||
|
||||
args.vaddr = (unsigned long) vaddr;
|
||||
args.size = size;
|
||||
|
||||
r4k_on_each_cpu(local_r4k_flush_kernel_vmap_range, &args);
|
||||
}
|
||||
|
||||
static inline void rm7k_erratum31(void)
|
||||
{
|
||||
const unsigned long ic_lsize = 32;
|
||||
@@ -1403,6 +1436,8 @@ void __cpuinit r4k_cache_init(void)
|
||||
flush_cache_page = r4k_flush_cache_page;
|
||||
flush_cache_range = r4k_flush_cache_range;
|
||||
|
||||
__flush_kernel_vmap_range = r4k_flush_kernel_vmap_range;
|
||||
|
||||
flush_cache_sigtramp = r4k_flush_cache_sigtramp;
|
||||
flush_icache_all = r4k_flush_icache_all;
|
||||
local_flush_data_cache_page = local_r4k_flush_data_cache_page;
|
||||
|
Reference in New Issue
Block a user