diff options
Diffstat (limited to 'mm/bootmem.c')
-rw-r--r-- | mm/bootmem.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c index 282b786c2b15..4af15d0340ad 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
@@ -80,7 +80,7 @@ static void __init link_bootmem(bootmem_data_t *bdata) | |||
80 | bootmem_data_t *ent; | 80 | bootmem_data_t *ent; |
81 | 81 | ||
82 | ent = list_entry(iter, bootmem_data_t, list); | 82 | ent = list_entry(iter, bootmem_data_t, list); |
83 | if (bdata->node_boot_start < ent->node_boot_start) | 83 | if (bdata->node_min_pfn < ent->node_min_pfn) |
84 | break; | 84 | break; |
85 | } | 85 | } |
86 | list_add_tail(&bdata->list, iter); | 86 | list_add_tail(&bdata->list, iter); |
@@ -96,7 +96,7 @@ static unsigned long __init init_bootmem_core(bootmem_data_t *bdata, | |||
96 | 96 | ||
97 | mminit_validate_memmodel_limits(&start, &end); | 97 | mminit_validate_memmodel_limits(&start, &end); |
98 | bdata->node_bootmem_map = phys_to_virt(PFN_PHYS(mapstart)); | 98 | bdata->node_bootmem_map = phys_to_virt(PFN_PHYS(mapstart)); |
99 | bdata->node_boot_start = PFN_PHYS(start); | 99 | bdata->node_min_pfn = start; |
100 | bdata->node_low_pfn = end; | 100 | bdata->node_low_pfn = end; |
101 | link_bootmem(bdata); | 101 | link_bootmem(bdata); |
102 | 102 | ||
@@ -151,7 +151,7 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) | |||
151 | if (!bdata->node_bootmem_map) | 151 | if (!bdata->node_bootmem_map) |
152 | return 0; | 152 | return 0; |
153 | 153 | ||
154 | start = PFN_DOWN(bdata->node_boot_start); | 154 | start = bdata->node_min_pfn; |
155 | end = bdata->node_low_pfn; | 155 | end = bdata->node_low_pfn; |
156 | 156 | ||
157 | /* | 157 | /* |
@@ -167,7 +167,7 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) | |||
167 | unsigned long *map, idx, vec; | 167 | unsigned long *map, idx, vec; |
168 | 168 | ||
169 | map = bdata->node_bootmem_map; | 169 | map = bdata->node_bootmem_map; |
170 | idx = start - PFN_DOWN(bdata->node_boot_start); | 170 | idx = start - bdata->node_min_pfn; |
171 | vec = ~map[idx / BITS_PER_LONG]; | 171 | vec = ~map[idx / BITS_PER_LONG]; |
172 | 172 | ||
173 | if (aligned && vec == ~0UL && start + BITS_PER_LONG < end) { | 173 | if (aligned && vec == ~0UL && start + BITS_PER_LONG < end) { |
@@ -192,7 +192,7 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) | |||
192 | } | 192 | } |
193 | 193 | ||
194 | page = virt_to_page(bdata->node_bootmem_map); | 194 | page = virt_to_page(bdata->node_bootmem_map); |
195 | pages = bdata->node_low_pfn - PFN_DOWN(bdata->node_boot_start); | 195 | pages = bdata->node_low_pfn - bdata->node_min_pfn; |
196 | pages = bootmem_bootmap_pages(pages); | 196 | pages = bootmem_bootmap_pages(pages); |
197 | count += pages; | 197 | count += pages; |
198 | while (pages--) | 198 | while (pages--) |
@@ -231,8 +231,8 @@ static void __init __free(bootmem_data_t *bdata, | |||
231 | unsigned long idx; | 231 | unsigned long idx; |
232 | 232 | ||
233 | bdebug("nid=%td start=%lx end=%lx\n", bdata - bootmem_node_data, | 233 | bdebug("nid=%td start=%lx end=%lx\n", bdata - bootmem_node_data, |
234 | sidx + PFN_DOWN(bdata->node_boot_start), | 234 | sidx + bdata->node_min_pfn, |
235 | eidx + PFN_DOWN(bdata->node_boot_start)); | 235 | eidx + bdata->node_min_pfn); |
236 | 236 | ||
237 | if (bdata->hint_idx > sidx) | 237 | if (bdata->hint_idx > sidx) |
238 | bdata->hint_idx = sidx; | 238 | bdata->hint_idx = sidx; |
@@ -250,8 +250,8 @@ static int __init __reserve(bootmem_data_t *bdata, unsigned long sidx, | |||
250 | 250 | ||
251 | bdebug("nid=%td start=%lx end=%lx flags=%x\n", | 251 | bdebug("nid=%td start=%lx end=%lx flags=%x\n", |
252 | bdata - bootmem_node_data, | 252 | bdata - bootmem_node_data, |
253 | sidx + PFN_DOWN(bdata->node_boot_start), | 253 | sidx + bdata->node_min_pfn, |
254 | eidx + PFN_DOWN(bdata->node_boot_start), | 254 | eidx + bdata->node_min_pfn, |
255 | flags); | 255 | flags); |
256 | 256 | ||
257 | for (idx = sidx; idx < eidx; idx++) | 257 | for (idx = sidx; idx < eidx; idx++) |
@@ -261,7 +261,7 @@ static int __init __reserve(bootmem_data_t *bdata, unsigned long sidx, | |||
261 | return -EBUSY; | 261 | return -EBUSY; |
262 | } | 262 | } |
263 | bdebug("silent double reserve of PFN %lx\n", | 263 | bdebug("silent double reserve of PFN %lx\n", |
264 | idx + PFN_DOWN(bdata->node_boot_start)); | 264 | idx + bdata->node_min_pfn); |
265 | } | 265 | } |
266 | return 0; | 266 | return 0; |
267 | } | 267 | } |
@@ -275,11 +275,11 @@ static int __init mark_bootmem_node(bootmem_data_t *bdata, | |||
275 | bdebug("nid=%td start=%lx end=%lx reserve=%d flags=%x\n", | 275 | bdebug("nid=%td start=%lx end=%lx reserve=%d flags=%x\n", |
276 | bdata - bootmem_node_data, start, end, reserve, flags); | 276 | bdata - bootmem_node_data, start, end, reserve, flags); |
277 | 277 | ||
278 | BUG_ON(start < PFN_DOWN(bdata->node_boot_start)); | 278 | BUG_ON(start < bdata->node_min_pfn); |
279 | BUG_ON(end > bdata->node_low_pfn); | 279 | BUG_ON(end > bdata->node_low_pfn); |
280 | 280 | ||
281 | sidx = start - PFN_DOWN(bdata->node_boot_start); | 281 | sidx = start - bdata->node_min_pfn; |
282 | eidx = end - PFN_DOWN(bdata->node_boot_start); | 282 | eidx = end - bdata->node_min_pfn; |
283 | 283 | ||
284 | if (reserve) | 284 | if (reserve) |
285 | return __reserve(bdata, sidx, eidx, flags); | 285 | return __reserve(bdata, sidx, eidx, flags); |
@@ -299,7 +299,8 @@ static int __init mark_bootmem(unsigned long start, unsigned long end, | |||
299 | int err; | 299 | int err; |
300 | unsigned long max; | 300 | unsigned long max; |
301 | 301 | ||
302 | if (pos < PFN_DOWN(bdata->node_boot_start)) { | 302 | if (pos < bdata->node_min_pfn || |
303 | pos >= bdata->node_low_pfn) { | ||
303 | BUG_ON(pos != start); | 304 | BUG_ON(pos != start); |
304 | continue; | 305 | continue; |
305 | } | 306 | } |
@@ -422,7 +423,7 @@ static void * __init alloc_bootmem_core(struct bootmem_data *bdata, | |||
422 | bdata - bootmem_node_data, size, PAGE_ALIGN(size) >> PAGE_SHIFT, | 423 | bdata - bootmem_node_data, size, PAGE_ALIGN(size) >> PAGE_SHIFT, |
423 | align, goal, limit); | 424 | align, goal, limit); |
424 | 425 | ||
425 | min = PFN_DOWN(bdata->node_boot_start); | 426 | min = bdata->node_min_pfn; |
426 | max = bdata->node_low_pfn; | 427 | max = bdata->node_low_pfn; |
427 | 428 | ||
428 | goal >>= PAGE_SHIFT; | 429 | goal >>= PAGE_SHIFT; |
@@ -440,8 +441,8 @@ static void * __init alloc_bootmem_core(struct bootmem_data *bdata, | |||
440 | else | 441 | else |
441 | start = ALIGN(min, step); | 442 | start = ALIGN(min, step); |
442 | 443 | ||
443 | sidx = start - PFN_DOWN(bdata->node_boot_start); | 444 | sidx = start - bdata->node_min_pfn;; |
444 | midx = max - PFN_DOWN(bdata->node_boot_start); | 445 | midx = max - bdata->node_min_pfn; |
445 | 446 | ||
446 | if (bdata->hint_idx > sidx) { | 447 | if (bdata->hint_idx > sidx) { |
447 | /* | 448 | /* |
@@ -491,7 +492,8 @@ find_block: | |||
491 | PFN_UP(end_off), BOOTMEM_EXCLUSIVE)) | 492 | PFN_UP(end_off), BOOTMEM_EXCLUSIVE)) |
492 | BUG(); | 493 | BUG(); |
493 | 494 | ||
494 | region = phys_to_virt(bdata->node_boot_start + start_off); | 495 | region = phys_to_virt(PFN_PHYS(bdata->node_min_pfn) + |
496 | start_off); | ||
495 | memset(region, 0, size); | 497 | memset(region, 0, size); |
496 | return region; | 498 | return region; |
497 | } | 499 | } |
@@ -518,7 +520,7 @@ restart: | |||
518 | 520 | ||
519 | if (goal && bdata->node_low_pfn <= PFN_DOWN(goal)) | 521 | if (goal && bdata->node_low_pfn <= PFN_DOWN(goal)) |
520 | continue; | 522 | continue; |
521 | if (limit && bdata->node_boot_start >= limit) | 523 | if (limit && bdata->node_min_pfn >= PFN_DOWN(limit)) |
522 | break; | 524 | break; |
523 | 525 | ||
524 | region = alloc_bootmem_core(bdata, size, align, goal, limit); | 526 | region = alloc_bootmem_core(bdata, size, align, goal, limit); |