diff options
-rw-r--r-- | arch/mips/include/asm/pgtable.h | 9 | ||||
-rw-r--r-- | arch/mips/mm/cache.c | 27 |
2 files changed, 13 insertions, 23 deletions
diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h index bffd46ca3694..819af9d057a8 100644 --- a/arch/mips/include/asm/pgtable.h +++ b/arch/mips/include/asm/pgtable.h | |||
@@ -127,10 +127,6 @@ do { \ | |||
127 | } \ | 127 | } \ |
128 | } while(0) | 128 | } while(0) |
129 | 129 | ||
130 | |||
131 | extern void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, | ||
132 | pte_t pteval); | ||
133 | |||
134 | #if defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32) | 130 | #if defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32) |
135 | 131 | ||
136 | #define pte_none(pte) (!(((pte).pte_high) & ~_PAGE_GLOBAL)) | 132 | #define pte_none(pte) (!(((pte).pte_high) & ~_PAGE_GLOBAL)) |
@@ -152,6 +148,7 @@ static inline void set_pte(pte_t *ptep, pte_t pte) | |||
152 | buddy->pte_high |= _PAGE_GLOBAL; | 148 | buddy->pte_high |= _PAGE_GLOBAL; |
153 | } | 149 | } |
154 | } | 150 | } |
151 | #define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval) | ||
155 | 152 | ||
156 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 153 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
157 | { | 154 | { |
@@ -190,6 +187,7 @@ static inline void set_pte(pte_t *ptep, pte_t pteval) | |||
190 | } | 187 | } |
191 | #endif | 188 | #endif |
192 | } | 189 | } |
190 | #define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval) | ||
193 | 191 | ||
194 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 192 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
195 | { | 193 | { |
@@ -399,12 +397,15 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
399 | 397 | ||
400 | extern void __update_tlb(struct vm_area_struct *vma, unsigned long address, | 398 | extern void __update_tlb(struct vm_area_struct *vma, unsigned long address, |
401 | pte_t pte); | 399 | pte_t pte); |
400 | extern void __update_cache(struct vm_area_struct *vma, unsigned long address, | ||
401 | pte_t pte); | ||
402 | 402 | ||
403 | static inline void update_mmu_cache(struct vm_area_struct *vma, | 403 | static inline void update_mmu_cache(struct vm_area_struct *vma, |
404 | unsigned long address, pte_t *ptep) | 404 | unsigned long address, pte_t *ptep) |
405 | { | 405 | { |
406 | pte_t pte = *ptep; | 406 | pte_t pte = *ptep; |
407 | __update_tlb(vma, address, pte); | 407 | __update_tlb(vma, address, pte); |
408 | __update_cache(vma, address, pte); | ||
408 | } | 409 | } |
409 | 410 | ||
410 | static inline void update_mmu_cache_pmd(struct vm_area_struct *vma, | 411 | static inline void update_mmu_cache_pmd(struct vm_area_struct *vma, |
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index 7e3ea7766822..f7b91d3a371d 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c | |||
@@ -119,36 +119,25 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr) | |||
119 | 119 | ||
120 | EXPORT_SYMBOL(__flush_anon_page); | 120 | EXPORT_SYMBOL(__flush_anon_page); |
121 | 121 | ||
122 | static void mips_flush_dcache_from_pte(pte_t pteval, unsigned long address) | 122 | void __update_cache(struct vm_area_struct *vma, unsigned long address, |
123 | pte_t pte) | ||
123 | { | 124 | { |
124 | struct page *page; | 125 | struct page *page; |
125 | unsigned long pfn = pte_pfn(pteval); | 126 | unsigned long pfn, addr; |
127 | int exec = (vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc; | ||
126 | 128 | ||
129 | pfn = pte_pfn(pte); | ||
127 | if (unlikely(!pfn_valid(pfn))) | 130 | if (unlikely(!pfn_valid(pfn))) |
128 | return; | 131 | return; |
129 | |||
130 | page = pfn_to_page(pfn); | 132 | page = pfn_to_page(pfn); |
131 | if (page_mapping(page) && Page_dcache_dirty(page)) { | 133 | if (page_mapping(page) && Page_dcache_dirty(page)) { |
132 | unsigned long page_addr = (unsigned long) page_address(page); | 134 | addr = (unsigned long) page_address(page); |
133 | 135 | if (exec || pages_do_alias(addr, address & PAGE_MASK)) | |
134 | if (!cpu_has_ic_fills_f_dc || | 136 | flush_data_cache_page(addr); |
135 | pages_do_alias(page_addr, address & PAGE_MASK)) | ||
136 | flush_data_cache_page(page_addr); | ||
137 | ClearPageDcacheDirty(page); | 137 | ClearPageDcacheDirty(page); |
138 | } | 138 | } |
139 | } | 139 | } |
140 | 140 | ||
141 | void set_pte_at(struct mm_struct *mm, unsigned long addr, | ||
142 | pte_t *ptep, pte_t pteval) | ||
143 | { | ||
144 | if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc) { | ||
145 | if (pte_present(pteval)) | ||
146 | mips_flush_dcache_from_pte(pteval, addr); | ||
147 | } | ||
148 | |||
149 | set_pte(ptep, pteval); | ||
150 | } | ||
151 | |||
152 | unsigned long _page_cachable_default; | 141 | unsigned long _page_cachable_default; |
153 | EXPORT_SYMBOL(_page_cachable_default); | 142 | EXPORT_SYMBOL(_page_cachable_default); |
154 | 143 | ||