diff options
Diffstat (limited to 'mm/memory_hotplug.c')
-rw-r--r-- | mm/memory_hotplug.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 26fbba7d888f..6da82bcb0a8b 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -446,7 +446,7 @@ static int __meminit __add_zone(struct zone *zone, unsigned long phys_start_pfn) | |||
446 | int nr_pages = PAGES_PER_SECTION; | 446 | int nr_pages = PAGES_PER_SECTION; |
447 | int nid = pgdat->node_id; | 447 | int nid = pgdat->node_id; |
448 | int zone_type; | 448 | int zone_type; |
449 | unsigned long flags; | 449 | unsigned long flags, pfn; |
450 | int ret; | 450 | int ret; |
451 | 451 | ||
452 | zone_type = zone - pgdat->node_zones; | 452 | zone_type = zone - pgdat->node_zones; |
@@ -461,6 +461,14 @@ static int __meminit __add_zone(struct zone *zone, unsigned long phys_start_pfn) | |||
461 | pgdat_resize_unlock(zone->zone_pgdat, &flags); | 461 | pgdat_resize_unlock(zone->zone_pgdat, &flags); |
462 | memmap_init_zone(nr_pages, nid, zone_type, | 462 | memmap_init_zone(nr_pages, nid, zone_type, |
463 | phys_start_pfn, MEMMAP_HOTPLUG); | 463 | phys_start_pfn, MEMMAP_HOTPLUG); |
464 | |||
465 | /* online_page_range is called later and expects pages reserved */ | ||
466 | for (pfn = phys_start_pfn; pfn < phys_start_pfn + nr_pages; pfn++) { | ||
467 | if (!pfn_valid(pfn)) | ||
468 | continue; | ||
469 | |||
470 | SetPageReserved(pfn_to_page(pfn)); | ||
471 | } | ||
464 | return 0; | 472 | return 0; |
465 | } | 473 | } |
466 | 474 | ||
@@ -1269,6 +1277,7 @@ int __ref add_memory(int nid, u64 start, u64 size) | |||
1269 | 1277 | ||
1270 | /* create new memmap entry */ | 1278 | /* create new memmap entry */ |
1271 | firmware_map_add_hotplug(start, start + size, "System RAM"); | 1279 | firmware_map_add_hotplug(start, start + size, "System RAM"); |
1280 | memblock_add_node(start, size, nid); | ||
1272 | 1281 | ||
1273 | goto out; | 1282 | goto out; |
1274 | 1283 | ||
@@ -2005,6 +2014,8 @@ void __ref remove_memory(int nid, u64 start, u64 size) | |||
2005 | 2014 | ||
2006 | /* remove memmap entry */ | 2015 | /* remove memmap entry */ |
2007 | firmware_map_remove(start, start + size, "System RAM"); | 2016 | firmware_map_remove(start, start + size, "System RAM"); |
2017 | memblock_free(start, size); | ||
2018 | memblock_remove(start, size); | ||
2008 | 2019 | ||
2009 | arch_remove_memory(start, size); | 2020 | arch_remove_memory(start, size); |
2010 | 2021 | ||