| From: Anshuman Khandual <anshuman.khandual@arm.com> |
| Subject: mm/mmap: drop protection_map[] |
| |
| There are no other users for protection_map[]. Hence just drop this array |
| construct and instead define __vm_get_page_prot() which will provide page |
| protection map based on vm_flags combination switch. |
| |
| Link: https://lkml.kernel.org/r/1645425519-9034-12-git-send-email-anshuman.khandual@arm.com |
| Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| include/linux/mm.h | 6 ---- |
| mm/mmap.c | 61 ++++++++++++++++++++++++++++--------------- |
| 2 files changed, 41 insertions(+), 26 deletions(-) |
| |
| --- a/include/linux/mm.h~mm-mmap-drop-protection_map |
| +++ a/include/linux/mm.h |
| @@ -419,12 +419,6 @@ extern unsigned int kobjsize(const void |
| #define VM_FLAGS_CLEAR (ARCH_VM_PKEY_FLAGS | VM_ARCH_CLEAR) |
| |
| /* |
| - * mapping from the currently active vm_flags protection bits (the |
| - * low four bits) to a page protection mask.. |
| - */ |
| -extern pgprot_t protection_map[16]; |
| - |
| -/* |
| * The default fault flags that should be used by most of the |
| * arch-specific page fault handlers. |
| */ |
| --- a/mm/mmap.c~mm-mmap-drop-protection_map |
| +++ a/mm/mmap.c |
| @@ -102,24 +102,6 @@ static void unmap_region(struct mm_struc |
| * w: (no) no |
| * x: (yes) yes |
| */ |
| -pgprot_t protection_map[16] __ro_after_init = { |
| - [VM_NONE] = __P000, |
| - [VM_READ] = __P001, |
| - [VM_WRITE] = __P010, |
| - [VM_WRITE | VM_READ] = __P011, |
| - [VM_EXEC] = __P100, |
| - [VM_EXEC | VM_READ] = __P101, |
| - [VM_EXEC | VM_WRITE] = __P110, |
| - [VM_EXEC | VM_WRITE | VM_READ] = __P111, |
| - [VM_SHARED] = __S000, |
| - [VM_SHARED | VM_READ] = __S001, |
| - [VM_SHARED | VM_WRITE] = __S010, |
| - [VM_SHARED | VM_WRITE | VM_READ] = __S011, |
| - [VM_SHARED | VM_EXEC] = __S100, |
| - [VM_SHARED | VM_EXEC | VM_READ] = __S101, |
| - [VM_SHARED | VM_EXEC | VM_WRITE] = __S110, |
| - [VM_SHARED | VM_EXEC | VM_WRITE | VM_READ] = __S111 |
| -}; |
| |
| #ifndef CONFIG_ARCH_HAS_FILTER_PGPROT |
| static inline pgprot_t arch_filter_pgprot(pgprot_t prot) |
| @@ -128,10 +110,49 @@ static inline pgprot_t arch_filter_pgpro |
| } |
| #endif |
| |
| +static inline pgprot_t __vm_get_page_prot(unsigned long vm_flags) |
| +{ |
| + switch (vm_flags & (VM_READ | VM_WRITE | VM_EXEC | VM_SHARED)) { |
| + case VM_NONE: |
| + return __P000; |
| + case VM_READ: |
| + return __P001; |
| + case VM_WRITE: |
| + return __P010; |
| + case VM_READ | VM_WRITE: |
| + return __P011; |
| + case VM_EXEC: |
| + return __P100; |
| + case VM_EXEC | VM_READ: |
| + return __P101; |
| + case VM_EXEC | VM_WRITE: |
| + return __P110; |
| + case VM_EXEC | VM_READ | VM_WRITE: |
| + return __P111; |
| + case VM_SHARED: |
| + return __S000; |
| + case VM_SHARED | VM_READ: |
| + return __S001; |
| + case VM_SHARED | VM_WRITE: |
| + return __S010; |
| + case VM_SHARED | VM_READ | VM_WRITE: |
| + return __S011; |
| + case VM_SHARED | VM_EXEC: |
| + return __S100; |
| + case VM_SHARED | VM_EXEC | VM_READ: |
| + return __S101; |
| + case VM_SHARED | VM_EXEC | VM_WRITE: |
| + return __S110; |
| + case VM_SHARED | VM_EXEC | VM_READ | VM_WRITE: |
| + return __S111; |
| + default: |
| + BUILD_BUG(); |
| + } |
| +} |
| + |
| pgprot_t vm_get_page_prot(unsigned long vm_flags) |
| { |
| - pgprot_t ret = __pgprot(pgprot_val(protection_map[vm_flags & |
| - (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) | |
| + pgprot_t ret = __pgprot(pgprot_val(__vm_get_page_prot(vm_flags)) | |
| pgprot_val(arch_vm_get_page_prot(vm_flags))); |
| |
| return arch_filter_pgprot(ret); |
| _ |