diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-12-18 11:43:57 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-02-20 11:42:51 -0500 |
commit | ae1402022edbeef3991f1e4bae8fa99558be291b (patch) | |
tree | 92d0c34f87ca4174a17d8fae1ac6bcdcd032fddc /arch/arm/mm/fault-armv.c | |
parent | 4b3073e1c53a256275f1079c0fbfbe85883d9275 (diff) |
ARM: make_coherent(): fix problems with highpte, part 2
update_mmu_cache() is called with the page table for the faulted-in
page still mapped. We need to modify the PTE for this page to ensure
coherency with other shared mappings when multiple shared mappings
exist within a MM.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mm/fault-armv.c')
-rw-r--r-- | arch/arm/mm/fault-armv.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/arch/arm/mm/fault-armv.c b/arch/arm/mm/fault-armv.c index c45f9bb318ad..c9b97e9836a2 100644 --- a/arch/arm/mm/fault-armv.c +++ b/arch/arm/mm/fault-armv.c | |||
@@ -99,7 +99,8 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address, | |||
99 | } | 99 | } |
100 | 100 | ||
101 | static void | 101 | static void |
102 | make_coherent(struct address_space *mapping, struct vm_area_struct *vma, unsigned long addr, unsigned long pfn) | 102 | make_coherent(struct address_space *mapping, struct vm_area_struct *vma, |
103 | unsigned long addr, pte_t *ptep, unsigned long pfn) | ||
103 | { | 104 | { |
104 | struct mm_struct *mm = vma->vm_mm; | 105 | struct mm_struct *mm = vma->vm_mm; |
105 | struct vm_area_struct *mpnt; | 106 | struct vm_area_struct *mpnt; |
@@ -131,7 +132,7 @@ make_coherent(struct address_space *mapping, struct vm_area_struct *vma, unsigne | |||
131 | } | 132 | } |
132 | flush_dcache_mmap_unlock(mapping); | 133 | flush_dcache_mmap_unlock(mapping); |
133 | if (aliases) | 134 | if (aliases) |
134 | adjust_pte(vma, addr, pfn); | 135 | do_adjust_pte(vma, addr, pfn, ptep); |
135 | else | 136 | else |
136 | flush_cache_page(vma, addr, pfn); | 137 | flush_cache_page(vma, addr, pfn); |
137 | } | 138 | } |
@@ -174,7 +175,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, | |||
174 | #endif | 175 | #endif |
175 | if (mapping) { | 176 | if (mapping) { |
176 | if (cache_is_vivt()) | 177 | if (cache_is_vivt()) |
177 | make_coherent(mapping, vma, addr, pfn); | 178 | make_coherent(mapping, vma, addr, ptep, pfn); |
178 | else if (vma->vm_flags & VM_EXEC) | 179 | else if (vma->vm_flags & VM_EXEC) |
179 | __flush_icache_all(); | 180 | __flush_icache_all(); |
180 | } | 181 | } |