Merge commit 'v2.6.38' into x86/mm
Ingo Molnar [Tue, 15 Mar 2011 07:29:44 +0000 (08:29 +0100)]
Conflicts:
arch/x86/mm/numa_64.c

Merge reason: Resolve the conflict, update the branch to .38.

Signed-off-by: Ingo Molnar <mingo@elte.hu>

1  2 
arch/x86/include/asm/acpi.h
arch/x86/include/asm/apic.h
arch/x86/kernel/acpi/boot.c
arch/x86/kernel/apic/apic.c
arch/x86/kernel/smpboot.c
arch/x86/mm/init_64.c
arch/x86/xen/mmu.c
mm/page_alloc.c

@@@ -88,6 -88,7 +88,7 @@@ extern int acpi_disabled
  extern int acpi_pci_disabled;
  extern int acpi_skip_timer_override;
  extern int acpi_use_timer_override;
+ extern int acpi_fix_pin2_polarity;
  
  extern u8 acpi_sci_flags;
  extern int acpi_sci_override_gsi;
@@@ -185,7 -186,15 +186,7 @@@ struct bootnode
  
  #ifdef CONFIG_ACPI_NUMA
  extern int acpi_numa;
 -extern void acpi_get_nodes(struct bootnode *physnodes, unsigned long start,
 -                              unsigned long end);
 -extern int acpi_scan_nodes(unsigned long start, unsigned long end);
 -#define NR_NODE_MEMBLKS (MAX_NUMNODES*2)
 -
 -#ifdef CONFIG_NUMA_EMU
 -extern void acpi_fake_nodes(const struct bootnode *fake_nodes,
 -                                 int num_nodes);
 -#endif
 +extern int x86_acpi_numa_init(void);
  #endif /* CONFIG_ACPI_NUMA */
  
  #define acpi_unlazy_tlb(x)    leave_mm(x)
@@@ -233,6 -233,7 +233,7 @@@ extern void sync_Arb_IDs(void)
  extern void init_bsp_APIC(void);
  extern void setup_local_APIC(void);
  extern void end_local_APIC_setup(void);
+ extern void bsp_end_local_APIC_setup(void);
  extern void init_apic_mappings(void);
  void register_lapic_address(unsigned long address);
  extern void setup_boot_APIC_clock(void);
@@@ -306,6 -307,8 +307,6 @@@ struct apic 
  
        void (*setup_apic_routing)(void);
        int (*multi_timer_check)(int apic, int irq);
 -      int (*apicid_to_node)(int logical_apicid);
 -      int (*cpu_to_logical_apicid)(int cpu);
        int (*cpu_present_to_apicid)(int mps_cpu);
        void (*apicid_to_cpu_present)(int phys_apicid, physid_mask_t *retmap);
        void (*setup_portio_remap)(void);
        void (*icr_write)(u32 low, u32 high);
        void (*wait_icr_idle)(void);
        u32 (*safe_wait_icr_idle)(void);
 +
 +#ifdef CONFIG_X86_32
 +      /*
 +       * Called very early during boot from get_smp_config().  It should
 +       * return the logical apicid.  x86_[bios]_cpu_to_apicid is
 +       * initialized before this function is called.
 +       *
 +       * If logical apicid can't be determined that early, the function
 +       * may return BAD_APICID.  Logical apicid will be configured after
 +       * init_apic_ldr() while bringing up CPUs.  Note that NUMA affinity
 +       * won't be applied properly during early boot in this case.
 +       */
 +      int (*x86_32_early_logical_apicid)(int cpu);
 +
 +      /* determine CPU -> NUMA node mapping */
 +      int (*x86_32_numa_cpu_node)(int cpu);
 +#endif
  };
  
  /*
@@@ -517,11 -503,6 +518,11 @@@ extern struct apic apic_noop
  
  extern struct apic apic_default;
  
 +static inline int noop_x86_32_early_logical_apicid(int cpu)
 +{
 +      return BAD_APICID;
 +}
 +
  /*
   * Set up the logical destination ID.
   *
@@@ -541,7 -522,7 +542,7 @@@ static inline int default_phys_pkg_id(i
        return cpuid_apic >> index_msb;
  }
  
 -extern int default_apicid_to_node(int logical_apicid);
 +extern int default_x86_32_numa_cpu_node(int cpu);
  
  #endif
  
@@@ -577,6 -558,12 +578,6 @@@ static inline void default_ioapic_phys_
        *retmap = *phys_map;
  }
  
 -/* Mapping from cpu number to logical apicid */
 -static inline int default_cpu_to_logical_apicid(int cpu)
 -{
 -      return 1 << cpu;
 -}
 -
  static inline int __default_cpu_present_to_apicid(int mps_cpu)
  {
        if (mps_cpu < nr_cpu_ids && cpu_present(mps_cpu))
@@@ -609,4 -596,8 +610,4 @@@ extern int default_check_phys_apicid_pr
  
  #endif /* CONFIG_X86_LOCAL_APIC */
  
 -#ifdef CONFIG_X86_32
 -extern u8 cpu_2_logical_apicid[NR_CPUS];
 -#endif
 -
  #endif /* _ASM_X86_APIC_H */
@@@ -72,6 -72,7 +72,7 @@@ u8 acpi_sci_flags __initdata
  int acpi_sci_override_gsi __initdata;
  int acpi_skip_timer_override __initdata;
  int acpi_use_timer_override __initdata;
+ int acpi_fix_pin2_polarity __initdata;
  
  #ifdef CONFIG_X86_LOCAL_APIC
  static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
@@@ -415,10 -416,15 +416,15 @@@ acpi_parse_int_src_ovr(struct acpi_subt
                return 0;
        }
  
-       if (acpi_skip_timer_override &&
-           intsrc->source_irq == 0 && intsrc->global_irq == 2) {
-               printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
-               return 0;
+       if (intsrc->source_irq == 0 && intsrc->global_irq == 2) {
+               if (acpi_skip_timer_override) {
+                       printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
+                       return 0;
+               }
+               if (acpi_fix_pin2_polarity && (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) {
+                       intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK;
+                       printk(PREFIX "BIOS IRQ0 pin2 override: forcing polarity to high active.\n");
+               }
        }
  
        mp_override_legacy_irq(intsrc->source_irq,
@@@ -589,8 -595,14 +595,8 @@@ static void acpi_map_cpu2node(acpi_hand
        nid = acpi_get_node(handle);
        if (nid == -1 || !node_online(nid))
                return;
 -#ifdef CONFIG_X86_64
 -      apicid_to_node[physid] = nid;
 +      set_apicid_to_node(physid, nid);
        numa_set_node(cpu, nid);
 -#else /* CONFIG_X86_32 */
 -      apicid_2_node[physid] = nid;
 -      cpu_to_node_map[cpu] = nid;
 -#endif
 -
  #endif
  }
  
@@@ -78,15 -78,6 +78,15 @@@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_
  EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid);
  
  #ifdef CONFIG_X86_32
 +
 +/*
 + * On x86_32, the mapping between cpu and logical apicid may vary
 + * depending on apic in use.  The following early percpu variable is
 + * used for the mapping.  This is where the behaviors of x86_64 and 32
 + * actually diverge.  Let's keep it ugly for now.
 + */
 +DEFINE_EARLY_PER_CPU(int, x86_cpu_to_logical_apicid, BAD_APICID);
 +
  /*
   * Knob to control our willingness to enable the local APIC.
   *
@@@ -1246,19 -1237,6 +1246,19 @@@ void __cpuinit setup_local_APIC(void
         */
        apic->init_apic_ldr();
  
 +#ifdef CONFIG_X86_32
 +      /*
 +       * APIC LDR is initialized.  If logical_apicid mapping was
 +       * initialized during get_smp_config(), make sure it matches the
 +       * actual value.
 +       */
 +      i = early_per_cpu(x86_cpu_to_logical_apicid, cpu);
 +      WARN_ON(i != BAD_APICID && i != logical_smp_processor_id());
 +      /* always use the value from LDR */
 +      early_per_cpu(x86_cpu_to_logical_apicid, cpu) =
 +              logical_smp_processor_id();
 +#endif
 +
        /*
         * Set Task Priority to 'accept all'. We never change this
         * later on.
@@@ -1403,12 -1381,17 +1403,17 @@@ void __cpuinit end_local_APIC_setup(voi
  #endif
  
        apic_pm_activate();
+ }
+ void __init bsp_end_local_APIC_setup(void)
+ {
+       end_local_APIC_setup();
  
        /*
         * Now that local APIC setup is completed for BP, configure the fault
         * handling for interrupt remapping.
         */
-       if (!smp_processor_id() && intr_remapping_enabled)
+       if (intr_remapping_enabled)
                enable_drhd_fault_handling();
  
  }
@@@ -1778,7 -1761,7 +1783,7 @@@ int __init APIC_init_uniprocessor(void
                enable_IO_APIC();
  #endif
  
-       end_local_APIC_setup();
+       bsp_end_local_APIC_setup();
  
  #ifdef CONFIG_X86_IO_APIC
        if (smp_found_config && !skip_ioapic_setup && nr_ioapics)
@@@ -1994,10 -1977,7 +1999,10 @@@ void __cpuinit generic_processor_info(i
        early_per_cpu(x86_cpu_to_apicid, cpu) = apicid;
        early_per_cpu(x86_bios_cpu_apicid, cpu) = apicid;
  #endif
 -
 +#ifdef CONFIG_X86_32
 +      early_per_cpu(x86_cpu_to_logical_apicid, cpu) =
 +              apic->x86_32_early_logical_apicid(cpu);
 +#endif
        set_cpu_possible(cpu, true);
        set_cpu_present(cpu, true);
  }
@@@ -2018,14 -1998,10 +2023,14 @@@ void default_init_apic_ldr(void
  }
  
  #ifdef CONFIG_X86_32
 -int default_apicid_to_node(int logical_apicid)
 +int default_x86_32_numa_cpu_node(int cpu)
  {
 -#ifdef CONFIG_SMP
 -      return apicid_2_node[hard_smp_processor_id()];
 +#ifdef CONFIG_NUMA
 +      int apicid = early_per_cpu(x86_cpu_to_apicid, cpu);
 +
 +      if (apicid != BAD_APICID)
 +              return __apicid_to_node[apicid];
 +      return NUMA_NO_NODE;
  #else
        return 0;
  #endif
  #include <asm/smpboot_hooks.h>
  #include <asm/i8259.h>
  
 -#ifdef CONFIG_X86_32
 -u8 apicid_2_node[MAX_APICID];
 -#endif
 -
  /* State of each CPU */
  DEFINE_PER_CPU(int, cpu_state) = { 0 };
  
@@@ -132,6 -136,62 +132,6 @@@ EXPORT_PER_CPU_SYMBOL(cpu_info)
  
  atomic_t init_deasserted;
  
 -#if defined(CONFIG_NUMA) && defined(CONFIG_X86_32)
 -/* which node each logical CPU is on */
 -int cpu_to_node_map[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = 0 };
 -EXPORT_SYMBOL(cpu_to_node_map);
 -
 -/* set up a mapping between cpu and node. */
 -static void map_cpu_to_node(int cpu, int node)
 -{
 -      printk(KERN_INFO "Mapping cpu %d to node %d\n", cpu, node);
 -      cpumask_set_cpu(cpu, node_to_cpumask_map[node]);
 -      cpu_to_node_map[cpu] = node;
 -}
 -
 -/* undo a mapping between cpu and node. */
 -static void unmap_cpu_to_node(int cpu)
 -{
 -      int node;
 -
 -      printk(KERN_INFO "Unmapping cpu %d from all nodes\n", cpu);
 -      for (node = 0; node < MAX_NUMNODES; node++)
 -              cpumask_clear_cpu(cpu, node_to_cpumask_map[node]);
 -      cpu_to_node_map[cpu] = 0;
 -}
 -#else /* !(CONFIG_NUMA && CONFIG_X86_32) */
 -#define map_cpu_to_node(cpu, node)    ({})
 -#define unmap_cpu_to_node(cpu)        ({})
 -#endif
 -
 -#ifdef CONFIG_X86_32
 -static int boot_cpu_logical_apicid;
 -
 -u8 cpu_2_logical_apicid[NR_CPUS] __read_mostly =
 -                                      { [0 ... NR_CPUS-1] = BAD_APICID };
 -
 -static void map_cpu_to_logical_apicid(void)
 -{
 -      int cpu = smp_processor_id();
 -      int apicid = logical_smp_processor_id();
 -      int node = apic->apicid_to_node(apicid);
 -
 -      if (!node_online(node))
 -              node = first_online_node;
 -
 -      cpu_2_logical_apicid[cpu] = apicid;
 -      map_cpu_to_node(cpu, node);
 -}
 -
 -void numa_remove_cpu(int cpu)
 -{
 -      cpu_2_logical_apicid[cpu] = BAD_APICID;
 -      unmap_cpu_to_node(cpu);
 -}
 -#else
 -#define map_cpu_to_logical_apicid()  do {} while (0)
 -#endif
 -
  /*
   * Report back to the Boot Processor.
   * Running on AP.
@@@ -199,6 -259,7 +199,6 @@@ static void __cpuinit smp_callin(void
                apic->smp_callin_clear_local_apic();
        setup_local_APIC();
        end_local_APIC_setup();
 -      map_cpu_to_logical_apicid();
  
        /*
         * Need to setup vector mappings before we enable interrupts.
@@@ -353,7 -414,6 +353,7 @@@ void __cpuinit set_cpu_sibling_map(int 
  
                        if (cpu_has(c, X86_FEATURE_TOPOEXT)) {
                                if (c->phys_proc_id == o->phys_proc_id &&
 +                                  per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i) &&
                                    c->compute_unit_id == o->compute_unit_id)
                                        link_thread_siblings(cpu, i);
                        } else if (c->phys_proc_id == o->phys_proc_id &&
@@@ -900,6 -960,7 +900,6 @@@ static __init void disable_smp(void
                physid_set_mask_of_physid(boot_cpu_physical_apicid, &phys_cpu_present_map);
        else
                physid_set_mask_of_physid(0, &phys_cpu_present_map);
 -      map_cpu_to_logical_apicid();
        cpumask_set_cpu(0, cpu_sibling_mask(0));
        cpumask_set_cpu(0, cpu_core_mask(0));
  }
@@@ -999,7 -1060,7 +999,7 @@@ static int __init smp_sanity_check(unsi
  
                connect_bsp_APIC();
                setup_local_APIC();
-               end_local_APIC_setup();
+               bsp_end_local_APIC_setup();
                return -1;
        }
  
@@@ -1035,7 -1096,9 +1035,7 @@@ void __init native_smp_prepare_cpus(uns
         * Setup boot CPU information
         */
        smp_store_cpu_info(0); /* Final full version of the data */
 -#ifdef CONFIG_X86_32
 -      boot_cpu_logical_apicid = logical_smp_processor_id();
 -#endif
 +
        current_thread_info()->cpu = 0;  /* needed? */
        for_each_possible_cpu(i) {
                zalloc_cpumask_var(&per_cpu(cpu_sibling_map, i), GFP_KERNEL);
        if (!skip_ioapic_setup && nr_ioapics)
                enable_IO_APIC();
  
-       end_local_APIC_setup();
+       bsp_end_local_APIC_setup();
  
 -      map_cpu_to_logical_apicid();
 -
        if (apic->setup_portio_remap)
                apic->setup_portio_remap();
  
diff --combined arch/x86/mm/init_64.c
@@@ -105,18 -105,18 +105,18 @@@ void sync_global_pgds(unsigned long sta
  
        for (address = start; address <= end; address += PGDIR_SIZE) {
                const pgd_t *pgd_ref = pgd_offset_k(address);
-               unsigned long flags;
                struct page *page;
  
                if (pgd_none(*pgd_ref))
                        continue;
  
-               spin_lock_irqsave(&pgd_lock, flags);
+               spin_lock(&pgd_lock);
                list_for_each_entry(page, &pgd_list, lru) {
                        pgd_t *pgd;
                        spinlock_t *pgt_lock;
  
                        pgd = (pgd_t *)page_address(page) + pgd_index(address);
+                       /* the pgt_lock only for Xen */
                        pgt_lock = &pgd_page_get_mm(page)->page_table_lock;
                        spin_lock(pgt_lock);
  
  
                        spin_unlock(pgt_lock);
                }
-               spin_unlock_irqrestore(&pgd_lock, flags);
+               spin_unlock(&pgd_lock);
        }
  }
  
@@@ -314,7 -314,7 +314,7 @@@ void __init cleanup_highmap(void
  
  static __ref void *alloc_low_page(unsigned long *phys)
  {
 -      unsigned long pfn = e820_table_end++;
 +      unsigned long pfn = pgt_buf_end++;
        void *adr;
  
        if (after_bootmem) {
                return adr;
        }
  
 -      if (pfn >= e820_table_top)
 +      if (pfn >= pgt_buf_top)
                panic("alloc_low_page: ran out of memory");
  
        adr = early_memremap(pfn * PAGE_SIZE, PAGE_SIZE);
        return adr;
  }
  
 +static __ref void *map_low_page(void *virt)
 +{
 +      void *adr;
 +      unsigned long phys, left;
 +
 +      if (after_bootmem)
 +              return virt;
 +
 +      phys = __pa(virt);
 +      left = phys & (PAGE_SIZE - 1);
 +      adr = early_memremap(phys & PAGE_MASK, PAGE_SIZE);
 +      adr = (void *)(((unsigned long)adr) | left);
 +
 +      return adr;
 +}
 +
  static __ref void unmap_low_page(void *adr)
  {
        if (after_bootmem)
                return;
  
 -      early_iounmap(adr, PAGE_SIZE);
 +      early_iounmap((void *)((unsigned long)adr & PAGE_MASK), PAGE_SIZE);
  }
  
  static unsigned long __meminit
@@@ -402,6 -386,15 +402,6 @@@ phys_pte_init(pte_t *pte_page, unsigne
  }
  
  static unsigned long __meminit
 -phys_pte_update(pmd_t *pmd, unsigned long address, unsigned long end,
 -              pgprot_t prot)
 -{
 -      pte_t *pte = (pte_t *)pmd_page_vaddr(*pmd);
 -
 -      return phys_pte_init(pte, address, end, prot);
 -}
 -
 -static unsigned long __meminit
  phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
              unsigned long page_size_mask, pgprot_t prot)
  {
                if (pmd_val(*pmd)) {
                        if (!pmd_large(*pmd)) {
                                spin_lock(&init_mm.page_table_lock);
 -                              last_map_addr = phys_pte_update(pmd, address,
 +                              pte = map_low_page((pte_t *)pmd_page_vaddr(*pmd));
 +                              last_map_addr = phys_pte_init(pte, address,
                                                                end, prot);
 +                              unmap_low_page(pte);
                                spin_unlock(&init_mm.page_table_lock);
                                continue;
                        }
  }
  
  static unsigned long __meminit
 -phys_pmd_update(pud_t *pud, unsigned long address, unsigned long end,
 -              unsigned long page_size_mask, pgprot_t prot)
 -{
 -      pmd_t *pmd = pmd_offset(pud, 0);
 -      unsigned long last_map_addr;
 -
 -      last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask, prot);
 -      __flush_tlb_all();
 -      return last_map_addr;
 -}
 -
 -static unsigned long __meminit
  phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end,
                         unsigned long page_size_mask)
  {
  
                if (pud_val(*pud)) {
                        if (!pud_large(*pud)) {
 -                              last_map_addr = phys_pmd_update(pud, addr, end,
 +                              pmd = map_low_page(pmd_offset(pud, 0));
 +                              last_map_addr = phys_pmd_init(pmd, addr, end,
                                                         page_size_mask, prot);
 +                              unmap_low_page(pmd);
 +                              __flush_tlb_all();
                                continue;
                        }
                        /*
        return last_map_addr;
  }
  
 -static unsigned long __meminit
 -phys_pud_update(pgd_t *pgd, unsigned long addr, unsigned long end,
 -               unsigned long page_size_mask)
 -{
 -      pud_t *pud;
 -
 -      pud = (pud_t *)pgd_page_vaddr(*pgd);
 -
 -      return phys_pud_init(pud, addr, end, page_size_mask);
 -}
 -
  unsigned long __meminit
  kernel_physical_mapping_init(unsigned long start,
                             unsigned long end,
                        next = end;
  
                if (pgd_val(*pgd)) {
 -                      last_map_addr = phys_pud_update(pgd, __pa(start),
 +                      pud = map_low_page((pud_t *)pgd_page_vaddr(*pgd));
 +                      last_map_addr = phys_pud_init(pud, __pa(start),
                                                 __pa(end), page_size_mask);
 +                      unmap_low_page(pud);
                        continue;
                }
  
  }
  
  #ifndef CONFIG_NUMA
 -void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn,
 -                              int acpi, int k8)
 +void __init initmem_init(void)
  {
 -      memblock_x86_register_active_regions(0, start_pfn, end_pfn);
 +      memblock_x86_register_active_regions(0, 0, max_pfn);
  }
  #endif
  
diff --combined arch/x86/xen/mmu.c
@@@ -986,10 -986,9 +986,9 @@@ static void xen_pgd_pin(struct mm_struc
   */
  void xen_mm_pin_all(void)
  {
-       unsigned long flags;
        struct page *page;
  
-       spin_lock_irqsave(&pgd_lock, flags);
+       spin_lock(&pgd_lock);
  
        list_for_each_entry(page, &pgd_list, lru) {
                if (!PagePinned(page)) {
                }
        }
  
-       spin_unlock_irqrestore(&pgd_lock, flags);
+       spin_unlock(&pgd_lock);
  }
  
  /*
@@@ -1099,10 -1098,9 +1098,9 @@@ static void xen_pgd_unpin(struct mm_str
   */
  void xen_mm_unpin_all(void)
  {
-       unsigned long flags;
        struct page *page;
  
-       spin_lock_irqsave(&pgd_lock, flags);
+       spin_lock(&pgd_lock);
  
        list_for_each_entry(page, &pgd_list, lru) {
                if (PageSavePinned(page)) {
                }
        }
  
-       spin_unlock_irqrestore(&pgd_lock, flags);
+       spin_unlock(&pgd_lock);
  }
  
  void xen_activate_mm(struct mm_struct *prev, struct mm_struct *next)
@@@ -1443,7 -1441,7 +1441,7 @@@ static __init pte_t mask_rw_pte(pte_t *
         * early_ioremap fixmap slot, make sure it is RO.
         */
        if (!is_early_ioremap_ptep(ptep) &&
 -          pfn >= e820_table_start && pfn < e820_table_end)
 +          pfn >= pgt_buf_start && pfn < pgt_buf_end)
                pte = pte_wrprotect(pte);
  
        return pte;
diff --combined mm/page_alloc.c
@@@ -3699,45 -3699,13 +3699,45 @@@ void __init free_bootmem_with_active_re
  }
  
  #ifdef CONFIG_HAVE_MEMBLOCK
 +/*
 + * Basic iterator support. Return the last range of PFNs for a node
 + * Note: nid == MAX_NUMNODES returns last region regardless of node
 + */
 +static int __meminit last_active_region_index_in_nid(int nid)
 +{
 +      int i;
 +
 +      for (i = nr_nodemap_entries - 1; i >= 0; i--)
 +              if (nid == MAX_NUMNODES || early_node_map[i].nid == nid)
 +                      return i;
 +
 +      return -1;
 +}
 +
 +/*
 + * Basic iterator support. Return the previous active range of PFNs for a node
 + * Note: nid == MAX_NUMNODES returns next region regardless of node
 + */
 +static int __meminit previous_active_region_index_in_nid(int index, int nid)
 +{
 +      for (index = index - 1; index >= 0; index--)
 +              if (nid == MAX_NUMNODES || early_node_map[index].nid == nid)
 +                      return index;
 +
 +      return -1;
 +}
 +
 +#define for_each_active_range_index_in_nid_reverse(i, nid) \
 +      for (i = last_active_region_index_in_nid(nid); i != -1; \
 +                              i = previous_active_region_index_in_nid(i, nid))
 +
  u64 __init find_memory_core_early(int nid, u64 size, u64 align,
                                        u64 goal, u64 limit)
  {
        int i;
  
        /* Need to go over early_node_map to find out good range for node */
 -      for_each_active_range_index_in_nid(i, nid) {
 +      for_each_active_range_index_in_nid_reverse(i, nid) {
                u64 addr;
                u64 ei_start, ei_last;
                u64 final_start, final_end;
@@@ -3780,6 -3748,34 +3780,6 @@@ int __init add_from_early_node_map(stru
        return nr_range;
  }
  
 -#ifdef CONFIG_NO_BOOTMEM
 -void * __init __alloc_memory_core_early(int nid, u64 size, u64 align,
 -                                      u64 goal, u64 limit)
 -{
 -      void *ptr;
 -      u64 addr;
 -
 -      if (limit > memblock.current_limit)
 -              limit = memblock.current_limit;
 -
 -      addr = find_memory_core_early(nid, size, align, goal, limit);
 -
 -      if (addr == MEMBLOCK_ERROR)
 -              return NULL;
 -
 -      ptr = phys_to_virt(addr);
 -      memset(ptr, 0, size);
 -      memblock_x86_reserve_range(addr, addr + size, "BOOTMEM");
 -      /*
 -       * The min_count is set to 0 so that bootmem allocated blocks
 -       * are never reported as leaks.
 -       */
 -      kmemleak_alloc(ptr, size, 0, 0);
 -      return ptr;
 -}
 -#endif
 -
 -
  void __init work_with_active_regions(int nid, work_fn_t work_fn, void *data)
  {
        int i;
@@@ -4813,6 -4809,15 +4813,6 @@@ void __init set_dma_reserve(unsigned lo
        dma_reserve = new_dma_reserve;
  }
  
 -#ifndef CONFIG_NEED_MULTIPLE_NODES
 -struct pglist_data __refdata contig_page_data = {
 -#ifndef CONFIG_NO_BOOTMEM
 - .bdata = &bootmem_node_data[0]
 -#endif
 - };
 -EXPORT_SYMBOL(contig_page_data);
 -#endif
 -
  void __init free_area_init(unsigned long *zones_size)
  {
        free_area_init_node(0, zones_size,
@@@ -5371,10 -5376,9 +5371,9 @@@ __count_immobile_pages(struct zone *zon
        for (found = 0, iter = 0; iter < pageblock_nr_pages; iter++) {
                unsigned long check = pfn + iter;
  
-               if (!pfn_valid_within(check)) {
-                       iter++;
+               if (!pfn_valid_within(check))
                        continue;
-               }
                page = pfn_to_page(check);
                if (!page_count(page)) {
                        if (PageBuddy(page))