ARM: 8627/1: avoid cache flushing in flush_dcache_page()
authorRabin Vincent <rabinv@axis.com>
Tue, 8 Nov 2016 08:21:19 +0000 (09:21 +0100)
committerRussell King <rmk+kernel@armlinux.org.uk>
Tue, 10 Jan 2017 23:31:30 +0000 (23:31 +0000)
When the data cache is PIPT or VIPT non-aliasing, and cache operations
are broadcast by the hardware, we can always postpone the flush in
flush_dcache_page().  A similar change was done for ARM64 in commit
b5b6c9e9149d ("arm64: Avoid cache flushing in flush_dcache_page()").

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Rabin Vincent <rabinv@axis.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mm/flush.c

index 3cced8455727953a2525571c5a62b5ad884e8bee..f1e6190aa7eaedf5adacca20c09cb7c3702bee96 100644 (file)
@@ -327,6 +327,12 @@ void flush_dcache_page(struct page *page)
        if (page == ZERO_PAGE(0))
                return;
 
+       if (!cache_ops_need_broadcast() && cache_is_vipt_nonaliasing()) {
+               if (test_bit(PG_dcache_clean, &page->flags))
+                       clear_bit(PG_dcache_clean, &page->flags);
+               return;
+       }
+
        mapping = page_mapping(page);
 
        if (!cache_ops_need_broadcast() &&