diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memory_hotplug.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 0b11a8543441..f13783e81eb6 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -127,6 +127,9 @@ int online_pages(unsigned long pfn, unsigned long nr_pages) | |||
127 | unsigned long i; | 127 | unsigned long i; |
128 | unsigned long flags; | 128 | unsigned long flags; |
129 | unsigned long onlined_pages = 0; | 129 | unsigned long onlined_pages = 0; |
130 | struct resource res; | ||
131 | u64 section_end; | ||
132 | unsigned long start_pfn; | ||
130 | struct zone *zone; | 133 | struct zone *zone; |
131 | int need_zonelists_rebuild = 0; | 134 | int need_zonelists_rebuild = 0; |
132 | 135 | ||
@@ -149,10 +152,27 @@ int online_pages(unsigned long pfn, unsigned long nr_pages) | |||
149 | if (!populated_zone(zone)) | 152 | if (!populated_zone(zone)) |
150 | need_zonelists_rebuild = 1; | 153 | need_zonelists_rebuild = 1; |
151 | 154 | ||
152 | for (i = 0; i < nr_pages; i++) { | 155 | res.start = (u64)pfn << PAGE_SHIFT; |
153 | struct page *page = pfn_to_page(pfn + i); | 156 | res.end = res.start + ((u64)nr_pages << PAGE_SHIFT) - 1; |
154 | online_page(page); | 157 | res.flags = IORESOURCE_MEM; /* we just need system ram */ |
155 | onlined_pages++; | 158 | section_end = res.end; |
159 | |||
160 | while (find_next_system_ram(&res) >= 0) { | ||
161 | start_pfn = (unsigned long)(res.start >> PAGE_SHIFT); | ||
162 | nr_pages = (unsigned long) | ||
163 | ((res.end + 1 - res.start) >> PAGE_SHIFT); | ||
164 | |||
165 | if (PageReserved(pfn_to_page(start_pfn))) { | ||
166 | /* this region's page is not onlined now */ | ||
167 | for (i = 0; i < nr_pages; i++) { | ||
168 | struct page *page = pfn_to_page(start_pfn + i); | ||
169 | online_page(page); | ||
170 | onlined_pages++; | ||
171 | } | ||
172 | } | ||
173 | |||
174 | res.start = res.end + 1; | ||
175 | res.end = section_end; | ||
156 | } | 176 | } |
157 | zone->present_pages += onlined_pages; | 177 | zone->present_pages += onlined_pages; |
158 | zone->zone_pgdat->node_present_pages += onlined_pages; | 178 | zone->zone_pgdat->node_present_pages += onlined_pages; |