aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/mmzone.h2
-rw-r--r--mm/memory_hotplug.c23
-rw-r--r--mm/page_alloc.c8
3 files changed, 8 insertions, 25 deletions
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index fc39f85d273c..976a1202bec1 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -772,7 +772,7 @@ enum memmap_context {
772 MEMMAP_EARLY, 772 MEMMAP_EARLY,
773 MEMMAP_HOTPLUG, 773 MEMMAP_HOTPLUG,
774}; 774};
775extern int init_currently_empty_zone(struct zone *zone, unsigned long start_pfn, 775extern void init_currently_empty_zone(struct zone *zone, unsigned long start_pfn,
776 unsigned long size); 776 unsigned long size);
777 777
778extern void lruvec_init(struct lruvec *lruvec); 778extern void lruvec_init(struct lruvec *lruvec);
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index b63d7d1239df..b93c88125766 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -348,27 +348,20 @@ static void fix_zone_id(struct zone *zone, unsigned long start_pfn,
348 set_page_links(pfn_to_page(pfn), zid, nid, pfn); 348 set_page_links(pfn_to_page(pfn), zid, nid, pfn);
349} 349}
350 350
351/* Can fail with -ENOMEM from allocating a wait table with vmalloc() or 351static void __ref ensure_zone_is_initialized(struct zone *zone,
352 * alloc_bootmem_node_nopanic()/memblock_virt_alloc_node_nopanic() */
353static int __ref ensure_zone_is_initialized(struct zone *zone,
354 unsigned long start_pfn, unsigned long num_pages) 352 unsigned long start_pfn, unsigned long num_pages)
355{ 353{
356 if (!zone_is_initialized(zone)) 354 if (!zone_is_initialized(zone))
357 return init_currently_empty_zone(zone, start_pfn, num_pages); 355 init_currently_empty_zone(zone, start_pfn, num_pages);
358
359 return 0;
360} 356}
361 357
362static int __meminit move_pfn_range_left(struct zone *z1, struct zone *z2, 358static int __meminit move_pfn_range_left(struct zone *z1, struct zone *z2,
363 unsigned long start_pfn, unsigned long end_pfn) 359 unsigned long start_pfn, unsigned long end_pfn)
364{ 360{
365 int ret;
366 unsigned long flags; 361 unsigned long flags;
367 unsigned long z1_start_pfn; 362 unsigned long z1_start_pfn;
368 363
369 ret = ensure_zone_is_initialized(z1, start_pfn, end_pfn - start_pfn); 364 ensure_zone_is_initialized(z1, start_pfn, end_pfn - start_pfn);
370 if (ret)
371 return ret;
372 365
373 pgdat_resize_lock(z1->zone_pgdat, &flags); 366 pgdat_resize_lock(z1->zone_pgdat, &flags);
374 367
@@ -404,13 +397,10 @@ out_fail:
404static int __meminit move_pfn_range_right(struct zone *z1, struct zone *z2, 397static int __meminit move_pfn_range_right(struct zone *z1, struct zone *z2,
405 unsigned long start_pfn, unsigned long end_pfn) 398 unsigned long start_pfn, unsigned long end_pfn)
406{ 399{
407 int ret;
408 unsigned long flags; 400 unsigned long flags;
409 unsigned long z2_end_pfn; 401 unsigned long z2_end_pfn;
410 402
411 ret = ensure_zone_is_initialized(z2, start_pfn, end_pfn - start_pfn); 403 ensure_zone_is_initialized(z2, start_pfn, end_pfn - start_pfn);
412 if (ret)
413 return ret;
414 404
415 pgdat_resize_lock(z1->zone_pgdat, &flags); 405 pgdat_resize_lock(z1->zone_pgdat, &flags);
416 406
@@ -481,12 +471,9 @@ static int __meminit __add_zone(struct zone *zone, unsigned long phys_start_pfn)
481 int nid = pgdat->node_id; 471 int nid = pgdat->node_id;
482 int zone_type; 472 int zone_type;
483 unsigned long flags, pfn; 473 unsigned long flags, pfn;
484 int ret;
485 474
486 zone_type = zone - pgdat->node_zones; 475 zone_type = zone - pgdat->node_zones;
487 ret = ensure_zone_is_initialized(zone, phys_start_pfn, nr_pages); 476 ensure_zone_is_initialized(zone, phys_start_pfn, nr_pages);
488 if (ret)
489 return ret;
490 477
491 pgdat_resize_lock(zone->zone_pgdat, &flags); 478 pgdat_resize_lock(zone->zone_pgdat, &flags);
492 grow_zone_span(zone, phys_start_pfn, phys_start_pfn + nr_pages); 479 grow_zone_span(zone, phys_start_pfn, phys_start_pfn + nr_pages);
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 2302f250d6b1..73f854344735 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5528,7 +5528,7 @@ static __meminit void zone_pcp_init(struct zone *zone)
5528 zone_batchsize(zone)); 5528 zone_batchsize(zone));
5529} 5529}
5530 5530
5531int __meminit init_currently_empty_zone(struct zone *zone, 5531void __meminit init_currently_empty_zone(struct zone *zone,
5532 unsigned long zone_start_pfn, 5532 unsigned long zone_start_pfn,
5533 unsigned long size) 5533 unsigned long size)
5534{ 5534{
@@ -5546,8 +5546,6 @@ int __meminit init_currently_empty_zone(struct zone *zone,
5546 5546
5547 zone_init_free_lists(zone); 5547 zone_init_free_lists(zone);
5548 zone->initialized = 1; 5548 zone->initialized = 1;
5549
5550 return 0;
5551} 5549}
5552 5550
5553#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP 5551#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
@@ -6005,7 +6003,6 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat)
6005{ 6003{
6006 enum zone_type j; 6004 enum zone_type j;
6007 int nid = pgdat->node_id; 6005 int nid = pgdat->node_id;
6008 int ret;
6009 6006
6010 pgdat_resize_init(pgdat); 6007 pgdat_resize_init(pgdat);
6011#ifdef CONFIG_NUMA_BALANCING 6008#ifdef CONFIG_NUMA_BALANCING
@@ -6087,8 +6084,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat)
6087 6084
6088 set_pageblock_order(); 6085 set_pageblock_order();
6089 setup_usemap(pgdat, zone, zone_start_pfn, size); 6086 setup_usemap(pgdat, zone, zone_start_pfn, size);
6090 ret = init_currently_empty_zone(zone, zone_start_pfn, size); 6087 init_currently_empty_zone(zone, zone_start_pfn, size);
6091 BUG_ON(ret);
6092 memmap_init(size, nid, j, zone_start_pfn); 6088 memmap_init(size, nid, j, zone_start_pfn);
6093 } 6089 }
6094} 6090}