setup_bios_corruption_check();
 #endif
 
+       /*
+        * In the memory hotplug case, the kernel needs info from SRAT to
+        * determine which memory is hotpluggable before allocating memory
+        * using memblock.
+        */
+       acpi_boot_table_init();
+       early_acpi_boot_init();
+       early_parse_srat();
+
 #ifdef CONFIG_X86_32
        printk(KERN_DEBUG "initial memory mapped: [mem 0x00000000-%#010lx]\n",
                        (max_pfn_mapped<<PAGE_SHIFT) - 1);
        /*
         * Parse the ACPI tables for possible boot-time SMP configuration.
         */
-       acpi_boot_table_init();
-
-       early_acpi_boot_init();
-
        initmem_init();
        memblock_find_dma_reserve();
 
 
        for (i = 0; i < MAX_LOCAL_APIC; i++)
                set_apicid_to_node(i, NUMA_NO_NODE);
 
-       nodes_clear(numa_nodes_parsed);
+       /*
+        * Do not clear numa_nodes_parsed or zero numa_meminfo here, because
+        * SRAT was parsed earlier in early_parse_srat().
+        */
        nodes_clear(node_possible_map);
        nodes_clear(node_online_map);
-       memset(&numa_meminfo, 0, sizeof(numa_meminfo));
        WARN_ON(memblock_set_node(0, ULLONG_MAX, MAX_NUMNODES));
        numa_reset_distance();
 
 
                                            handler, max_entries);
 }
 
-int __init acpi_numa_init(void)
-{
-       int cnt = 0;
+static int srat_mem_cnt;
 
+void __init early_parse_srat(void)
+{
        /*
         * Should not limit number with cpu num that is from NR_CPUS or nr_cpus=
         * SRAT cpu entries could have different order with that in MADT.
        /* SRAT: Static Resource Affinity Table */
        if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) {
                acpi_table_parse_srat(ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY,
-                                    acpi_parse_x2apic_affinity, 0);
+                                     acpi_parse_x2apic_affinity, 0);
                acpi_table_parse_srat(ACPI_SRAT_TYPE_CPU_AFFINITY,
-                                    acpi_parse_processor_affinity, 0);
-               cnt = acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
-                                           acpi_parse_memory_affinity,
-                                           NR_NODE_MEMBLKS);
+                                     acpi_parse_processor_affinity, 0);
+               srat_mem_cnt = acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
+                                                    acpi_parse_memory_affinity,
+                                                    NR_NODE_MEMBLKS);
        }
+}
 
+int __init acpi_numa_init(void)
+{
        /* SLIT: System Locality Information Table */
        acpi_table_parse(ACPI_SIG_SLIT, acpi_parse_slit);
 
        acpi_numa_arch_fixup();
 
-       if (cnt < 0)
-               return cnt;
+       if (srat_mem_cnt < 0)
+               return srat_mem_cnt;
        else if (!parsed_numa_memblks)
                return -ENOENT;
        return 0;
 
 
 #endif /* !CONFIG_ACPI */
 
+#ifdef CONFIG_ACPI_NUMA
+void __init early_parse_srat(void);
+#else
+static inline void early_parse_srat(void)
+{
+}
+#endif
+
 #ifdef CONFIG_ACPI
 void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state,
                               u32 pm1a_ctrl,  u32 pm1b_ctrl));