mm/core, arch, powerpc: Pass a protection key in to calc_vm_flag_bits()
authorDave Hansen <[email protected]>
Fri, 12 Feb 2016 21:02:31 +0000 (13:02 -0800)
committerIngo Molnar <[email protected]>
Thu, 18 Feb 2016 18:46:30 +0000 (19:46 +0100)
This plumbs a protection key through calc_vm_flag_bits().  We
could have done this in calc_vm_prot_bits(), but I did not feel
super strongly which way to go.  It was pretty arbitrary which
one to use.

Signed-off-by: Dave Hansen <[email protected]>
Reviewed-by: Thomas Gleixner <[email protected]>
Cc: Andrea Arcangeli <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Arve Hjønnevåg <[email protected]>
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Brian Gerst <[email protected]>
Cc: Chen Gang <[email protected]>
Cc: Dan Williams <[email protected]>
Cc: Dave Chinner <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: David Airlie <[email protected]>
Cc: Denys Vlasenko <[email protected]>
Cc: Eric W. Biederman <[email protected]>
Cc: Geliang Tang <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Kirill A. Shutemov <[email protected]>
Cc: Konstantin Khlebnikov <[email protected]>
Cc: Leon Romanovsky <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Masahiro Yamada <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: Mel Gorman <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Paul Gortmaker <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Rik van Riel <[email protected]>
Cc: Riley Andrews <[email protected]>
Cc: Vladimir Davydov <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
arch/powerpc/include/asm/mman.h
drivers/char/agp/frontend.c
drivers/staging/android/ashmem.c
include/linux/mman.h
mm/mmap.c
mm/mprotect.c
mm/nommu.c

index 8565c254151abed6bd3b698551c86035201c28b4..2563c435a4b166593e71812086baa791a01de43b 100644 (file)
  * This file is included by linux/mman.h, so we can't use cacl_vm_prot_bits()
  * here.  How important is the optimization?
  */
-static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot)
+static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
+               unsigned long pkey)
 {
        return (prot & PROT_SAO) ? VM_SAO : 0;
 }
-#define arch_calc_vm_prot_bits(prot) arch_calc_vm_prot_bits(prot)
+#define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey)
 
 static inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags)
 {
index 09f17eb734863fd0dfc6d69fc6f7716906391424..0f64d149c98dcdea120a03ea6f191c36c01b3a29 100644 (file)
@@ -156,7 +156,7 @@ static pgprot_t agp_convert_mmap_flags(int prot)
 {
        unsigned long prot_bits;
 
-       prot_bits = calc_vm_prot_bits(prot) | VM_SHARED;
+       prot_bits = calc_vm_prot_bits(prot, 0) | VM_SHARED;
        return vm_get_page_prot(prot_bits);
 }
 
index 5bb1283d19cd2c0b697d11cd2b03dbaa71ca57b7..2695ff121b04fdb0a27d3adbadf6c397967d57f7 100644 (file)
@@ -372,8 +372,8 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
        }
 
        /* requested protection bits must match our allowed protection mask */
-       if (unlikely((vma->vm_flags & ~calc_vm_prot_bits(asma->prot_mask)) &
-                    calc_vm_prot_bits(PROT_MASK))) {
+       if (unlikely((vma->vm_flags & ~calc_vm_prot_bits(asma->prot_mask, 0)) &
+                    calc_vm_prot_bits(PROT_MASK, 0))) {
                ret = -EPERM;
                goto out;
        }
index 16373c8f5f5788c12a2b404d3793f0dd67d979c5..33e17f6a327a2cb9972d1e31134ac354be27f045 100644 (file)
@@ -35,7 +35,7 @@ static inline void vm_unacct_memory(long pages)
  */
 
 #ifndef arch_calc_vm_prot_bits
-#define arch_calc_vm_prot_bits(prot) 0
+#define arch_calc_vm_prot_bits(prot, pkey) 0
 #endif
 
 #ifndef arch_vm_get_page_prot
@@ -70,12 +70,12 @@ static inline int arch_validate_prot(unsigned long prot)
  * Combine the mmap "prot" argument into "vm_flags" used internally.
  */
 static inline unsigned long
-calc_vm_prot_bits(unsigned long prot)
+calc_vm_prot_bits(unsigned long prot, unsigned long pkey)
 {
        return _calc_vm_trans(prot, PROT_READ,  VM_READ ) |
               _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) |
               _calc_vm_trans(prot, PROT_EXEC,  VM_EXEC) |
-              arch_calc_vm_prot_bits(prot);
+              arch_calc_vm_prot_bits(prot, pkey);
 }
 
 /*
index e2e9f48b06c2ad7a4fb4a11c61221a84caa5f593..784d2d6142a28f9911a2b780b00ccb4bd9f75f44 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1313,7 +1313,7 @@ unsigned long do_mmap(struct file *file, unsigned long addr,
         * to. we assume access permissions have been handled by the open
         * of the memory object, so we don't do any here.
         */
-       vm_flags |= calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags) |
+       vm_flags |= calc_vm_prot_bits(prot, 0) | calc_vm_flag_bits(flags) |
                        mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC;
 
        if (flags & MAP_LOCKED)
index f7cb3d4d9c2eb55d74738e374faa3bfa37251686..3790c8bee3805722b578be6b6d8acdc8a8d239e4 100644 (file)
@@ -380,7 +380,7 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len,
        if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC))
                prot |= PROT_EXEC;
 
-       vm_flags = calc_vm_prot_bits(prot);
+       vm_flags = calc_vm_prot_bits(prot, 0);
 
        down_write(&current->mm->mmap_sem);
 
index b64d04d1970273d8e5e7010582ac7b0b5af608d1..5ba39b82f241e84dac496729dc7e00c075093f36 100644 (file)
@@ -1082,7 +1082,7 @@ static unsigned long determine_vm_flags(struct file *file,
 {
        unsigned long vm_flags;
 
-       vm_flags = calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags);
+       vm_flags = calc_vm_prot_bits(prot, 0) | calc_vm_flag_bits(flags);
        /* vm_flags |= mm->def_flags; */
 
        if (!(capabilities & NOMMU_MAP_DIRECT)) {