With radix, we will have to dynamically switch between different protection map. Hence override vm_get_page_prot instead of using arch_vm_get_page_prot.We could also drop arch_vm_get_page_prot since only powerpc define it. But then matching arch_calc_vm_prot_bits also need to be changed. So for now keep it.
Signed-off-by: Aneesh Kumar K.V <aneesh.ku...@linux.vnet.ibm.com> --- arch/powerpc/include/asm/book3s/64/hash.h | 3 +++ arch/powerpc/include/asm/mman.h | 6 ------ arch/powerpc/mm/hash_utils_64.c | 19 +++++++++++++++++++ mm/mmap.c | 5 +++++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/arch/powerpc/include/asm/book3s/64/hash.h b/arch/powerpc/include/asm/book3s/64/hash.h index 9ff1e056acef..37a152428c99 100644 --- a/arch/powerpc/include/asm/book3s/64/hash.h +++ b/arch/powerpc/include/asm/book3s/64/hash.h @@ -533,6 +533,9 @@ static inline pgprot_t pgprot_writecombine(pgprot_t prot) return pgprot_noncached_wc(prot); } +extern pgprot_t vm_get_page_prot(unsigned long vm_flags); +#define vm_get_page_prot vm_get_page_prot + #ifdef CONFIG_TRANSPARENT_HUGEPAGE extern void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, pmd_t *pmdp, unsigned long old_pmd); diff --git a/arch/powerpc/include/asm/mman.h b/arch/powerpc/include/asm/mman.h index 8565c254151a..9f48698af024 100644 --- a/arch/powerpc/include/asm/mman.h +++ b/arch/powerpc/include/asm/mman.h @@ -24,12 +24,6 @@ static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot) } #define arch_calc_vm_prot_bits(prot) arch_calc_vm_prot_bits(prot) -static inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags) -{ - return (vm_flags & VM_SAO) ? __pgprot(_PAGE_SAO) : __pgprot(0); -} -#define arch_vm_get_page_prot(vm_flags) arch_vm_get_page_prot(vm_flags) - static inline int arch_validate_prot(unsigned long prot) { if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM | PROT_SAO)) diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 4233dcccbaf7..6ad84eb5fe56 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c @@ -1563,3 +1563,22 @@ void setup_initial_memory_limit(phys_addr_t first_memblock_base, /* Finally limit subsequent allocations */ memblock_set_current_limit(ppc64_rma_size); } + +static pgprot_t hash_protection_map[16] = { + __P000, __P001, __P010, __P011, __P100, + __P101, __P110, __P111, __S000, __S001, + __S010, __S011, __S100, __S101, __S110, __S111 +}; + +pgprot_t vm_get_page_prot(unsigned long vm_flags) +{ + pgprot_t prot_soa = __pgprot(0); + + if (vm_flags & VM_SAO) + prot_soa = __pgprot(_PAGE_SAO); + + return __pgprot(pgprot_val(hash_protection_map[vm_flags & + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) | + pgprot_val(prot_soa)); +} +EXPORT_SYMBOL(vm_get_page_prot); diff --git a/mm/mmap.c b/mm/mmap.c index f32b84ad621a..bdde0252ba0c 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -89,6 +89,10 @@ static void unmap_region(struct mm_struct *mm, * x: (no) no x: (no) yes x: (no) yes x: (yes) yes * */ +/* + * Give arch an option to override the below in dynamic matter + */ +#ifndef vm_get_page_prot pgprot_t protection_map[16] = { __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111 @@ -101,6 +105,7 @@ pgprot_t vm_get_page_prot(unsigned long vm_flags) pgprot_val(arch_vm_get_page_prot(vm_flags))); } EXPORT_SYMBOL(vm_get_page_prot); +#endif static pgprot_t vm_pgprot_modify(pgprot_t oldprot, unsigned long vm_flags) { -- 2.5.0 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev