]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge branch 'akpm-current/current'
authorStephen Rothwell <sfr@canb.auug.org.au>
Tue, 8 Mar 2016 05:22:17 +0000 (16:22 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Tue, 8 Mar 2016 05:22:20 +0000 (16:22 +1100)
96 files changed:
1  2 
Documentation/cgroup-v2.txt
Documentation/kernel-parameters.txt
Makefile
arch/Kconfig
arch/arm/Kconfig
arch/arm/kernel/smp.c
arch/arm/mach-lpc32xx/phy3250.c
arch/arm/mm/mmu.c
arch/arm64/mm/hugetlbpage.c
arch/mips/Kconfig
arch/mips/mm/gup.c
arch/powerpc/Kconfig
arch/powerpc/kernel/traps.c
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/mm/pgtable_64.c
arch/powerpc/sysdev/fsl_rmu.c
arch/s390/Kconfig
arch/s390/kernel/dumpstack.c
arch/s390/kernel/time.c
arch/x86/Kconfig
arch/x86/boot/Makefile
arch/x86/boot/compressed/Makefile
arch/x86/entry/syscalls/syscall_64.tbl
arch/x86/entry/vdso/Makefile
arch/x86/include/asm/ftrace.h
arch/x86/kernel/Makefile
arch/x86/kernel/cpu/Makefile
arch/x86/kernel/dumpstack.c
arch/x86/kernel/process_64.c
arch/x86/mm/Makefile
arch/x86/mm/gup.c
arch/x86/mm/pageattr.c
arch/x86/realmode/rm/Makefile
drivers/dma/qcom_bam_dma.c
drivers/firmware/efi/efivars.c
drivers/firmware/efi/libstub/Makefile
drivers/gpu/drm/etnaviv/etnaviv_gpu.c
drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
drivers/gpu/drm/omapdrm/omap_gem.c
drivers/gpu/host1x/job.c
drivers/media/platform/coda/coda-bit.c
drivers/net/ethernet/freescale/gianfar.c
drivers/net/ethernet/intel/fm10k/fm10k_main.c
drivers/net/ethernet/intel/igb/igb_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/wireless/marvell/mwifiex/debugfs.c
drivers/rapidio/rio.c
drivers/staging/lustre/lustre/llite/llite_internal.h
drivers/usb/common/common.c
drivers/video/fbdev/atmel_lcdfb.c
drivers/virtio/virtio_balloon.c
drivers/xen/balloon.c
fs/btrfs/tests/btrfs-tests.c
fs/cifs/cifsfs.c
fs/ocfs2/aops.c
fs/ocfs2/ocfs2_trace.h
fs/ocfs2/quota_global.c
fs/xfs/xfs_aops.c
include/asm-generic/bug.h
include/linux/dma-mapping.h
include/linux/kernel.h
include/linux/memory.h
include/linux/mm.h
include/linux/sched.h
include/linux/sched/sysctl.h
include/linux/trace_events.h
include/uapi/linux/Kbuild
init/Kconfig
init/main.c
kernel/Makefile
kernel/auditsc.c
kernel/fork.c
kernel/kexec_core.c
kernel/kexec_file.c
kernel/memremap.c
kernel/profile.c
kernel/sched/Makefile
kernel/signal.c
kernel/sysctl.c
lib/Kconfig.debug
lib/Makefile
mm/Kconfig
mm/filemap.c
mm/huge_memory.c
mm/ksm.c
mm/memory.c
mm/memory_hotplug.c
mm/mempolicy.c
mm/mmap.c
mm/mprotect.c
mm/nommu.c
mm/util.c
net/sctp/socket.c
scripts/Makefile.lib
scripts/link-vmlinux.sh
tools/perf/builtin-kmem.c

Simple merge
Simple merge
diff --cc Makefile
Simple merge
diff --cc arch/Kconfig
Simple merge
Simple merge
Simple merge
index 9e5c3dbb146d2c52a4dde5ef75295412259411f6,ee06fabdf60e69e014317c9703787da5f31dc79f..b2f9e226febeee970b0594c8be030a4838735e7c
@@@ -101,10 -122,27 +100,10 @@@ static int lpc32xx_clcd_mmap(struct clc
  
  static void lpc32xx_clcd_remove(struct clcd_fb *fb)
  {
-       dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,
-               fb->fb.screen_base, fb->fb.fix.smem_start);
+       dma_free_wc(&fb->dev->dev, fb->fb.fix.smem_len, fb->fb.screen_base,
+                   fb->fb.fix.smem_start);
  }
  
 -/*
 - * On some early LCD modules (1307.0), the backlight logic is inverted.
 - * For those board variants, swap the disable and enable states for
 - * BKL_POWER_GPIO.
 -*/
 -static void clcd_disable(struct clcd_fb *fb)
 -{
 -      gpio_set_value(BKL_POWER_GPIO, 0);
 -      gpio_set_value(LCD_POWER_GPIO, 0);
 -}
 -
 -static void clcd_enable(struct clcd_fb *fb)
 -{
 -      gpio_set_value(BKL_POWER_GPIO, 1);
 -      gpio_set_value(LCD_POWER_GPIO, 1);
 -}
 -
  static struct clcd_board lpc32xx_clcd_data = {
        .name           = "Phytec LCD",
        .check          = clcdfb_check,
index e4b681aafd6db5f501ac4b75afbfa2ff8341c4c9,434d76f0b36314e3731fe74376b7db5bc92483a6..62f4d01941f718bf02a6e24c19042d6c65b961d9
@@@ -732,7 -732,7 +732,7 @@@ static void *__init late_alloc(unsigne
        return ptr;
  }
  
--static pte_t * __init pte_alloc(pmd_t *pmd, unsigned long addr,
++static pte_t * __init arm_pte_alloc(pmd_t *pmd, unsigned long addr,
                                unsigned long prot,
                                void *(*alloc)(unsigned long sz))
  {
  static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr,
                                      unsigned long prot)
  {
--      return pte_alloc(pmd, addr, prot, early_alloc);
++      return arm_pte_alloc(pmd, addr, prot, early_alloc);
  }
  
  static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr,
                                  void *(*alloc)(unsigned long sz),
                                  bool ng)
  {
--      pte_t *pte = pte_alloc(pmd, addr, type->prot_l1, alloc);
++      pte_t *pte = arm_pte_alloc(pmd, addr, type->prot_l1, alloc);
        do {
                set_pte_ext(pte, pfn_pte(pfn, __pgprot(type->prot_pte)),
                            ng ? PTE_EXT_NG : 0);
index 82d607c3614ed8454d19f2da5d44a6cc914ee0b3,82d607c3614ed8454d19f2da5d44a6cc914ee0b3..bb6b4c7bfab3f8fd98b65062c657ce286fa6cafc
@@@ -124,7 -124,7 +124,7 @@@ pte_t *huge_pte_alloc(struct mm_struct 
                 * will be no pte_unmap() to correspond with this
                 * pte_alloc_map().
                 */
--              pte = pte_alloc_map(mm, NULL, pmd, addr);
++              pte = pte_alloc_map(mm, pmd, addr);
        } else if (sz == PMD_SIZE) {
                if (IS_ENABLED(CONFIG_ARCH_WANT_HUGE_PMD_SHARE) &&
                    pud_none(*pud))
index f5578e1a5789ed868aeb6580335459b42ae46aa4,11a32cfb355f8a4daa578145f2594980dd7f0601..95f2360694a4a437f7cec499c0d6ab968937b03a
@@@ -62,7 -62,7 +62,8 @@@ config MIP
        select HAVE_IRQ_TIME_ACCOUNTING
        select GENERIC_TIME_VSYSCALL
        select ARCH_CLOCKSOURCE_DATA
 +      select HANDLE_DOMAIN_IRQ
+       select HAVE_NMI
  
  menu "Machine selection"
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0bf6749522d9fd3b843ca7e35eb9b170a3263730,5f93ca072b21ee9e3469a735a98ecd5da1370b59..11c00a92ae0ad873ebfd8f3c4f39a2b355367d21
@@@ -9,8 -9,13 +9,14 @@@
  # Changed by many, many contributors over the years.
  #
  
 -KASAN_SANITIZE := n
 +KASAN_SANITIZE                        := n
 +OBJECT_FILES_NON_STANDARD     := y
+ # Kernel does not boot with kcov instrumentation here.
+ # One of the problems observed was insertion of __sanitizer_cov_trace_pc()
+ # callback into middle of per-cpu data enabling code. Thus the callback observed
+ # inconsistent state and crashed. We are interested mostly in syscall coverage,
+ # so boot code is not interesting anyway.
+ KCOV_INSTRUMENT := n
  
  # If you want to preset the SVGA mode, uncomment the next line and
  # set SVGA_MODE to whatever number you want.
index 5e1d26e094076873c8f37b117de4588f568ccea5,ad9e9fa5bb114528e84a542fc7559be93f68ea25..a9112097c1d6ceaafb9edfd1f4d9f2b5baa78670
  #     (see scripts/Makefile.lib size_append)
  #     compressed vmlinux.bin.all + u32 size of vmlinux.bin.all
  
 -KASAN_SANITIZE := n
 +KASAN_SANITIZE                        := n
 +OBJECT_FILES_NON_STANDARD     := y
+ # Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
+ KCOV_INSTRUMENT := n
  
  targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma \
        vmlinux.bin.xz vmlinux.bin.lzo vmlinux.bin.lz4
index 2e5b565adacc542415854612ad752e04cfc5df95,158eef4d95a545aeda0d5d2b297a2a62819d102b..b89b41e0b2699f89a8fa3fc89090aa6ab32c21da
  542   x32     getsockopt              compat_sys_getsockopt
  543   x32     io_setup                compat_sys_io_setup
  544   x32     io_submit               compat_sys_io_submit
 -545   x32     execveat                stub_x32_execveat
 +545   x32     execveat                compat_sys_execveat/ptregs
+ 546   x32     madvisev                compat_sys_madvisev
index f9fb859c98b974c138b045554b135275195d728f,5a1993905acef98c8b1fce42df86230657d4cbff..93216b5ab790b2c71267358e0f6aedc452784a9c
@@@ -3,9 -3,10 +3,11 @@@
  #
  
  KBUILD_CFLAGS += $(DISABLE_LTO)
 -KASAN_SANITIZE := n
 -UBSAN_SANITIZE := n
 +KASAN_SANITIZE                        := n
 +UBSAN_SANITIZE                        := n
 +OBJECT_FILES_NON_STANDARD     := y
+ # Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
+ KCOV_INSTRUMENT := n
  
  VDSO64-$(CONFIG_X86_64)               := y
  VDSOX32-$(CONFIG_X86_X32_ABI) := y
Simple merge
index d5fb0871aba3fcb3a556dae66255c8b185b7e32e,4648960d1c4c5b7374688e036549dc6b60f04699..edfa3ec6fc8e626baab96265aa2cb4f1c8c7a857
@@@ -16,14 -16,14 +16,19 @@@ CFLAGS_REMOVE_ftrace.o = -p
  CFLAGS_REMOVE_early_printk.o = -pg
  endif
  
 -KASAN_SANITIZE_head$(BITS).o := n
 -KASAN_SANITIZE_dumpstack.o := n
 -KASAN_SANITIZE_dumpstack_$(BITS).o := n
 +KASAN_SANITIZE_head$(BITS).o                          := n
 +KASAN_SANITIZE_dumpstack.o                            := n
 +KASAN_SANITIZE_dumpstack_$(BITS).o                    := n
 +
 +OBJECT_FILES_NON_STANDARD_head_$(BITS).o              := y
 +OBJECT_FILES_NON_STANDARD_relocate_kernel_$(BITS).o   := y
 +OBJECT_FILES_NON_STANDARD_mcount_$(BITS).o            := y
 +OBJECT_FILES_NON_STANDARD_test_nx.o                   := y
+ # If instrumentation of this dir is enabled, boot hangs during first second.
+ # Probably could be more selective here, but note that files related to irqs,
+ # boot, dumpstack/stacktrace, etc are either non-interesting or can lead to
+ # non-deterministic coverage.
+ KCOV_INSTRUMENT := n
  
  CFLAGS_irq.o := -I$(src)/../include/asm/trace
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 053abe7b0ef760376f8a854d0fc1ace8edde2fd8,35129dcdeb71e7fb0bbfb723a17b58b0c73dea0d..fc31fc89127771772c092c49fe6258b7480cfe44
@@@ -6,8 -6,9 +6,10 @@@
  # for more details.
  #
  #
 -KASAN_SANITIZE := n
 +KASAN_SANITIZE                        := n
 +OBJECT_FILES_NON_STANDARD     := y
+ # Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
+ KCOV_INSTRUMENT := n
  
  always := realmode.bin realmode.relocs
  
Simple merge
Simple merge
index a15841eced4e872d6be32830942e10afb0fd2ede,37cc9e395edb30e245e5bcddadc755785e31665c..34febfdb7650aae0d4b75e92c5771f539d2f1d4e
@@@ -23,7 -23,8 +23,9 @@@ KBUILD_CFLAGS                 := $(cflags-y) -DDISABL
  GCOV_PROFILE                  := n
  KASAN_SANITIZE                        := n
  UBSAN_SANITIZE                        := n
 +OBJECT_FILES_NON_STANDARD     := y
+ # Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
+ KCOV_INSTRUMENT                       := n
  
  lib-y                         := efi-stub-helper.o
  
Simple merge
index cc36a8dc9bd4c1b47bff9a73042ebdd448111624,359b0d7e8ef78faf6cd9d6e044cfb5088f99f0be..dcba74427a96d8b567497f6624706fff0c70befa
@@@ -1305,23 -1324,22 +1305,23 @@@ void omap_gem_free_object(struct drm_ge
         */
        WARN_ON(omap_obj->paddr_cnt > 0);
  
 -      /* don't free externally allocated backing memory */
 -      if (!(omap_obj->flags & OMAP_BO_EXT_MEM)) {
 -              if (omap_obj->pages)
 +      if (omap_obj->pages) {
 +              if (omap_obj->flags & OMAP_BO_MEM_DMABUF)
 +                      kfree(omap_obj->pages);
 +              else
                        omap_gem_detach_pages(obj);
 +      }
  
 -              if (!is_shmem(obj)) {
 -                      dma_free_wc(dev->dev, obj->size, omap_obj->vaddr,
 -                                  omap_obj->paddr);
 -              } else if (omap_obj->vaddr) {
 -                      vunmap(omap_obj->vaddr);
 -              }
 +      if (omap_obj->flags & OMAP_BO_MEM_DMA_API) {
-               dma_free_writecombine(dev->dev, obj->size,
++              dma_free_wc(dev->dev, obj->size,
 +                              omap_obj->vaddr, omap_obj->paddr);
 +      } else if (omap_obj->vaddr) {
 +              vunmap(omap_obj->vaddr);
 +      } else if (obj->import_attach) {
 +              drm_prime_gem_destroy(obj, omap_obj->sgt);
        }
  
 -      /* don't free externally allocated syncobj */
 -      if (!(omap_obj->flags & OMAP_BO_EXT_SYNC))
 -              kfree(omap_obj->sync);
 +      kfree(omap_obj->sync);
  
        drm_gem_object_release(obj);
  
@@@ -1410,25 -1428,10 +1410,25 @@@ struct drm_gem_object *omap_gem_new(str
                mapping_set_gfp_mask(mapping, GFP_USER | __GFP_DMA32);
        }
  
-               omap_obj->vaddr = dma_alloc_writecombine(dev->dev, size,
 +      /* Allocate memory if needed. */
 +      if (flags & OMAP_BO_MEM_DMA_API) {
++              omap_obj->vaddr = dma_alloc_wc(dev->dev, size,
 +                                                       &omap_obj->paddr,
 +                                                       GFP_KERNEL);
 +              if (!omap_obj->vaddr)
 +                      goto err_release;
 +      }
 +
 +      spin_lock(&priv->list_lock);
 +      list_add(&omap_obj->mm_list, &priv->obj_list);
 +      spin_unlock(&priv->list_lock);
 +
        return obj;
  
 -fail:
 -      omap_gem_free_object(obj);
 +err_release:
 +      drm_gem_object_release(obj);
 +err_free:
 +      kfree(omap_obj);
        return NULL;
  }
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc fs/ocfs2/aops.c
index 043110e5212dd8c6ab2e7118ac8f17746448dac0,3d3952ebe1013d893f44b365c0d7439cdbe6a00f..56ce3704d66fbde73b27224eaa8716b0191acccf
@@@ -2477,6 -2099,356 +2099,361 @@@ static int ocfs2_write_end(struct file 
        return ret;
  }
  
 -static void ocfs2_dio_end_io(struct kiocb *iocb,
 -                           loff_t offset,
 -                           ssize_t bytes,
 -                           void *private)
+ struct ocfs2_dio_write_ctxt {
+       struct list_head        dw_zero_list;
+       unsigned                dw_zero_count;
+       int                     dw_orphaned;
+       pid_t                   dw_writer_pid;
+ };
+ static struct ocfs2_dio_write_ctxt *
+ ocfs2_dio_alloc_write_ctx(struct buffer_head *bh, int *alloc)
+ {
+       struct ocfs2_dio_write_ctxt *dwc = NULL;
+       if (bh->b_private)
+               return bh->b_private;
+       dwc = kmalloc(sizeof(struct ocfs2_dio_write_ctxt), GFP_NOFS);
+       if (dwc == NULL)
+               return NULL;
+       INIT_LIST_HEAD(&dwc->dw_zero_list);
+       dwc->dw_zero_count = 0;
+       dwc->dw_orphaned = 0;
+       dwc->dw_writer_pid = task_pid_nr(current);
+       bh->b_private = dwc;
+       *alloc = 1;
+       return dwc;
+ }
+ static void ocfs2_dio_free_write_ctx(struct inode *inode,
+                                    struct ocfs2_dio_write_ctxt *dwc)
+ {
+       ocfs2_free_unwritten_list(inode, &dwc->dw_zero_list);
+       kfree(dwc);
+ }
+ /*
+  * TODO: Make this into a generic get_blocks function.
+  *
+  * From do_direct_io in direct-io.c:
+  *  "So what we do is to permit the ->get_blocks function to populate
+  *   bh.b_size with the size of IO which is permitted at this offset and
+  *   this i_blkbits."
+  *
+  * This function is called directly from get_more_blocks in direct-io.c.
+  *
+  * called like this: dio->get_blocks(dio->inode, fs_startblk,
+  *                                    fs_count, map_bh, dio->rw == WRITE);
+  */
+ static int ocfs2_dio_get_block(struct inode *inode, sector_t iblock,
+                              struct buffer_head *bh_result, int create)
+ {
+       struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+       struct ocfs2_inode_info *oi = OCFS2_I(inode);
+       struct ocfs2_write_ctxt *wc;
+       struct ocfs2_write_cluster_desc *desc = NULL;
+       struct ocfs2_dio_write_ctxt *dwc = NULL;
+       struct buffer_head *di_bh = NULL;
+       u64 p_blkno;
+       loff_t pos = iblock << inode->i_sb->s_blocksize_bits;
+       unsigned len, total_len = bh_result->b_size;
+       int ret = 0, first_get_block = 0;
+       len = osb->s_clustersize - (pos & (osb->s_clustersize - 1));
+       len = min(total_len, len);
+       mlog(0, "get block of %lu at %llu:%u req %u\n",
+                       inode->i_ino, pos, len, total_len);
+       /*
+        * Because we need to change file size in ocfs2_dio_end_io_write(), or
+        * we may need to add it to orphan dir. So can not fall to fast path
+        * while file size will be changed.
+        */
+       if (pos + total_len <= i_size_read(inode)) {
+               down_read(&oi->ip_alloc_sem);
+               /* This is the fast path for re-write. */
+               ret = ocfs2_get_block(inode, iblock, bh_result, create);
+               up_read(&oi->ip_alloc_sem);
+               if (buffer_mapped(bh_result) &&
+                   !buffer_new(bh_result) &&
+                   ret == 0)
+                       goto out;
+               /* Clear state set by ocfs2_get_block. */
+               bh_result->b_state = 0;
+       }
+       dwc = ocfs2_dio_alloc_write_ctx(bh_result, &first_get_block);
+       if (unlikely(dwc == NULL)) {
+               ret = -ENOMEM;
+               mlog_errno(ret);
+               goto out;
+       }
+       if (ocfs2_clusters_for_bytes(inode->i_sb, pos + total_len) >
+           ocfs2_clusters_for_bytes(inode->i_sb, i_size_read(inode)) &&
+           !dwc->dw_orphaned) {
+               /*
+                * when we are going to alloc extents beyond file size, add the
+                * inode to orphan dir, so we can recall those spaces when
+                * system crashed during write.
+                */
+               ret = ocfs2_add_inode_to_orphan(osb, inode);
+               if (ret < 0) {
+                       mlog_errno(ret);
+                       goto out;
+               }
+               dwc->dw_orphaned = 1;
+       }
+       ret = ocfs2_inode_lock(inode, &di_bh, 1);
+       if (ret) {
+               mlog_errno(ret);
+               goto out;
+       }
+       down_write(&oi->ip_alloc_sem);
+       if (first_get_block) {
+               if (ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb)))
+                       ret = ocfs2_zero_tail(inode, di_bh, pos);
+               else
+                       ret = ocfs2_expand_nonsparse_inode(inode, di_bh, pos,
+                                                          total_len, NULL);
+               if (ret < 0) {
+                       mlog_errno(ret);
+                       goto unlock;
+               }
+       }
+       ret = ocfs2_write_begin_nolock(inode->i_mapping, pos, len,
+                                      OCFS2_WRITE_DIRECT, NULL,
+                                      (void **)&wc, di_bh, NULL);
+       if (ret) {
+               mlog_errno(ret);
+               goto unlock;
+       }
+       desc = &wc->w_desc[0];
+       p_blkno = ocfs2_clusters_to_blocks(inode->i_sb, desc->c_phys);
+       BUG_ON(p_blkno == 0);
+       p_blkno += iblock & (u64)(ocfs2_clusters_to_blocks(inode->i_sb, 1) - 1);
+       map_bh(bh_result, inode->i_sb, p_blkno);
+       bh_result->b_size = len;
+       if (desc->c_needs_zero)
+               set_buffer_new(bh_result);
+       /* May sleep in end_io. It should not happen in a irq context. So defer
+        * it to dio work queue. */
+       set_buffer_defer_completion(bh_result);
+       if (!list_empty(&wc->w_unwritten_list)) {
+               struct ocfs2_unwritten_extent *ue = NULL;
+               ue = list_first_entry(&wc->w_unwritten_list,
+                                     struct ocfs2_unwritten_extent,
+                                     ue_node);
+               BUG_ON(ue->ue_cpos != desc->c_cpos);
+               /* The physical address may be 0, fill it. */
+               ue->ue_phys = desc->c_phys;
+               list_splice_tail_init(&wc->w_unwritten_list, &dwc->dw_zero_list);
+               dwc->dw_zero_count++;
+       }
+       ret = ocfs2_write_end_nolock(inode->i_mapping, pos, len, len, NULL, wc);
+       BUG_ON(ret != len);
+       ret = 0;
+ unlock:
+       up_write(&oi->ip_alloc_sem);
+       ocfs2_inode_unlock(inode, 1);
+       brelse(di_bh);
+ out:
+       if (ret < 0)
+               ret = -EIO;
+       return ret;
+ }
+ static void ocfs2_dio_end_io_write(struct inode *inode,
+                                  struct ocfs2_dio_write_ctxt *dwc,
+                                  loff_t offset,
+                                  ssize_t bytes)
+ {
+       struct ocfs2_cached_dealloc_ctxt dealloc;
+       struct ocfs2_extent_tree et;
+       struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+       struct ocfs2_inode_info *oi = OCFS2_I(inode);
+       struct ocfs2_unwritten_extent *ue = NULL;
+       struct buffer_head *di_bh = NULL;
+       struct ocfs2_dinode *di;
+       struct ocfs2_alloc_context *data_ac = NULL;
+       struct ocfs2_alloc_context *meta_ac = NULL;
+       handle_t *handle = NULL;
+       loff_t end = offset + bytes;
+       int ret = 0, credits = 0, locked = 0;
+       ocfs2_init_dealloc_ctxt(&dealloc);
+       /* We do clear unwritten, delete orphan, change i_size here. If neither
+        * of these happen, we can skip all this. */
+       if (list_empty(&dwc->dw_zero_list) &&
+           end <= i_size_read(inode) &&
+           !dwc->dw_orphaned)
+               goto out;
+       /* ocfs2_file_write_iter will get i_mutex, so we need not lock if we
+        * are in that context. */
+       if (dwc->dw_writer_pid != task_pid_nr(current)) {
+               mutex_lock(&inode->i_mutex);
+               locked = 1;
+       }
+       ret = ocfs2_inode_lock(inode, &di_bh, 1);
+       if (ret < 0) {
+               mlog_errno(ret);
+               goto out;
+       }
+       down_write(&oi->ip_alloc_sem);
+       /* Delete orphan before acquire i_mutex. */
+       if (dwc->dw_orphaned) {
+               BUG_ON(dwc->dw_writer_pid != task_pid_nr(current));
+               end = end > i_size_read(inode) ? end : 0;
+               ret = ocfs2_del_inode_from_orphan(osb, inode, di_bh,
+                               !!end, end);
+               if (ret < 0)
+                       mlog_errno(ret);
+       }
+       di = (struct ocfs2_dinode *)di_bh;
+       ocfs2_init_dinode_extent_tree(&et, INODE_CACHE(inode), di_bh);
+       ret = ocfs2_lock_allocators(inode, &et, 0, dwc->dw_zero_count*2,
+                                   &data_ac, &meta_ac);
+       if (ret) {
+               mlog_errno(ret);
+               goto unlock;
+       }
+       credits = ocfs2_calc_extend_credits(inode->i_sb, &di->id2.i_list);
+       handle = ocfs2_start_trans(osb, credits);
+       if (IS_ERR(handle)) {
+               ret = PTR_ERR(handle);
+               mlog_errno(ret);
+               goto unlock;
+       }
+       ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode), di_bh,
+                                     OCFS2_JOURNAL_ACCESS_WRITE);
+       if (ret) {
+               mlog_errno(ret);
+               goto commit;
+       }
+       list_for_each_entry(ue, &dwc->dw_zero_list, ue_node) {
+               ret = ocfs2_mark_extent_written(inode, &et, handle,
+                                               ue->ue_cpos, 1,
+                                               ue->ue_phys,
+                                               meta_ac, &dealloc);
+               if (ret < 0) {
+                       mlog_errno(ret);
+                       break;
+               }
+       }
+       if (end > i_size_read(inode)) {
+               ret = ocfs2_set_inode_size(handle, inode, di_bh, end);
+               if (ret < 0)
+                       mlog_errno(ret);
+       }
+ commit:
+       ocfs2_commit_trans(osb, handle);
+ unlock:
+       up_write(&oi->ip_alloc_sem);
+       ocfs2_inode_unlock(inode, 1);
+       brelse(di_bh);
+ out:
+       if (data_ac)
+               ocfs2_free_alloc_context(data_ac);
+       if (meta_ac)
+               ocfs2_free_alloc_context(meta_ac);
+       ocfs2_run_deallocs(osb, &dealloc);
+       if (locked)
+               mutex_unlock(&inode->i_mutex);
+       ocfs2_dio_free_write_ctx(inode, dwc);
+ }
+ /*
+  * ocfs2_dio_end_io is called by the dio core when a dio is finished.  We're
+  * particularly interested in the aio/dio case.  We use the rw_lock DLM lock
+  * to protect io on one node from truncation on another.
+  */
++static int ocfs2_dio_end_io(struct kiocb *iocb,
++                          loff_t offset,
++                          ssize_t bytes,
++                          void *private)
+ {
+       struct inode *inode = file_inode(iocb->ki_filp);
+       int level;
++      if (bytes <= 0)
++              return 0;
++
+       /* this io's submitter should not have unlocked this before we could */
+       BUG_ON(!ocfs2_iocb_is_rw_locked(iocb));
+       if (private)
+               ocfs2_dio_end_io_write(inode, private, offset, bytes);
+       ocfs2_iocb_clear_rw_locked(iocb);
+       level = ocfs2_iocb_rw_locked_level(iocb);
+       ocfs2_rw_unlock(inode, level);
++
++      return 0;
+ }
+ static ssize_t ocfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
+                              loff_t offset)
+ {
+       struct file *file = iocb->ki_filp;
+       struct inode *inode = file_inode(file)->i_mapping->host;
+       struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+       loff_t end = offset + iter->count;
+       get_block_t *get_block;
+       /*
+        * Fallback to buffered I/O if we see an inode without
+        * extents.
+        */
+       if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
+               return 0;
+       /* Fallback to buffered I/O if we do not support append dio. */
+       if (end > i_size_read(inode) && !ocfs2_supports_append_dio(osb))
+               return 0;
+       if (iov_iter_rw(iter) == READ)
+               get_block = ocfs2_get_block;
+       else
+               get_block = ocfs2_dio_get_block;
+       return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev,
+                                   iter, offset, get_block,
+                                   ocfs2_dio_end_io, NULL, 0);
+ }
  const struct address_space_operations ocfs2_aops = {
        .readpage               = ocfs2_readpage,
        .readpages              = ocfs2_readpages,
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc init/Kconfig
Simple merge
diff --cc init/main.c
Simple merge
diff --cc kernel/Makefile
Simple merge
Simple merge
diff --cc kernel/fork.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc kernel/signal.c
Simple merge
diff --cc kernel/sysctl.c
Simple merge
Simple merge
diff --cc lib/Makefile
Simple merge
diff --cc mm/Kconfig
index 2702bb6c21df3754632357f3252dbf7d5c56ffd5,f2c1a07c44d825e2cc6d71683340d5dee194a61b..0cc0525889e1f8d3f586e4bc50ebbf398aac9df5
@@@ -667,10 -664,10 +664,15 @@@ config ZONE_DEVIC
  
          If FS_DAX is enabled, then say Y.
  
+ config NR_ZONES_EXTENDED
+       bool
+       default n if !64BIT
+       default y if ZONE_DEVICE && ZONE_DMA && ZONE_DMA32
  config FRAME_VECTOR
        bool
 +
 +config ARCH_USES_HIGH_VMA_FLAGS
 +      bool
 +config ARCH_HAS_PKEYS
 +      bool
diff --cc mm/filemap.c
Simple merge
index 43b11a6951132a9783c6d59510c66a2b2a75339c,5b38aa24566f19086439a1e168bed6bd053bd22e..7f75292bf284ffd4e957f8cd45ec03f9e4635a7d
@@@ -98,7 -100,8 +100,8 @@@ static DECLARE_WAIT_QUEUE_HEAD(khugepag
   * it would have happened if the vma was large enough during page
   * fault.
   */
 -static unsigned int khugepaged_max_ptes_none __read_mostly = HPAGE_PMD_NR-1;
 -static unsigned int khugepaged_max_ptes_swap __read_mostly = HPAGE_PMD_NR/8;
 +static unsigned int khugepaged_max_ptes_none __read_mostly;
++static unsigned int khugepaged_max_ptes_swap __read_mostly;
  
  static int khugepaged(void *none);
  static int khugepaged_slab_init(void);
@@@ -660,18 -691,6 +691,19 @@@ static int __init hugepage_init(void
                return -EINVAL;
        }
  
 +      khugepaged_pages_to_scan = HPAGE_PMD_NR * 8;
 +      khugepaged_max_ptes_none = HPAGE_PMD_NR - 1;
++      khugepaged_max_ptes_swap = HPAGE_PMD_NR / 8;
 +      /*
 +       * hugepages can't be allocated by the buddy allocator
 +       */
 +      MAYBE_BUILD_BUG_ON(HPAGE_PMD_ORDER >= MAX_ORDER);
 +      /*
 +       * we use page->mapping and page->index in second tail page
 +       * as list_head: assuming THP order >= 2
 +       */
 +      MAYBE_BUILD_BUG_ON(HPAGE_PMD_ORDER < 2);
 +
        err = hugepage_init_sysfs(&hugepage_kobj);
        if (err)
                goto err_sysfs;
diff --cc mm/ksm.c
Simple merge
diff --cc mm/memory.c
Simple merge
Simple merge
diff --cc mm/mempolicy.c
Simple merge
diff --cc mm/mmap.c
Simple merge
diff --cc mm/mprotect.c
index fa37c4cd973aa49b4deb227646fcdb2779f7cb24,6ff5dfa65b33d8453f097c80bd21f352127ed185..bf44caea638bbc16264808fd71a2562351797dd1
@@@ -414,7 -409,11 +411,11 @@@ SYSCALL_DEFINE3(mprotect, unsigned long
  
                /* Here we know that vma->vm_start <= nstart < vma->vm_end. */
  
 -              newflags = calc_vm_prot_bits(prot);
+               /* Does the application expect PROT_READ to imply PROT_EXEC */
+               if (rier && (vma->vm_flags & VM_MAYEXEC))
+                       prot |= PROT_EXEC;
 +              newflags = calc_vm_prot_bits(prot, pkey);
                newflags |= (vma->vm_flags & ~(VM_READ | VM_WRITE | VM_EXEC));
  
                /* newflags >> 4 shift VM_MAY% in place of VM_% */
diff --cc mm/nommu.c
Simple merge
diff --cc mm/util.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge