diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index f66538b3c31b1de6a144446b087515a85ab2c7de..41737395bbcc16625ef11b071278ed6073c4055f 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2964,6 +2964,7 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn)
 						early_node_map[i].end_pfn);
 
 	/* Initialise every node */
+	setup_nr_node_ids();
 	for_each_online_node(nid) {
 		pg_data_t *pgdat = NODE_DATA(nid);
 		free_area_init_node(nid, pgdat, NULL,
@@ -3189,7 +3190,6 @@ static int __init init_per_zone_pages_min(void)
 		min_free_kbytes = 65536;
 	setup_per_zone_pages_min();
 	setup_per_zone_lowmem_reserve();
-	setup_nr_node_ids();
 	return 0;
 }
 module_init(init_per_zone_pages_min)
diff --git a/mm/slab.c b/mm/slab.c
index 70784b848b69b475718f0090033770b7c17b511b..8fdaffa717eaa1ef21bd3b900a02c06ab7f05f66 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -1042,7 +1042,7 @@ static void *alternate_node_alloc(struct kmem_cache *, gfp_t);
 static struct array_cache **alloc_alien_cache(int node, int limit)
 {
 	struct array_cache **ac_ptr;
-	int memsize = sizeof(void *) * MAX_NUMNODES;
+	int memsize = sizeof(void *) * nr_node_ids;
 	int i;
 
 	if (limit > 1)