diff options
Diffstat (limited to 'arch/arm/mm/flush.c')
| -rw-r--r-- | arch/arm/mm/flush.c | 44 |
1 files changed, 18 insertions, 26 deletions
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 4085ed983e46..191788fb18d1 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
| @@ -37,13 +37,8 @@ static void flush_pfn_alias(unsigned long pfn, unsigned long vaddr) | |||
| 37 | #define flush_pfn_alias(pfn,vaddr) do { } while (0) | 37 | #define flush_pfn_alias(pfn,vaddr) do { } while (0) |
| 38 | #endif | 38 | #endif |
| 39 | 39 | ||
| 40 | static void __flush_dcache_page(struct address_space *mapping, struct page *page) | 40 | void __flush_dcache_page(struct address_space *mapping, struct page *page) |
| 41 | { | 41 | { |
| 42 | struct mm_struct *mm = current->active_mm; | ||
| 43 | struct vm_area_struct *mpnt; | ||
| 44 | struct prio_tree_iter iter; | ||
| 45 | pgoff_t pgoff; | ||
| 46 | |||
| 47 | /* | 42 | /* |
| 48 | * Writeback any data associated with the kernel mapping of this | 43 | * Writeback any data associated with the kernel mapping of this |
| 49 | * page. This ensures that data in the physical page is mutually | 44 | * page. This ensures that data in the physical page is mutually |
| @@ -52,24 +47,21 @@ static void __flush_dcache_page(struct address_space *mapping, struct page *page | |||
| 52 | __cpuc_flush_dcache_page(page_address(page)); | 47 | __cpuc_flush_dcache_page(page_address(page)); |
| 53 | 48 | ||
| 54 | /* | 49 | /* |
| 55 | * If there's no mapping pointer here, then this page isn't | 50 | * If this is a page cache page, and we have an aliasing VIPT cache, |
| 56 | * visible to userspace yet, so there are no cache lines | 51 | * we only need to do one flush - which would be at the relevant |
| 57 | * associated with any other aliases. | ||
| 58 | */ | ||
| 59 | if (!mapping) | ||
| 60 | return; | ||
| 61 | |||
| 62 | /* | ||
| 63 | * This is a page cache page. If we have a VIPT cache, we | ||
| 64 | * only need to do one flush - which would be at the relevant | ||
| 65 | * userspace colour, which is congruent with page->index. | 52 | * userspace colour, which is congruent with page->index. |
| 66 | */ | 53 | */ |
| 67 | if (cache_is_vipt()) { | 54 | if (mapping && cache_is_vipt_aliasing()) |
| 68 | if (cache_is_vipt_aliasing()) | 55 | flush_pfn_alias(page_to_pfn(page), |
| 69 | flush_pfn_alias(page_to_pfn(page), | 56 | page->index << PAGE_CACHE_SHIFT); |
| 70 | page->index << PAGE_CACHE_SHIFT); | 57 | } |
| 71 | return; | 58 | |
| 72 | } | 59 | static void __flush_dcache_aliases(struct address_space *mapping, struct page *page) |
| 60 | { | ||
| 61 | struct mm_struct *mm = current->active_mm; | ||
| 62 | struct vm_area_struct *mpnt; | ||
| 63 | struct prio_tree_iter iter; | ||
| 64 | pgoff_t pgoff; | ||
| 73 | 65 | ||
| 74 | /* | 66 | /* |
| 75 | * There are possible user space mappings of this page: | 67 | * There are possible user space mappings of this page: |
| @@ -116,12 +108,12 @@ void flush_dcache_page(struct page *page) | |||
| 116 | { | 108 | { |
| 117 | struct address_space *mapping = page_mapping(page); | 109 | struct address_space *mapping = page_mapping(page); |
| 118 | 110 | ||
| 119 | if (cache_is_vipt_nonaliasing()) | ||
| 120 | return; | ||
| 121 | |||
| 122 | if (mapping && !mapping_mapped(mapping)) | 111 | if (mapping && !mapping_mapped(mapping)) |
| 123 | set_bit(PG_dcache_dirty, &page->flags); | 112 | set_bit(PG_dcache_dirty, &page->flags); |
| 124 | else | 113 | else { |
| 125 | __flush_dcache_page(mapping, page); | 114 | __flush_dcache_page(mapping, page); |
| 115 | if (mapping && cache_is_vivt()) | ||
| 116 | __flush_dcache_aliases(mapping, page); | ||
| 117 | } | ||
| 126 | } | 118 | } |
| 127 | EXPORT_SYMBOL(flush_dcache_page); | 119 | EXPORT_SYMBOL(flush_dcache_page); |
