diff options
Diffstat (limited to 'mm')
| -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); |
