memory_hotplug.c (718127cc3170454f4aa274fdd2f1e01574fecd66) | memory_hotplug.c (6811378e7d8b9aa4fca2a1ca73d24c9d67c9cb12) |
---|---|
1/* 2 * linux/mm/memory_hotplug.c 3 * 4 * Copyright (C) 5 */ 6 7#include <linux/config.h> 8#include <linux/stddef.h> --- 113 unchanged lines hidden (view full) --- 122} 123 124int online_pages(unsigned long pfn, unsigned long nr_pages) 125{ 126 unsigned long i; 127 unsigned long flags; 128 unsigned long onlined_pages = 0; 129 struct zone *zone; | 1/* 2 * linux/mm/memory_hotplug.c 3 * 4 * Copyright (C) 5 */ 6 7#include <linux/config.h> 8#include <linux/stddef.h> --- 113 unchanged lines hidden (view full) --- 122} 123 124int online_pages(unsigned long pfn, unsigned long nr_pages) 125{ 126 unsigned long i; 127 unsigned long flags; 128 unsigned long onlined_pages = 0; 129 struct zone *zone; |
130 int need_zonelists_rebuild = 0; |
|
130 131 /* 132 * This doesn't need a lock to do pfn_to_page(). 133 * The section can't be removed here because of the 134 * memory_block->state_sem. 135 */ 136 zone = page_zone(pfn_to_page(pfn)); 137 pgdat_resize_lock(zone->zone_pgdat, &flags); 138 grow_zone_span(zone, pfn, pfn + nr_pages); 139 grow_pgdat_span(zone->zone_pgdat, pfn, pfn + nr_pages); 140 pgdat_resize_unlock(zone->zone_pgdat, &flags); 141 | 131 132 /* 133 * This doesn't need a lock to do pfn_to_page(). 134 * The section can't be removed here because of the 135 * memory_block->state_sem. 136 */ 137 zone = page_zone(pfn_to_page(pfn)); 138 pgdat_resize_lock(zone->zone_pgdat, &flags); 139 grow_zone_span(zone, pfn, pfn + nr_pages); 140 grow_pgdat_span(zone->zone_pgdat, pfn, pfn + nr_pages); 141 pgdat_resize_unlock(zone->zone_pgdat, &flags); 142 |
143 /* 144 * If this zone is not populated, then it is not in zonelist. 145 * This means the page allocator ignores this zone. 146 * So, zonelist must be updated after online. 147 */ 148 if (!populated_zone(zone)) 149 need_zonelists_rebuild = 1; 150 |
|
142 for (i = 0; i < nr_pages; i++) { 143 struct page *page = pfn_to_page(pfn + i); 144 online_page(page); 145 onlined_pages++; 146 } 147 zone->present_pages += onlined_pages; 148 zone->zone_pgdat->node_present_pages += onlined_pages; 149 150 setup_per_zone_pages_min(); 151 | 151 for (i = 0; i < nr_pages; i++) { 152 struct page *page = pfn_to_page(pfn + i); 153 online_page(page); 154 onlined_pages++; 155 } 156 zone->present_pages += onlined_pages; 157 zone->zone_pgdat->node_present_pages += onlined_pages; 158 159 setup_per_zone_pages_min(); 160 |
161 if (need_zonelists_rebuild) 162 build_all_zonelists(); 163 |
|
152 return 0; 153} | 164 return 0; 165} |