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}