ARM: make_coherent(): fix problems with highpte, part 2
authorRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 18 Dec 2009 16:43:57 +0000 (16:43 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 20 Feb 2010 16:42:51 +0000 (16:42 +0000)
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>
arch/arm/mm/fault-armv.c

index c45f9bb..c9b97e9 100644 (file)
@@ -99,7 +99,8 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address,
 }
 
 static void
-make_coherent(struct address_space *mapping, struct vm_area_struct *vma, unsigned long addr, unsigned long pfn)
+make_coherent(struct address_space *mapping, struct vm_area_struct *vma,
+       unsigned long addr, pte_t *ptep, unsigned long pfn)
 {
        struct mm_struct *mm = vma->vm_mm;
        struct vm_area_struct *mpnt;
@@ -131,7 +132,7 @@ make_coherent(struct address_space *mapping, struct vm_area_struct *vma, unsigne
        }
        flush_dcache_mmap_unlock(mapping);
        if (aliases)
-               adjust_pte(vma, addr, pfn);
+               do_adjust_pte(vma, addr, pfn, ptep);
        else
                flush_cache_page(vma, addr, pfn);
 }
@@ -174,7 +175,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr,
 #endif
        if (mapping) {
                if (cache_is_vivt())
-                       make_coherent(mapping, vma, addr, pfn);
+                       make_coherent(mapping, vma, addr, ptep, pfn);
                else if (vma->vm_flags & VM_EXEC)
                        __flush_icache_all();
        }