]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Merge branch topic/uek-4.1/upstream-cherry-picks of git://ca-git.us.oracle.com/linux...
authorChuck Anderson <chuck.anderson@oracle.com>
Mon, 23 Jan 2017 06:40:29 +0000 (22:40 -0800)
committerChuck Anderson <chuck.anderson@oracle.com>
Mon, 23 Jan 2017 06:40:29 +0000 (22:40 -0800)
* topic/uek-4.1/upstream-cherry-picks: (55 commits)
  userfaultfd: fix SIGBUS resulting from false rwsem wakeups
  userfaultfd: hugetlbfs: fix add copy_huge_page_from_user for hugetlb userfaultfd support
  userfaultfd: hugetlbfs: reserve count on error in __mcopy_atomic_hugetlb
  userfaultfd: hugetlbfs: gup: support VM_FAULT_RETRY
  userfaultfd: hugetlbfs: userfaultfd_huge_must_wait for hugepmd ranges
  userfaultfd: hugetlbfs: add userfaultfd_hugetlb test
  userfaultfd: hugetlbfs: allow registration of ranges containing huge pages
  userfaultfd: hugetlbfs: add userfaultfd hugetlb hook
  userfaultfd: hugetlbfs: fix __mcopy_atomic_hugetlb retry/error processing
  userfaultfd: hugetlbfs: add __mcopy_atomic_hugetlb for huge page UFFDIO_COPY
  userfaultfd: hugetlbfs: add hugetlb_mcopy_atomic_pte for userfaultfd support
  userfaultfd: hugetlbfs: add copy_huge_page_from_user for hugetlb userfaultfd support
  mm/hugetlb: fix huge page reservation leak in private mapping error paths
  mm/hugetlb: fix huge page reserve accounting for private mappings
  userfaultfd: don't pin the user memory in userfaultfd_file_create()
  userfaultfd: don't block on the last VM updates at exit time
  sparc: add waitfd to 32 bit system call tables
  userfaultfd: remove kernel header include from uapi header
  userfaultfd: register uapi generic syscall (aarch64)
  userfaultfd: selftest: don't error out if pthread_mutex_t isn't identical
  ...

Conflicts:
arch/x86/syscalls/syscall_32.tbl
arch/x86/syscalls/syscall_64.tbl
fs/Makefile
include/linux/mm_types.h
mm/hugetlb.c

18 files changed:
1  2 
arch/sparc/kernel/systbls_64.S
arch/x86/syscalls/syscall_32.tbl
arch/x86/syscalls/syscall_64.tbl
fs/Makefile
include/linux/mm.h
include/linux/mm_types.h
include/linux/sched.h
include/uapi/linux/Kbuild
init/Kconfig
kernel/fork.c
kernel/sys_ni.c
mm/gup.c
mm/huge_memory.c
mm/hugetlb.c
mm/memory.c
mm/mempolicy.c
mm/mlock.c
mm/mmap.c

Simple merge
index da49ccb036bdb1eabd3e6f6326b59c8fb96b4805,dcc18ea75412d3c091ea0e9c647325dae0aec687..65dc70257131431807a74037dead26b44d4f5d7f
  356   i386    memfd_create            sys_memfd_create
  357   i386    bpf                     sys_bpf
  358   i386    execveat                sys_execveat                    stub32_execveat
+ 359   i386    userfaultfd             sys_userfaultfd
 +# This one is a temporary number, designed for no clashes.
 +# Nothing but DTrace should use it.
 +473   i386    waitfd                  sys_waitfd
index afa9c1378c3d8eff2c6509fe612167f11d12011a,81c490634db994ba810984f8f6dab052a54c8139..5c7cc9fbfc342449fabd69395cd1c261d7f03232
  320   common  kexec_file_load         sys_kexec_file_load
  321   common  bpf                     sys_bpf
  322   64      execveat                stub_execveat
+ 323   common  userfaultfd             sys_userfaultfd
 +# This one is a temporary number, designed for no clashes.
 +# Nothing but DTrace should use it.
 +473   common  waitfd                  sys_waitfd
  
  #
  # x32-specific system call numbers start at 512 to avoid cache impact
diff --cc fs/Makefile
index 5401bd793ae9187316e700404920171652aa85a9,53e59b212a1050728055bd56b9f78b521ee51132..583ac5ff044b7e822aad98f7f3dae9643cf28606
@@@ -27,7 -27,7 +27,8 @@@ obj-$(CONFIG_ANON_INODES)     += anon_inode
  obj-$(CONFIG_SIGNALFD)                += signalfd.o
  obj-$(CONFIG_TIMERFD)         += timerfd.o
  obj-$(CONFIG_EVENTFD)         += eventfd.o
 +obj-$(CONFIG_WAITFD)          += waitfd.o
+ obj-$(CONFIG_USERFAULTFD)     += userfaultfd.o
  obj-$(CONFIG_AIO)               += aio.o
  obj-$(CONFIG_FS_DAX)          += dax.o
  obj-$(CONFIG_FILE_LOCKING)      += locks.o
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc init/Kconfig
Simple merge
diff --cc kernel/fork.c
Simple merge
diff --cc kernel/sys_ni.c
Simple merge
diff --cc mm/gup.c
Simple merge
index 3e9b9a3a2682b14016543dff7748d944878aee52,0028ba2c9cc8adb4fd78a6f93031d23cf3c350f2..e5a8cce84a50e4dfa444e17241f1befe33911fc7
@@@ -827,57 -869,10 +865,51 @@@ int do_huge_pmd_anonymous_page(struct m
                count_vm_event(THP_FAULT_FALLBACK);
                return VM_FAULT_FALLBACK;
        }
-       if (unlikely(__do_huge_pmd_anonymous_page(mm, vma, haddr, pmd, page, gfp))) {
-               put_page(page);
-               count_vm_event(THP_FAULT_FALLBACK);
-               return VM_FAULT_FALLBACK;
-       }
-       count_vm_event(THP_FAULT_ALLOC);
-       return 0;
+       return __do_huge_pmd_anonymous_page(mm, vma, address, pmd, page, gfp,
+                                           flags);
  }
  
 +static void insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,
 +              pmd_t *pmd, unsigned long pfn, pgprot_t prot, bool write)
 +{
 +      struct mm_struct *mm = vma->vm_mm;
 +      pmd_t entry;
 +      spinlock_t *ptl;
 +
 +      ptl = pmd_lock(mm, pmd);
 +      entry = pmd_mkhuge(pfn_pmd(pfn, prot));
 +      if (write) {
 +              entry = pmd_mkyoung(pmd_mkdirty(entry));
 +              entry = maybe_pmd_mkwrite(entry, vma);
 +      }
 +      set_pmd_at(mm, addr, pmd, entry);
 +      update_mmu_cache_pmd(vma, addr, pmd);
 +      spin_unlock(ptl);
 +}
 +
 +int vmf_insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,
 +                      pmd_t *pmd, unsigned long pfn, bool write)
 +{
 +      pgprot_t pgprot = vma->vm_page_prot;
 +      /*
 +       * If we had pmd_special, we could avoid all these restrictions,
 +       * but we need to be consistent with PTEs and architectures that
 +       * can't support a 'special' bit.
 +       */
 +      BUG_ON(!(vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP)));
 +      BUG_ON((vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP)) ==
 +                                              (VM_PFNMAP|VM_MIXEDMAP));
 +      BUG_ON((vma->vm_flags & VM_PFNMAP) && is_cow_mapping(vma->vm_flags));
 +      BUG_ON((vma->vm_flags & VM_MIXEDMAP) && pfn_valid(pfn));
 +
 +      if (addr < vma->vm_start || addr >= vma->vm_end)
 +              return VM_FAULT_SIGBUS;
 +      if (track_pfn_insert(vma, &pgprot, pfn))
 +              return VM_FAULT_SIGBUS;
 +      insert_pfn_pmd(vma, addr, pmd, pfn, pgprot, write);
 +      return VM_FAULT_NOPAGE;
 +}
 +
  int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,
                  pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr,
                  struct vm_area_struct *vma)
diff --cc mm/hugetlb.c
Simple merge
diff --cc mm/memory.c
Simple merge
diff --cc mm/mempolicy.c
Simple merge
diff --cc mm/mlock.c
Simple merge
diff --cc mm/mmap.c
Simple merge