Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6bfb709 authored by Dave Hansen's avatar Dave Hansen Committed by Ingo Molnar
Browse files

mm/core, arch, powerpc: Pass a protection key in to calc_vm_flag_bits()



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: default avatarDave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Arve Hjønnevåg <arve@android.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Chen Gang <gang.chen.5i5j@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Dave Hansen <dave@sr71.net>
Cc: David Airlie <airlied@linux.ie>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Eric W. Biederman <ebiederm@xmission.com>
Cc: Geliang Tang <geliangtang@163.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Konstantin Khlebnikov <koct9i@gmail.com>
Cc: Leon Romanovsky <leon@leon.nu>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Riley Andrews <riandrews@android.com>
Cc: Vladimir Davydov <vdavydov@virtuozzo.com>
Cc: devel@driverdev.osuosl.org
Cc: linux-api@vger.kernel.org
Cc: linux-arch@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-mm@kvack.org
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lkml.kernel.org/r/20160212210231.E6F1F0D6@viggo.jf.intel.com


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 06976945
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -18,11 +18,12 @@
 * This file is included by linux/mman.h, so we can't use cacl_vm_prot_bits()
 * This file is included by linux/mman.h, so we can't use cacl_vm_prot_bits()
 * here.  How important is the optimization?
 * 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;
	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)
static inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags)
{
{
+1 −1
Original line number Original line Diff line number Diff line
@@ -156,7 +156,7 @@ static pgprot_t agp_convert_mmap_flags(int prot)
{
{
	unsigned long prot_bits;
	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);
	return vm_get_page_prot(prot_bits);
}
}


+2 −2
Original line number Original line Diff line number Diff line
@@ -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 */
	/* requested protection bits must match our allowed protection mask */
	if (unlikely((vma->vm_flags & ~calc_vm_prot_bits(asma->prot_mask)) &
	if (unlikely((vma->vm_flags & ~calc_vm_prot_bits(asma->prot_mask, 0)) &
		     calc_vm_prot_bits(PROT_MASK))) {
		     calc_vm_prot_bits(PROT_MASK, 0))) {
		ret = -EPERM;
		ret = -EPERM;
		goto out;
		goto out;
	}
	}
+3 −3
Original line number Original line Diff line number Diff line
@@ -35,7 +35,7 @@ static inline void vm_unacct_memory(long pages)
 */
 */


#ifndef arch_calc_vm_prot_bits
#ifndef arch_calc_vm_prot_bits
#define arch_calc_vm_prot_bits(prot) 0
#define arch_calc_vm_prot_bits(prot, pkey) 0
#endif
#endif


#ifndef arch_vm_get_page_prot
#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.
 * Combine the mmap "prot" argument into "vm_flags" used internally.
 */
 */
static inline unsigned long
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 ) |
	return _calc_vm_trans(prot, PROT_READ,  VM_READ ) |
	       _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) |
	       _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) |
	       _calc_vm_trans(prot, PROT_EXEC,  VM_EXEC) |
	       _calc_vm_trans(prot, PROT_EXEC,  VM_EXEC) |
	       arch_calc_vm_prot_bits(prot);
	       arch_calc_vm_prot_bits(prot, pkey);
}
}


/*
/*
+1 −1
Original line number Original line Diff line number Diff line
@@ -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
	 * to. we assume access permissions have been handled by the open
	 * of the memory object, so we don't do any here.
	 * 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;
			mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC;


	if (flags & MAP_LOCKED)
	if (flags & MAP_LOCKED)
Loading