Merge branch 'iommu/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/joro...
Ingo Molnar [Mon, 28 Dec 2009 08:23:13 +0000 (09:23 +0100)]
1  2 
Makefile
arch/x86/kernel/apic/io_apic.c
arch/x86/lib/Makefile
include/linux/mm.h
mm/page_alloc.c

diff --combined Makefile
+++ b/Makefile
@@@ -1,7 -1,7 +1,7 @@@
  VERSION = 2
  PATCHLEVEL = 6
- SUBLEVEL = 32
- EXTRAVERSION =
+ SUBLEVEL = 33
+ EXTRAVERSION = -rc1
  NAME = Man-Eating Seals of Antiquity
  
  # *DOCUMENTATION*
  # o  print "Entering directory ...";
  MAKEFLAGS += -rR --no-print-directory
  
 +# Avoid funny character set dependencies
 +unexport LC_ALL
 +LC_CTYPE=C
 +LC_COLLATE=C
 +LC_NUMERIC=C
 +export LC_CTYPE LC_COLLATE LC_NUMERIC
 +
  # We are using a recursive build, so we need to do a little thinking
  # to get the ordering right.
  #
@@@ -341,10 -334,9 +341,9 @@@ CFLAGS_GCOV       = -fprofile-arcs -ftest-cov
  
  # Use LINUXINCLUDE when you must reference the include/ directory.
  # Needed to be compatible with the O= option
- LINUXINCLUDE    := -Iinclude \
-                    $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
-                    -I$(srctree)/arch/$(hdr-arch)/include               \
-                    -include include/linux/autoconf.h
+ LINUXINCLUDE    := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
+                    $(if $(KBUILD_SRC), -I$(srctree)/include) \
+                    -include include/generated/autoconf.h
  
  KBUILD_CPPFLAGS := -D__KERNEL__
  
@@@ -472,7 -464,7 +471,7 @@@ ifeq ($(KBUILD_EXTMOD),
  # Carefully list dependencies so we do not try to build scripts twice
  # in parallel
  PHONY += scripts
- scripts: scripts_basic include/config/auto.conf
+ scripts: scripts_basic include/config/auto.conf include/config/tristate.conf
        $(Q)$(MAKE) $(build)=$(@)
  
  # Objects we will link into vmlinux / subdirs we need to visit
@@@ -499,18 -491,18 +498,18 @@@ $(KCONFIG_CONFIG) include/config/auto.c
  # with it and forgot to run make oldconfig.
  # if auto.conf.cmd is missing then we are probably in a cleaned tree so
  # we execute the config step to be sure to catch updated Kconfig files
- include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
+ include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
        $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
  else
- # external modules needs include/linux/autoconf.h and include/config/auto.conf
+ # external modules needs include/generated/autoconf.h and include/config/auto.conf
  # but do not care if they are up-to-date. Use auto.conf to trigger the test
  PHONY += include/config/auto.conf
  
  include/config/auto.conf:
-       $(Q)test -e include/linux/autoconf.h -a -e $@ || (              \
+       $(Q)test -e include/generated/autoconf.h -a -e $@ || (          \
        echo;                                                           \
        echo "  ERROR: Kernel configuration is invalid.";               \
-       echo "         include/linux/autoconf.h or $@ are missing.";    \
+       echo "         include/generated/autoconf.h or $@ are missing.";\
        echo "         Run 'make oldconfig && make prepare' on kernel src to fix it.";  \
        echo;                                                           \
        /bin/false)
@@@ -884,6 -876,9 +883,9 @@@ $(sort $(vmlinux-init) $(vmlinux-main)
  PHONY += $(vmlinux-dirs)
  $(vmlinux-dirs): prepare scripts
        $(Q)$(MAKE) $(build)=$@
+ ifdef CONFIG_MODULES
+       $(Q)$(MAKE) $(modbuiltin)=$@
+ endif
  
  # Build the kernel release string
  #
@@@ -962,7 -957,6 +964,6 @@@ PHONY += prepare archprepare prepare0 p
  # prepare3 is used to check if we are building in a separate output directory,
  # and if so do:
  # 1) Check that make has not been executed in the kernel src $(srctree)
- # 2) Create the include2 directory, used for the second asm symlink
  prepare3: include/config/kernel.release
  ifneq ($(KBUILD_SRC),)
        @$(kecho) '  Using $(srctree) as source for kernel'
                echo "  in the '$(srctree)' directory.";\
                /bin/false; \
        fi;
-       $(Q)if [ ! -d include2 ]; then                                  \
-           mkdir -p include2;                                          \
-           ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm;     \
-       fi
  endif
  
  # prepare2 creates a makefile if using a separate output directory
  prepare2: prepare3 outputmakefile
  
- prepare1: prepare2 include/linux/version.h include/linux/utsrelease.h \
-                    include/asm include/config/auto.conf
+ prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
+                    include/config/auto.conf
        $(cmd_crmodverdir)
  
  archprepare: prepare1 scripts_basic
@@@ -993,42 -983,6 +990,6 @@@ prepare0: archprepare FORC
  # All the preparing..
  prepare: prepare0
  
- # The asm symlink changes when $(ARCH) changes.
- # Detect this and ask user to run make mrproper
- # If asm is a stale symlink (point to dir that does not exist) remove it
- define check-symlink
-       set -e;                                                            \
-       if [ -L include/asm ]; then                                        \
-               asmlink=`readlink include/asm | cut -d '-' -f 2`;          \
-               if [ "$$asmlink" != "$(SRCARCH)" ]; then                   \
-                       echo "ERROR: the symlink $@ points to asm-$$asmlink but asm-$(SRCARCH) was expected"; \
-                       echo "       set ARCH or save .config and run 'make mrproper' to fix it";             \
-                       exit 1;                                            \
-               fi;                                                        \
-               test -e $$asmlink || rm include/asm;                       \
-       elif [ -d include/asm ]; then                                      \
-               echo "ERROR: $@ is a directory but a symlink was expected";\
-               exit 1;                                                    \
-       fi
- endef
- # We create the target directory of the symlink if it does
- # not exist so the test in check-symlink works and we have a
- # directory for generated filesas used by some architectures.
- define create-symlink
-       if [ ! -L include/asm ]; then                                      \
-                       $(kecho) '  SYMLINK $@ -> include/asm-$(SRCARCH)'; \
-                       if [ ! -d include/asm-$(SRCARCH) ]; then           \
-                               mkdir -p include/asm-$(SRCARCH);           \
-                       fi;                                                \
-                       ln -fsn asm-$(SRCARCH) $@;                         \
-       fi
- endef
- include/asm: FORCE
-       $(Q)$(check-symlink)
-       $(Q)$(create-symlink)
  # Generate some files
  # ---------------------------------------------------------------------------
  
@@@ -1053,7 -1007,7 +1014,7 @@@ ende
  include/linux/version.h: $(srctree)/Makefile FORCE
        $(call filechk,version.h)
  
- include/linux/utsrelease.h: include/config/kernel.release FORCE
+ include/generated/utsrelease.h: include/config/kernel.release FORCE
        $(call filechk,utsrelease.h)
  
  PHONY += headerdep
@@@ -1083,11 -1037,6 +1044,6 @@@ firmware_install: FORC
  export INSTALL_HDR_PATH = $(objtree)/usr
  
  hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
- # Find out where the Kbuild file is located to support
- # arch/$(ARCH)/include/asm
- hdr-dir = $(strip                                                         \
-           $(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/asm/Kbuild), \
-                arch/$(hdr-arch)/include/asm, include/asm-$(hdr-arch)))
  
  # If we do an all arch process set dst to asm-$(hdr-arch)
  hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)
@@@ -1102,10 -1051,10 +1058,10 @@@ headers_install_all
  
  PHONY += headers_install
  headers_install: __headers
-       $(if $(wildcard $(srctree)/$(hdr-dir)/Kbuild),, \
+       $(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/asm/Kbuild),, \
        $(error Headers not exportable for the $(SRCARCH) architecture))
        $(Q)$(MAKE) $(hdr-inst)=include
-       $(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst)
+       $(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst)
  
  PHONY += headers_check_all
  headers_check_all: headers_install_all
  PHONY += headers_check
  headers_check: headers_install
        $(Q)$(MAKE) $(hdr-inst)=include HDRCHECK=1
-       $(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst) HDRCHECK=1
+       $(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst) HDRCHECK=1
  
  # ---------------------------------------------------------------------------
  # Modules
@@@ -1134,6 -1083,7 +1090,7 @@@ all: module
  PHONY += modules
  modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
        $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
+       $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin
        @$(kecho) '  Building modules, stage 2.';
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
@@@ -1163,6 -1113,7 +1120,7 @@@ _modinst_
                ln -s $(objtree) $(MODLIB)/build ; \
        fi
        @cp -f $(objtree)/modules.order $(MODLIB)/
+       @cp -f $(objtree)/modules.builtin $(MODLIB)/
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
  
  # This depmod is only for convenience to give the initial
@@@ -1201,12 -1152,10 +1159,10 @@@ CLEAN_FILES +=       vmlinux System.map 
                  .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
  
  # Directories & files removed with 'make mrproper'
- MRPROPER_DIRS  += include/config include2 usr/include include/generated
- MRPROPER_FILES += .config .config.old include/asm .version .old_version \
-                   include/linux/autoconf.h include/linux/version.h      \
-                   include/linux/utsrelease.h                            \
-                   include/linux/bounds.h include/asm*/asm-offsets.h     \
-                 Module.symvers Module.markers tags TAGS cscope*
+ MRPROPER_DIRS  += include/config usr/include include/generated
+ MRPROPER_FILES += .config .config.old .version .old_version             \
+                   include/linux/version.h                               \
+                 Module.symvers tags TAGS cscope*
  
  # clean - Delete most, but leave enough to build external modules
  #
@@@ -1225,7 -1174,7 +1181,7 @@@ clean: archclean $(clean-dirs
                \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
                -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
                -o -name '*.symtypes' -o -name 'modules.order' \
-               -o -name 'Module.markers' -o -name '.tmp_*.o.*' \
+               -o -name modules.builtin -o -name '.tmp_*.o.*' \
                -o -name '*.gcno' \) -type f -print | xargs rm -f
  
  # mrproper - Delete all generated files, including .config
@@@ -1423,8 -1372,8 +1379,8 @@@ $(clean-dirs)
  
  clean:        rm-dirs := $(MODVERDIR)
  clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \
-                    $(KBUILD_EXTMOD)/Module.markers \
-                    $(KBUILD_EXTMOD)/modules.order
+                    $(KBUILD_EXTMOD)/modules.order \
+                    $(KBUILD_EXTMOD)/modules.builtin
  clean: $(clean-dirs)
        $(call cmd,rmdirs)
        $(call cmd,rmfiles)
@@@ -2276,28 -2276,26 +2276,28 @@@ static void __target_IO_APIC_irq(unsign
  
  /*
   * Either sets desc->affinity to a valid value, and returns
 - * ->cpu_mask_to_apicid of that, or returns BAD_APICID and
 + * ->cpu_mask_to_apicid of that in dest_id, or returns -1 and
   * leaves desc->affinity untouched.
   */
  unsigned int
 -set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask)
 +set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask,
 +                unsigned int *dest_id)
  {
        struct irq_cfg *cfg;
        unsigned int irq;
  
        if (!cpumask_intersects(mask, cpu_online_mask))
 -              return BAD_APICID;
 +              return -1;
  
        irq = desc->irq;
        cfg = desc->chip_data;
        if (assign_irq_vector(irq, cfg, mask))
 -              return BAD_APICID;
 +              return -1;
  
        cpumask_copy(desc->affinity, mask);
  
 -      return apic->cpu_mask_to_apicid_and(desc->affinity, cfg->domain);
 +      *dest_id = apic->cpu_mask_to_apicid_and(desc->affinity, cfg->domain);
 +      return 0;
  }
  
  static int
@@@ -2313,11 -2311,12 +2313,11 @@@ set_ioapic_affinity_irq_desc(struct irq
        cfg = desc->chip_data;
  
        spin_lock_irqsave(&ioapic_lock, flags);
 -      dest = set_desc_affinity(desc, mask);
 -      if (dest != BAD_APICID) {
 +      ret = set_desc_affinity(desc, mask, &dest);
 +      if (!ret) {
                /* Only the high 8 bits are valid. */
                dest = SET_APIC_LOGICAL_ID(dest);
                __target_IO_APIC_irq(irq, dest, cfg);
 -              ret = 0;
        }
        spin_unlock_irqrestore(&ioapic_lock, flags);
  
@@@ -2432,7 -2431,7 +2432,7 @@@ asmlinkage void smp_irq_move_cleanup_in
                        continue;
  
                cfg = irq_cfg(irq);
-               spin_lock(&desc->lock);
+               raw_spin_lock(&desc->lock);
  
                if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain))
                        goto unlock;
                }
                __get_cpu_var(vector_irq)[vector] = -1;
  unlock:
-               spin_unlock(&desc->lock);
+               raw_spin_unlock(&desc->lock);
        }
  
        irq_exit();
@@@ -3352,7 -3351,8 +3352,7 @@@ static int set_msi_irq_affinity(unsigne
        struct msi_msg msg;
        unsigned int dest;
  
 -      dest = set_desc_affinity(desc, mask);
 -      if (dest == BAD_APICID)
 +      if (set_desc_affinity(desc, mask, &dest))
                return -1;
  
        cfg = desc->chip_data;
@@@ -3384,7 -3384,8 +3384,7 @@@ ir_set_msi_irq_affinity(unsigned int ir
        if (get_irte(irq, &irte))
                return -1;
  
 -      dest = set_desc_affinity(desc, mask);
 -      if (dest == BAD_APICID)
 +      if (set_desc_affinity(desc, mask, &dest))
                return -1;
  
        irte.vector = cfg->vector;
@@@ -3566,7 -3567,8 +3566,7 @@@ static int dmar_msi_set_affinity(unsign
        struct msi_msg msg;
        unsigned int dest;
  
 -      dest = set_desc_affinity(desc, mask);
 -      if (dest == BAD_APICID)
 +      if (set_desc_affinity(desc, mask, &dest))
                return -1;
  
        cfg = desc->chip_data;
@@@ -3621,7 -3623,8 +3621,7 @@@ static int hpet_msi_set_affinity(unsign
        struct msi_msg msg;
        unsigned int dest;
  
 -      dest = set_desc_affinity(desc, mask);
 -      if (dest == BAD_APICID)
 +      if (set_desc_affinity(desc, mask, &dest))
                return -1;
  
        cfg = desc->chip_data;
@@@ -3727,7 -3730,8 +3727,7 @@@ static int set_ht_irq_affinity(unsigne
        struct irq_cfg *cfg;
        unsigned int dest;
  
 -      dest = set_desc_affinity(desc, mask);
 -      if (dest == BAD_APICID)
 +      if (set_desc_affinity(desc, mask, &dest))
                return -1;
  
        cfg = desc->chip_data;
diff --combined arch/x86/lib/Makefile
@@@ -5,7 -5,7 +5,7 @@@
  inat_tables_script = $(srctree)/arch/x86/tools/gen-insn-attr-x86.awk
  inat_tables_maps = $(srctree)/arch/x86/lib/x86-opcode-map.txt
  quiet_cmd_inat_tables = GEN     $@
-       cmd_inat_tables = $(AWK) -f $(inat_tables_script) $(inat_tables_maps) > $@
+       cmd_inat_tables = $(AWK) -f $(inat_tables_script) $(inat_tables_maps) > $@ || rm -f $@
  
  $(obj)/inat-tables.c: $(inat_tables_script) $(inat_tables_maps)
        $(call cmd,inat_tables)
@@@ -14,15 -14,15 +14,15 @@@ $(obj)/inat.o: $(obj)/inat-tables.
  
  clean-files := inat-tables.c
  
 -obj-$(CONFIG_SMP) := msr.o
 +obj-$(CONFIG_SMP) += msr-smp.o
  
  lib-y := delay.o
  lib-y += thunk_$(BITS).o
  lib-y += usercopy_$(BITS).o getuser.o putuser.o
  lib-y += memcpy_$(BITS).o
- lib-y += insn.o inat.o
+ lib-$(CONFIG_KPROBES) += insn.o inat.o
  
 -obj-y += msr-reg.o msr-reg-export.o
 +obj-y += msr.o msr-reg.o msr-reg-export.o
  
  ifeq ($(CONFIG_X86_32),y)
          obj-y += atomic64_32.o
diff --combined include/linux/mm.h
@@@ -620,13 -620,22 +620,22 @@@ void page_address_init(void)
  /*
   * On an anonymous page mapped into a user virtual memory area,
   * page->mapping points to its anon_vma, not to a struct address_space;
-  * with the PAGE_MAPPING_ANON bit set to distinguish it.
+  * with the PAGE_MAPPING_ANON bit set to distinguish it.  See rmap.h.
+  *
+  * On an anonymous page in a VM_MERGEABLE area, if CONFIG_KSM is enabled,
+  * the PAGE_MAPPING_KSM bit may be set along with the PAGE_MAPPING_ANON bit;
+  * and then page->mapping points, not to an anon_vma, but to a private
+  * structure which KSM associates with that merged page.  See ksm.h.
+  *
+  * PAGE_MAPPING_KSM without PAGE_MAPPING_ANON is currently never used.
   *
   * Please note that, confusingly, "page_mapping" refers to the inode
   * address_space which maps the page from disk; whereas "page_mapped"
   * refers to user virtual address space into which the page is mapped.
   */
  #define PAGE_MAPPING_ANON     1
+ #define PAGE_MAPPING_KSM      2
+ #define PAGE_MAPPING_FLAGS    (PAGE_MAPPING_ANON | PAGE_MAPPING_KSM)
  
  extern struct address_space swapper_space;
  static inline struct address_space *page_mapping(struct page *page)
        struct address_space *mapping = page->mapping;
  
        VM_BUG_ON(PageSlab(page));
- #ifdef CONFIG_SWAP
        if (unlikely(PageSwapCache(page)))
                mapping = &swapper_space;
-       else
- #endif
-       if (unlikely((unsigned long)mapping & PAGE_MAPPING_ANON))
+       else if (unlikely((unsigned long)mapping & PAGE_MAPPING_ANON))
                mapping = NULL;
        return mapping;
  }
  
+ /* Neutral page->mapping pointer to address_space or anon_vma or other */
+ static inline void *page_rmapping(struct page *page)
+ {
+       return (void *)((unsigned long)page->mapping & ~PAGE_MAPPING_FLAGS);
+ }
  static inline int PageAnon(struct page *page)
  {
        return ((unsigned long)page->mapping & PAGE_MAPPING_ANON) != 0;
@@@ -758,6 -770,7 +770,7 @@@ unsigned long unmap_vmas(struct mmu_gat
   * @pmd_entry: if set, called for each non-empty PMD (3rd-level) entry
   * @pte_entry: if set, called for each non-empty PTE (4th-level) entry
   * @pte_hole: if set, called for each hole at all levels
+  * @hugetlb_entry: if set, called for each hugetlb entry
   *
   * (see walk_page_range for more details)
   */
@@@ -767,6 -780,8 +780,8 @@@ struct mm_walk 
        int (*pmd_entry)(pmd_t *, unsigned long, unsigned long, struct mm_walk *);
        int (*pte_entry)(pte_t *, unsigned long, unsigned long, struct mm_walk *);
        int (*pte_hole)(unsigned long, unsigned long, struct mm_walk *);
+       int (*hugetlb_entry)(pte_t *, unsigned long, unsigned long,
+                            struct mm_walk *);
        struct mm_struct *mm;
        void *private;
  };
@@@ -1022,9 -1037,6 +1037,9 @@@ extern void add_active_range(unsigned i
  extern void remove_active_range(unsigned int nid, unsigned long start_pfn,
                                        unsigned long end_pfn);
  extern void remove_all_active_ranges(void);
 +void sort_node_map(void);
 +unsigned long __absent_pages_in_range(int nid, unsigned long start_pfn,
 +                                              unsigned long end_pfn);
  extern unsigned long absent_pages_in_range(unsigned long start_pfn,
                                                unsigned long end_pfn);
  extern void get_pfn_range_for_nid(unsigned int nid,
@@@ -1319,11 -1331,17 +1334,17 @@@ extern int account_locked_memory(struc
                                 size_t size);
  extern void refund_locked_memory(struct mm_struct *mm, size_t size);
  
+ enum mf_flags {
+       MF_COUNT_INCREASED = 1 << 0,
+ };
  extern void memory_failure(unsigned long pfn, int trapno);
- extern int __memory_failure(unsigned long pfn, int trapno, int ref);
+ extern int __memory_failure(unsigned long pfn, int trapno, int flags);
+ extern int unpoison_memory(unsigned long pfn);
  extern int sysctl_memory_failure_early_kill;
  extern int sysctl_memory_failure_recovery;
+ extern void shake_page(struct page *p, int access);
  extern atomic_long_t mce_bad_pages;
+ extern int soft_offline_page(struct page *page, int flags);
  
  #endif /* __KERNEL__ */
  #endif /* _LINUX_MM_H */
diff --combined mm/page_alloc.c
@@@ -486,7 -486,6 +486,6 @@@ static inline void __free_one_page(stru
        zone->free_area[order].nr_free++;
  }
  
- #ifdef CONFIG_HAVE_MLOCKED_PAGE_BIT
  /*
   * free_page_mlock() -- clean up attempts to free and mlocked() page.
   * Page should not be on lru, so no need to fix that up.
@@@ -497,9 -496,6 +496,6 @@@ static inline void free_page_mlock(stru
        __dec_zone_page_state(page, NR_MLOCK);
        __count_vm_event(UNEVICTABLE_MLOCKFREED);
  }
- #else
- static void free_page_mlock(struct page *page) { }
- #endif
  
  static inline int free_pages_check(struct page *page)
  {
@@@ -1658,12 -1654,22 +1654,22 @@@ __alloc_pages_may_oom(gfp_t gfp_mask, u
        if (page)
                goto out;
  
-       /* The OOM killer will not help higher order allocs */
-       if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_NOFAIL))
-               goto out;
+       if (!(gfp_mask & __GFP_NOFAIL)) {
+               /* The OOM killer will not help higher order allocs */
+               if (order > PAGE_ALLOC_COSTLY_ORDER)
+                       goto out;
+               /*
+                * GFP_THISNODE contains __GFP_NORETRY and we never hit this.
+                * Sanity check for bare calls of __GFP_THISNODE, not real OOM.
+                * The caller should handle page allocation failure by itself if
+                * it specifies __GFP_THISNODE.
+                * Note: Hugepage uses it but will hit PAGE_ALLOC_COSTLY_ORDER.
+                */
+               if (gfp_mask & __GFP_THISNODE)
+                       goto out;
+       }
        /* Exhausted what can be done so it's blamo time */
-       out_of_memory(zonelist, gfp_mask, order);
+       out_of_memory(zonelist, gfp_mask, order, nodemask);
  
  out:
        clear_zonelist_oom(zonelist, gfp_mask);
@@@ -3127,7 -3133,7 +3133,7 @@@ static int __cpuinit process_zones(int 
  
                if (percpu_pagelist_fraction)
                        setup_pagelist_highmark(zone_pcp(zone, cpu),
-                               (zone->present_pages / percpu_pagelist_fraction));
+                           (zone->present_pages / percpu_pagelist_fraction));
        }
  
        return 0;
@@@ -3573,7 -3579,7 +3579,7 @@@ static unsigned long __meminit zone_spa
   * Return the number of holes in a range on a node. If nid is MAX_NUMNODES,
   * then all holes in the requested range will be accounted for.
   */
 -static unsigned long __meminit __absent_pages_in_range(int nid,
 +unsigned long __meminit __absent_pages_in_range(int nid,
                                unsigned long range_start_pfn,
                                unsigned long range_end_pfn)
  {
@@@ -4102,7 -4108,7 +4108,7 @@@ static int __init cmp_node_active_regio
  }
  
  /* sort the node_map by start_pfn */
 -static void __init sort_node_map(void)
 +void __init sort_node_map(void)
  {
        sort(early_node_map, (size_t)nr_nodemap_entries,
                        sizeof(struct node_active_region),
@@@ -5085,3 -5091,24 +5091,24 @@@ __offline_isolated_pages(unsigned long 
        spin_unlock_irqrestore(&zone->lock, flags);
  }
  #endif
+ #ifdef CONFIG_MEMORY_FAILURE
+ bool is_free_buddy_page(struct page *page)
+ {
+       struct zone *zone = page_zone(page);
+       unsigned long pfn = page_to_pfn(page);
+       unsigned long flags;
+       int order;
+       spin_lock_irqsave(&zone->lock, flags);
+       for (order = 0; order < MAX_ORDER; order++) {
+               struct page *page_head = page - (pfn & ((1 << order) - 1));
+               if (PageBuddy(page_head) && page_order(page_head) >= order)
+                       break;
+       }
+       spin_unlock_irqrestore(&zone->lock, flags);
+       return order < MAX_ORDER;
+ }
+ #endif