diff options
Diffstat (limited to 'arch/arm/mm/flush.c')
-rw-r--r-- | arch/arm/mm/flush.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 1c8f7f564175..0d473cce501c 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
@@ -170,15 +170,18 @@ void __flush_dcache_page(struct address_space *mapping, struct page *page) | |||
170 | if (!PageHighMem(page)) { | 170 | if (!PageHighMem(page)) { |
171 | __cpuc_flush_dcache_area(page_address(page), PAGE_SIZE); | 171 | __cpuc_flush_dcache_area(page_address(page), PAGE_SIZE); |
172 | } else { | 172 | } else { |
173 | void *addr = kmap_high_get(page); | 173 | void *addr; |
174 | if (addr) { | 174 | |
175 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | 175 | if (cache_is_vipt_nonaliasing()) { |
176 | kunmap_high(page); | ||
177 | } else if (cache_is_vipt()) { | ||
178 | /* unmapped pages might still be cached */ | ||
179 | addr = kmap_atomic(page); | 176 | addr = kmap_atomic(page); |
180 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | 177 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); |
181 | kunmap_atomic(addr); | 178 | kunmap_atomic(addr); |
179 | } else { | ||
180 | addr = kmap_high_get(page); | ||
181 | if (addr) { | ||
182 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | ||
183 | kunmap_high(page); | ||
184 | } | ||
182 | } | 185 | } |
183 | } | 186 | } |
184 | 187 | ||