]> www.infradead.org Git - users/willy/linux.git/commitdiff
Merge branch 'akpm-current/current'
authorStephen Rothwell <sfr@canb.auug.org.au>
Mon, 10 Dec 2018 08:16:52 +0000 (19:16 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Mon, 10 Dec 2018 08:16:55 +0000 (19:16 +1100)
70 files changed:
1  2 
Documentation/admin-guide/kernel-parameters.txt
Documentation/filesystems/proc.txt
Documentation/process/coding-style.rst
arch/arm64/Kconfig
arch/arm64/Makefile
arch/arm64/include/asm/memory.h
arch/arm64/include/asm/uaccess.h
arch/mips/include/asm/bitops.h
arch/powerpc/include/asm/book3s/32/pgalloc.h
arch/powerpc/include/asm/book3s/64/pgalloc.h
arch/powerpc/include/asm/nohash/32/pgalloc.h
arch/powerpc/include/asm/nohash/64/pgalloc.h
arch/powerpc/mm/mem.c
arch/powerpc/mm/pgtable-frag.c
arch/powerpc/mm/pgtable_32.c
arch/x86/Kconfig
block/genhd.c
drivers/gpu/drm/amd/amdkfd/kfd_crat.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
drivers/infiniband/core/umem_odp.c
drivers/md/dm-bufio.c
drivers/md/dm-crypt.c
drivers/md/dm-integrity.c
drivers/misc/vmw_balloon.c
drivers/nvdimm/pmem.c
drivers/parisc/ccio-dma.c
drivers/parisc/sba_iommu.c
drivers/staging/android/ion/ion_system_heap.c
fs/autofs/autofs_i.h
fs/autofs/init.c
fs/autofs/inode.c
fs/bfs/inode.c
fs/buffer.c
fs/dax.c
fs/eventpoll.c
fs/exec.c
fs/file_table.c
fs/fuse/inode.c
fs/hugetlbfs/inode.c
fs/iomap.c
fs/ocfs2/dlmfs/dlmfs.c
fs/proc/inode.c
fs/userfaultfd.c
include/linux/compiler-gcc.h
include/linux/printk.h
include/linux/sched.h
include/linux/shmem_fs.h
include/linux/slab.h
include/linux/swap.h
include/uapi/linux/fcntl.h
init/Kconfig
init/initramfs.c
init/main.c
kernel/cgroup/cpuset.c
kernel/events/uprobes.c
kernel/panic.c
kernel/sysctl.c
lib/Kconfig.debug
mm/huge_memory.c
mm/khugepaged.c
mm/memory-failure.c
mm/shmem.c
mm/slab.c
mm/slab_common.c
mm/swap.c
mm/vmscan.c
net/dccp/proto.c
net/netfilter/xt_hashlimit.c
scripts/checkpatch.pl

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index b5b955eb2fb733685a5c9bef250be58e09bc9faa,af9e13555d9579dbe2880ed191aa00345d5ce21e..3633502e102cec215ba926cd14b1e73b9dd19a97
@@@ -56,16 -61,29 +56,16 @@@ static inline void pmd_populate_kernel(
  static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
                                pgtable_t pte_page)
  {
 -      *pmdp = __pmd((page_to_pfn(pte_page) << PAGE_SHIFT) | _PMD_PRESENT);
 -}
 -
 -#define pmd_pgtable(pmd) pmd_page(pmd)
 -#else
 -
 -static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
 -                                     pte_t *pte)
 -{
 -      *pmdp = __pmd((unsigned long)pte | _PMD_PRESENT);
 -}
 -
 -static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
 -                              pgtable_t pte_page)
 -{
 -      *pmdp = __pmd((unsigned long)lowmem_page_address(pte_page) | _PMD_PRESENT);
 +      *pmdp = __pmd(__pa(pte_page) | _PMD_PRESENT);
  }
  
 -#define pmd_pgtable(pmd) pmd_page(pmd)
 -#endif
 +#define pmd_pgtable(pmd) ((pgtable_t)pmd_page_vaddr(pmd))
  
- extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
- extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr);
+ extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm);
+ extern pgtable_t pte_alloc_one(struct mm_struct *mm);
 +void pte_frag_destroy(void *pte_frag);
- pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel);
++pte_t *pte_fragment_alloc(struct mm_struct *mm, int kernel);
 +void pte_fragment_free(unsigned long *table, int kernel);
  
  static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  {
index 4aba625389c47aa2c26010f191304cb07f2ec862,8f1d92e99fe57f87f240c74280c9afa5dbcedbf1..9c1173283b96bfd1af86255e98ee7730dcc39f20
@@@ -37,9 -37,12 +37,9 @@@ extern struct vmemmap_backing *vmemmap_
  #define MAX_PGTABLE_INDEX_SIZE        0xf
  
  extern struct kmem_cache *pgtable_cache[];
 -#define PGT_CACHE(shift) ({                           \
 -                      BUG_ON(!(shift));               \
 -                      pgtable_cache[(shift) - 1];     \
 -              })
 +#define PGT_CACHE(shift) pgtable_cache[shift]
  
- extern pte_t *pte_fragment_alloc(struct mm_struct *, unsigned long, int);
+ extern pte_t *pte_fragment_alloc(struct mm_struct *, int);
  extern pmd_t *pmd_fragment_alloc(struct mm_struct *, unsigned long);
  extern void pte_fragment_free(unsigned long *, int);
  extern void pmd_fragment_free(unsigned long *);
index 17963951bdb06570966cae406323f9cbf893551b,16623f53f0d422c30beb831adbdf6fe6d2993902..bd186e85b4f701cd01a57c22469d96193f9420c0
@@@ -73,17 -77,14 +73,17 @@@ static inline void pmd_populate_kernel(
  static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
                                pgtable_t pte_page)
  {
 -      *pmdp = __pmd((unsigned long)lowmem_page_address(pte_page) | _PMD_PRESENT);
 +      *pmdp = __pmd((unsigned long)pte_page | _PMD_PRESENT);
  }
  
 -#define pmd_pgtable(pmd) pmd_page(pmd)
 +#define pmd_pgtable(pmd) ((pgtable_t)pmd_page_vaddr(pmd))
  #endif
  
- extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
- extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr);
+ extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm);
+ extern pgtable_t pte_alloc_one(struct mm_struct *mm);
 +void pte_frag_destroy(void *pte_frag);
- pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel);
++pte_t *pte_fragment_alloc(struct mm_struct *mm, int kernel);
 +void pte_fragment_free(unsigned long *table, int kernel);
  
  static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  {
Simple merge
index af23a587f0193b054ba8f5b6ba8fdd67a09413bf,0000000000000000000000000000000000000000..a7b05214760ce3c538f4f8621bbd2325199a1bc9
mode 100644,000000..100644
--- /dev/null
@@@ -1,119 -1,0 +1,119 @@@
- pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel)
 +// SPDX-License-Identifier: GPL-2.0
 +
 +/*
 + *  Handling Page Tables through page fragments
 + *
 + */
 +
 +#include <linux/kernel.h>
 +#include <linux/gfp.h>
 +#include <linux/mm.h>
 +#include <linux/percpu.h>
 +#include <linux/hardirq.h>
 +#include <linux/hugetlb.h>
 +#include <asm/pgalloc.h>
 +#include <asm/tlbflush.h>
 +#include <asm/tlb.h>
 +
 +void pte_frag_destroy(void *pte_frag)
 +{
 +      int count;
 +      struct page *page;
 +
 +      page = virt_to_page(pte_frag);
 +      /* drop all the pending references */
 +      count = ((unsigned long)pte_frag & ~PAGE_MASK) >> PTE_FRAG_SIZE_SHIFT;
 +      /* We allow PTE_FRAG_NR fragments from a PTE page */
 +      if (atomic_sub_and_test(PTE_FRAG_NR - count, &page->pt_frag_refcount)) {
 +              pgtable_page_dtor(page);
 +              __free_page(page);
 +      }
 +}
 +
 +static pte_t *get_pte_from_cache(struct mm_struct *mm)
 +{
 +      void *pte_frag, *ret;
 +
 +      if (PTE_FRAG_NR == 1)
 +              return NULL;
 +
 +      spin_lock(&mm->page_table_lock);
 +      ret = pte_frag_get(&mm->context);
 +      if (ret) {
 +              pte_frag = ret + PTE_FRAG_SIZE;
 +              /*
 +               * If we have taken up all the fragments mark PTE page NULL
 +               */
 +              if (((unsigned long)pte_frag & ~PAGE_MASK) == 0)
 +                      pte_frag = NULL;
 +              pte_frag_set(&mm->context, pte_frag);
 +      }
 +      spin_unlock(&mm->page_table_lock);
 +      return (pte_t *)ret;
 +}
 +
 +static pte_t *__alloc_for_ptecache(struct mm_struct *mm, int kernel)
 +{
 +      void *ret = NULL;
 +      struct page *page;
 +
 +      if (!kernel) {
 +              page = alloc_page(PGALLOC_GFP | __GFP_ACCOUNT);
 +              if (!page)
 +                      return NULL;
 +              if (!pgtable_page_ctor(page)) {
 +                      __free_page(page);
 +                      return NULL;
 +              }
 +      } else {
 +              page = alloc_page(PGALLOC_GFP);
 +              if (!page)
 +                      return NULL;
 +      }
 +
 +      atomic_set(&page->pt_frag_refcount, 1);
 +
 +      ret = page_address(page);
 +      /*
 +       * if we support only one fragment just return the
 +       * allocated page.
 +       */
 +      if (PTE_FRAG_NR == 1)
 +              return ret;
 +      spin_lock(&mm->page_table_lock);
 +      /*
 +       * If we find pgtable_page set, we return
 +       * the allocated page with single fragement
 +       * count.
 +       */
 +      if (likely(!pte_frag_get(&mm->context))) {
 +              atomic_set(&page->pt_frag_refcount, PTE_FRAG_NR);
 +              pte_frag_set(&mm->context, ret + PTE_FRAG_SIZE);
 +      }
 +      spin_unlock(&mm->page_table_lock);
 +
 +      return (pte_t *)ret;
 +}
 +
++pte_t *pte_fragment_alloc(struct mm_struct *mm, int kernel)
 +{
 +      pte_t *pte;
 +
 +      pte = get_pte_from_cache(mm);
 +      if (pte)
 +              return pte;
 +
 +      return __alloc_for_ptecache(mm, kernel);
 +}
 +
 +void pte_fragment_free(unsigned long *table, int kernel)
 +{
 +      struct page *page = virt_to_page(table);
 +
 +      BUG_ON(atomic_read(&page->pt_frag_refcount) <= 0);
 +      if (atomic_dec_and_test(&page->pt_frag_refcount)) {
 +              if (!kernel)
 +                      pgtable_page_dtor(page);
 +              __free_page(page);
 +      }
 +}
index 4fc77a99c9bfc6d0c5bd601c329cfce22e33d796,1d8e2d98db98a9f467789bd95200704140cc0cdf..5b1e1adeb4d2786d2f19de1471129da8617114e5
@@@ -43,17 -43,34 +43,17 @@@ EXPORT_SYMBOL(ioremap_bot);        /* aka VMAL
  
  extern char etext[], _stext[], _sinittext[], _einittext[];
  
- __ref pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
+ __ref pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
  {
 -      pte_t *pte;
 +      if (!slab_is_available())
 +              return memblock_alloc(PTE_FRAG_SIZE, PTE_FRAG_SIZE);
  
-       return (pte_t *)pte_fragment_alloc(mm, address, 1);
 -      if (slab_is_available()) {
 -              pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_ZERO);
 -      } else {
 -              pte = __va(memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE));
 -              if (pte)
 -                      clear_page(pte);
 -      }
 -      return pte;
++      return (pte_t *)pte_fragment_alloc(mm, 1);
  }
  
- pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
+ pgtable_t pte_alloc_one(struct mm_struct *mm)
  {
-       return (pgtable_t)pte_fragment_alloc(mm, address, 0);
 -      struct page *ptepage;
 -
 -      gfp_t flags = GFP_KERNEL | __GFP_ZERO | __GFP_ACCOUNT;
 -
 -      ptepage = alloc_pages(flags, 0);
 -      if (!ptepage)
 -              return NULL;
 -      if (!pgtable_page_ctor(ptepage)) {
 -              __free_page(ptepage);
 -              return NULL;
 -      }
 -      return ptepage;
++      return (pgtable_t)pte_fragment_alloc(mm, 0);
  }
  
  void __iomem *
Simple merge
diff --cc block/genhd.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index d0b80ff8afcb237a45e602aec9b673151d0b0148,c0c1db2cc6ea7aa12ed64b8415b9558b884a0051..9d815c71b5cd4f20d9dea92d64c36f2e9718ef89
  #include "autofs_i.h"
  
  static struct dentry *autofs_mount(struct file_system_type *fs_type,
 -      int flags, const char *dev_name, void *data)
 +      int flags, const char *dev_name, void *data, size_t data_size)
  {
 -      return mount_nodev(fs_type, flags, data, autofs_fill_super);
 +      return mount_nodev(fs_type, flags, data, data_size, autofs_fill_super);
  }
  
- static struct file_system_type autofs_fs_type = {
+ struct file_system_type autofs_fs_type = {
        .owner          = THIS_MODULE,
        .name           = "autofs",
        .mount          = autofs_mount,
index 93e014d7f8132df59833427f4cb74251c09bfd01,501833cc49a8bea9309a93464c479630100d7602..d38b82c4f310639212ee10e8a85c4abc81ec1c8c
@@@ -198,11 -210,10 +210,11 @@@ static int parse_options(char *options
                        return 1;
                }
        }
-       return (*pipefd < 0);
+       return (sbi->pipefd < 0);
  }
  
 -int autofs_fill_super(struct super_block *s, void *data, int silent)
 +int autofs_fill_super(struct super_block *s, void *data, size_t data_size,
 +                    int silent)
  {
        struct inode *root_inode;
        struct dentry *root;
diff --cc fs/bfs/inode.c
Simple merge
diff --cc fs/buffer.c
Simple merge
diff --cc fs/dax.c
Simple merge
diff --cc fs/eventpoll.c
Simple merge
diff --cc fs/exec.c
Simple merge
diff --cc fs/file_table.c
Simple merge
diff --cc fs/fuse/inode.c
Simple merge
Simple merge
diff --cc fs/iomap.c
Simple merge
Simple merge
diff --cc fs/proc/inode.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc init/Kconfig
Simple merge
Simple merge
diff --cc init/main.c
Simple merge
Simple merge
Simple merge
diff --cc kernel/panic.c
Simple merge
diff --cc kernel/sysctl.c
index 5fc724e4e454c3304ecaebe7c868eb622f784eb8,2f445c82fe38ff4e02aefa8dc23d179770ebe393..93352cfb32392f0cdc2b8850b964d6e3619c1b57
@@@ -1471,6 -1487,15 +1487,17 @@@ static struct ctl_table vm_table[] = 
                .extra1         = &one,
                .extra2         = &one_thousand,
        },
++#ifdef CONFIG_NUMA
+       {
+               .procname       = "fragment_stall_order",
+               .data           = &fragment_stall_order,
+               .maxlen         = sizeof(fragment_stall_order),
+               .mode           = 0644,
+               .proc_handler   = fragment_stall_order_sysctl_handler,
+               .extra1         = &zero,
+               .extra2         = &max_order,
+       },
++#endif
        {
                .procname       = "percpu_pagelist_fraction",
                .data           = &percpu_pagelist_fraction,
Simple merge
Simple merge
diff --cc mm/khugepaged.c
Simple merge
Simple merge
diff --cc mm/shmem.c
Simple merge
diff --cc mm/slab.c
Simple merge
Simple merge
diff --cc mm/swap.c
Simple merge
diff --cc mm/vmscan.c
Simple merge
Simple merge
Simple merge
Simple merge