diff options
Diffstat (limited to 'arch/mips/mm/cache.c')
-rw-r--r-- | arch/mips/mm/cache.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index ddd3a2de1d73..40c8b0235183 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c | |||
@@ -25,7 +25,7 @@ void (*flush_cache_range)(struct vm_area_struct *vma, unsigned long start, | |||
25 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, | 25 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, |
26 | unsigned long pfn); | 26 | unsigned long pfn); |
27 | void (*flush_icache_range)(unsigned long start, unsigned long end); | 27 | void (*flush_icache_range)(unsigned long start, unsigned long end); |
28 | void (*flush_icache_page)(struct vm_area_struct *vma, struct page *page); | 28 | void (*__flush_icache_page)(struct vm_area_struct *vma, struct page *page); |
29 | 29 | ||
30 | /* MIPS specific cache operations */ | 30 | /* MIPS specific cache operations */ |
31 | void (*flush_cache_sigtramp)(unsigned long addr); | 31 | void (*flush_cache_sigtramp)(unsigned long addr); |
@@ -70,6 +70,8 @@ void __flush_dcache_page(struct page *page) | |||
70 | struct address_space *mapping = page_mapping(page); | 70 | struct address_space *mapping = page_mapping(page); |
71 | unsigned long addr; | 71 | unsigned long addr; |
72 | 72 | ||
73 | if (PageHighMem(page)) | ||
74 | return; | ||
73 | if (mapping && !mapping_mapped(mapping)) { | 75 | if (mapping && !mapping_mapped(mapping)) { |
74 | SetPageDcacheDirty(page); | 76 | SetPageDcacheDirty(page); |
75 | return; | 77 | return; |
@@ -91,16 +93,16 @@ void __update_cache(struct vm_area_struct *vma, unsigned long address, | |||
91 | { | 93 | { |
92 | struct page *page; | 94 | struct page *page; |
93 | unsigned long pfn, addr; | 95 | unsigned long pfn, addr; |
96 | int exec = (vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc; | ||
94 | 97 | ||
95 | pfn = pte_pfn(pte); | 98 | pfn = pte_pfn(pte); |
96 | if (pfn_valid(pfn) && (page = pfn_to_page(pfn), page_mapping(page)) && | 99 | if (unlikely(!pfn_valid(pfn))) |
97 | Page_dcache_dirty(page)) { | 100 | return; |
98 | if (pages_do_alias((unsigned long)page_address(page), | 101 | page = pfn_to_page(pfn); |
99 | address & PAGE_MASK)) { | 102 | if (page_mapping(page) && Page_dcache_dirty(page)) { |
100 | addr = (unsigned long) page_address(page); | 103 | addr = (unsigned long) page_address(page); |
104 | if (exec || pages_do_alias(addr, address & PAGE_MASK)) | ||
101 | flush_data_cache_page(addr); | 105 | flush_data_cache_page(addr); |
102 | } | ||
103 | |||
104 | ClearPageDcacheDirty(page); | 106 | ClearPageDcacheDirty(page); |
105 | } | 107 | } |
106 | } | 108 | } |