linux_dsm_epyc7002/arch/powerpc/mm/book3s64
Aneesh Kumar K.V 19ab500edb powerpc/mm/pkeys: Make pkey access check work on execute_only_key
Jan reported that LTP mmap03 was getting stuck in a page fault loop
after commit c46241a370 ("powerpc/pkeys: Check vma before returning
key fault error to the user"), as well as a minimised reproducer:

  #include <fcntl.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/mman.h>

  int main(int ac, char **av)
  {
  	int page_sz = getpagesize();
  	int fildes;
  	char *addr;

  	fildes = open("tempfile", O_WRONLY | O_CREAT, 0666);
  	write(fildes, &fildes, sizeof(fildes));
  	close(fildes);

  	fildes = open("tempfile", O_RDONLY);
  	unlink("tempfile");

  	addr = mmap(0, page_sz, PROT_EXEC, MAP_FILE | MAP_PRIVATE, fildes, 0);

  	printf("%d\n", *addr);
  	return 0;
  }

And noticed that access_pkey_error() in page fault handler now always
seem to return false:

  __do_page_fault
    access_pkey_error(is_pkey: 1, is_exec: 0, is_write: 0)
      arch_vma_access_permitted
	pkey_access_permitted
	  if (!is_pkey_enabled(pkey))
	    return true
      return false

pkey_access_permitted() should not check if the pkey is available in
UAMOR (using is_pkey_enabled()). The kernel needs to do that check
only when allocating keys. This also makes sure the execute_only_key
which is marked as non-manageable via UAMOR is handled correctly in
pkey_access_permitted(), and fixes the bug.

Fixes: c46241a370 ("powerpc/pkeys: Check vma before returning key fault error to the user")
Reported-by: Jan Stancek <jstancek@redhat.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
[mpe: Include bug report details etc. in the change log]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200627070147.297535-1-aneesh.kumar@linux.ibm.com
2020-06-29 16:17:02 +10:00
..
hash_4k.c powerpc/mm: Move book3s64 specifics in subdirectory mm/book3s64 2019-05-03 01:18:38 +10:00
hash_64k.c powerpc/mm: Move book3s64 specifics in subdirectory mm/book3s64 2019-05-03 01:18:38 +10:00
hash_hugepage.c powerpc/mm: Move book3s64 specifics in subdirectory mm/book3s64 2019-05-03 01:18:38 +10:00
hash_hugetlbpage.c mm: don't include asm/pgtable.h if linux/mm.h is already included 2020-06-09 09:39:13 -07:00
hash_native.c mm: reorder includes after introduction of linux/pgtable.h 2020-06-09 09:39:13 -07:00
hash_pgtable.c mmap locking API: convert mmap_sem comments 2020-06-09 09:39:14 -07:00
hash_tlb.c powerpc: Replace _ALIGN_UP() by ALIGN() 2020-05-11 23:15:15 +10:00
hash_utils.c mm: reorder includes after introduction of linux/pgtable.h 2020-06-09 09:39:13 -07:00
internal.h powerpc/64s/hash: Add stress_slb kernel boot option to increase SLB faults 2020-05-20 23:39:58 +10:00
iommu_api.c mmap locking API: use coccinelle to convert mmap_sem rwsem call sites 2020-06-09 09:39:14 -07:00
Makefile powerpc/pseries: Move mm/book3s64/vphn.c under platforms/pseries/ 2019-07-04 22:23:38 +10:00
mmu_context.c powerpc/book3s64/radix: Remove WARN_ON in destroy_context() 2019-09-21 08:36:53 +10:00
pgtable.c powerpc/64s/radix: Don't prefetch DAR in update_mmu_cache 2020-05-28 23:24:34 +10:00
pkeys.c powerpc/mm/pkeys: Make pkey access check work on execute_only_key 2020-06-29 16:17:02 +10:00
radix_hugetlbpage.c mm: don't include asm/pgtable.h if linux/mm.h is already included 2020-06-09 09:39:13 -07:00
radix_pgtable.c mm: don't include asm/pgtable.h if linux/mm.h is already included 2020-06-09 09:39:13 -07:00
radix_tlb.c powerpc/book3s64/radix/tlb: Determine hugepage flush correctly 2020-05-20 23:39:55 +10:00
slb.c mm: reorder includes after introduction of linux/pgtable.h 2020-06-09 09:39:13 -07:00
subpage_prot.c mmap locking API: convert mmap_sem comments 2020-06-09 09:39:14 -07:00