X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fppc%2Fmm%2Ffault.c;fp=arch%2Fppc%2Fmm%2Ffault.c;h=ee5e9f25baf98d7c567361739ee30864bb8c980d;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=5cdfb71fcb078ca50f56059a907e0104ab452194;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/arch/ppc/mm/fault.c b/arch/ppc/mm/fault.c index 5cdfb71fc..ee5e9f25b 100644 --- a/arch/ppc/mm/fault.c +++ b/arch/ppc/mm/fault.c @@ -1,4 +1,6 @@ /* + * arch/ppc/mm/fault.c + * * PowerPC version * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) * @@ -13,6 +15,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include @@ -201,7 +204,6 @@ good_area: /* an exec - 4xx/Book-E allows for per-page execute permission */ } else if (TRAP(regs) == 0x400) { pte_t *ptep; - pmd_t *pmdp; #if 0 /* It would be nice to actually enforce the VM execute @@ -215,24 +217,21 @@ good_area: /* Since 4xx/Book-E supports per-page execute permission, * we lazily flush dcache to icache. */ ptep = NULL; - if (get_pteptr(mm, address, &ptep, &pmdp)) { - spinlock_t *ptl = pte_lockptr(mm, pmdp); - spin_lock(ptl); - if (pte_present(*ptep)) { - struct page *page = pte_page(*ptep); - - if (!test_bit(PG_arch_1, &page->flags)) { - flush_dcache_icache_page(page); - set_bit(PG_arch_1, &page->flags); - } - pte_update(ptep, 0, _PAGE_HWEXEC); - _tlbie(address); - pte_unmap_unlock(ptep, ptl); - up_read(&mm->mmap_sem); - return 0; + if (get_pteptr(mm, address, &ptep) && pte_present(*ptep)) { + struct page *page = pte_page(*ptep); + + if (! test_bit(PG_arch_1, &page->flags)) { + flush_dcache_icache_page(page); + set_bit(PG_arch_1, &page->flags); } - pte_unmap_unlock(ptep, ptl); + pte_update(ptep, 0, _PAGE_HWEXEC); + _tlbie(address); + pte_unmap(ptep); + up_read(&mm->mmap_sem); + return 0; } + if (ptep != NULL) + pte_unmap(ptep); #endif /* a read */ } else {