summaryrefslogtreecommitdiff
path: root/arch/csky/abiv1/cacheflush.c
diff options
context:
space:
mode:
authorGuo Ren <ren_guo@c-sky.com>2019-08-21 14:15:52 +0300
committerGuo Ren <ren_guo@c-sky.com>2019-08-22 05:44:24 +0300
commit4ad35c1f56386c8e7019c921bba1af109fde9693 (patch)
treeb9aa9baf63834a4eca3e23b4afc6c119cf33ee6e /arch/csky/abiv1/cacheflush.c
parentc7e6f0e99227b3dcdc5e62f789119e000887ff79 (diff)
downloadlinux-4ad35c1f56386c8e7019c921bba1af109fde9693.tar.xz
csky: Fixup 610 vipt cache flush mechanism
610 has vipt aliasing issue, so we need to finish the cache flush apis mentioned in cachetlb.rst to avoid data corruption. Here is the list of modified apis in the patch: - flush_kernel_dcache_page (new add) - flush_dcache_mmap_lock (new add) - flush_dcache_mmap_unlock (new add) - flush_kernel_vmap_range (new add) - invalidate_kernel_vmap_range (new add) - flush_anon_page (new add) - flush_cache_range (new add) - flush_cache_vmap (flush all) - flush_cache_vunmap (flush all) - flush_cache_mm (only dcache flush) - flush_icache_page (just nop) - copy_from_user_page (remove no need flush) - copy_to_user_page (remove no need flush) Change to V2: - Fixup compile error with xa_lock*(&mapping->i_pages) Signed-off-by: Guo Ren <ren_guo@c-sky.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Christoph Hellwig <hch@infradead.org>
Diffstat (limited to 'arch/csky/abiv1/cacheflush.c')
-rw-r--r--arch/csky/abiv1/cacheflush.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/csky/abiv1/cacheflush.c b/arch/csky/abiv1/cacheflush.c
index fee99fc6612f..9f1fe80cc847 100644
--- a/arch/csky/abiv1/cacheflush.c
+++ b/arch/csky/abiv1/cacheflush.c
@@ -54,3 +54,23 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr,
icache_inv_all();
}
}
+
+void flush_kernel_dcache_page(struct page *page)
+{
+ struct address_space *mapping;
+
+ mapping = page_mapping_file(page);
+
+ if (!mapping || mapping_mapped(mapping))
+ dcache_wbinv_all();
+}
+EXPORT_SYMBOL(flush_kernel_dcache_page);
+
+void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
+ unsigned long end)
+{
+ dcache_wbinv_all();
+
+ if (vma->vm_flags & VM_EXEC)
+ icache_inv_all();
+}