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 | } |
