aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/mm
diff options
context:
space:
mode:
authorLars Persson <lars.persson@axis.com>2015-02-26 08:16:02 -0500
committerRalf Baechle <ralf@linux-mips.org>2015-03-25 08:48:00 -0400
commit5b9593f3bccb9904f260f9ad7f184e1d2921bd1e (patch)
tree06d4c30e6863919a084d467f6c0917e5e8922a7c /arch/mips/mm
parent9a49899eb88803dcc0ef437f09912f9a7b7a66fd (diff)
Revert "MIPS: Remove race window in page fault handling"
Revert commit 2a4a8b1e5d9d ("MIPS: Remove race window in page fault handling") because it increased the number of flushed dcache pages and became a performance problem for some workloads. Signed-off-by: Lars Persson <larper@axis.com> Cc: linux-mips@linux-mips.org Cc: paul.burton@imgtec.com Cc: linux-kernel@vger.kernel.org Patchwork: https://patchwork.linux-mips.org/patch/9345/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/mm')
-rw-r--r--arch/mips/mm/cache.c27
1 files changed, 8 insertions, 19 deletions
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
120EXPORT_SYMBOL(__flush_anon_page); 120EXPORT_SYMBOL(__flush_anon_page);
121 121
122static void mips_flush_dcache_from_pte(pte_t pteval, unsigned long address) 122void __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
141void 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
152unsigned long _page_cachable_default; 141unsigned long _page_cachable_default;
153EXPORT_SYMBOL(_page_cachable_default); 142EXPORT_SYMBOL(_page_cachable_default);
154 143