diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-03 11:15:05 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-03 11:15:05 -0500 |
commit | a626b46e17d0762d664ce471d40bc506b6e721ab (patch) | |
tree | 445f6ac655ea9247d2e27529f23ba02d0991fec0 /mm/page_alloc.c | |
parent | c1dcb4bb1e3e16e9baee578d9bb040e5fba1063e (diff) | |
parent | dce46a04d55d6358d2d4ab44a4946a19f9425fe2 (diff) |
Merge branch 'x86-bootmem-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-bootmem-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (30 commits)
early_res: Need to save the allocation name in drop_range_partial()
sparsemem: Fix compilation on PowerPC
early_res: Add free_early_partial()
x86: Fix non-bootmem compilation on PowerPC
core: Move early_res from arch/x86 to kernel/
x86: Add find_fw_memmap_area
Move round_up/down to kernel.h
x86: Make 32bit support NO_BOOTMEM
early_res: Enhance check_and_double_early_res
x86: Move back find_e820_area to e820.c
x86: Add find_early_area_size
x86: Separate early_res related code from e820.c
x86: Move bios page reserve early to head32/64.c
sparsemem: Put mem map for one node together.
sparsemem: Put usemap for one node together
x86: Make 64 bit use early_res instead of bootmem before slab
x86: Only call dma32_reserve_bootmem 64bit !CONFIG_NUMA
x86: Make early_node_mem get mem > 4 GB if possible
x86: Dynamically increase early_res array size
x86: Introduce max_early_res and early_res_count
...
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 9a7aaae07ab4..a6b17aa4740b 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -3374,6 +3374,61 @@ void __init free_bootmem_with_active_regions(int nid, | |||
3374 | } | 3374 | } |
3375 | } | 3375 | } |
3376 | 3376 | ||
3377 | int __init add_from_early_node_map(struct range *range, int az, | ||
3378 | int nr_range, int nid) | ||
3379 | { | ||
3380 | int i; | ||
3381 | u64 start, end; | ||
3382 | |||
3383 | /* need to go over early_node_map to find out good range for node */ | ||
3384 | for_each_active_range_index_in_nid(i, nid) { | ||
3385 | start = early_node_map[i].start_pfn; | ||
3386 | end = early_node_map[i].end_pfn; | ||
3387 | nr_range = add_range(range, az, nr_range, start, end); | ||
3388 | } | ||
3389 | return nr_range; | ||
3390 | } | ||
3391 | |||
3392 | #ifdef CONFIG_NO_BOOTMEM | ||
3393 | void * __init __alloc_memory_core_early(int nid, u64 size, u64 align, | ||
3394 | u64 goal, u64 limit) | ||
3395 | { | ||
3396 | int i; | ||
3397 | void *ptr; | ||
3398 | |||
3399 | /* need to go over early_node_map to find out good range for node */ | ||
3400 | for_each_active_range_index_in_nid(i, nid) { | ||
3401 | u64 addr; | ||
3402 | u64 ei_start, ei_last; | ||
3403 | |||
3404 | ei_last = early_node_map[i].end_pfn; | ||
3405 | ei_last <<= PAGE_SHIFT; | ||
3406 | ei_start = early_node_map[i].start_pfn; | ||
3407 | ei_start <<= PAGE_SHIFT; | ||
3408 | addr = find_early_area(ei_start, ei_last, | ||
3409 | goal, limit, size, align); | ||
3410 | |||
3411 | if (addr == -1ULL) | ||
3412 | continue; | ||
3413 | |||
3414 | #if 0 | ||
3415 | printk(KERN_DEBUG "alloc (nid=%d %llx - %llx) (%llx - %llx) %llx %llx => %llx\n", | ||
3416 | nid, | ||
3417 | ei_start, ei_last, goal, limit, size, | ||
3418 | align, addr); | ||
3419 | #endif | ||
3420 | |||
3421 | ptr = phys_to_virt(addr); | ||
3422 | memset(ptr, 0, size); | ||
3423 | reserve_early_without_check(addr, addr + size, "BOOTMEM"); | ||
3424 | return ptr; | ||
3425 | } | ||
3426 | |||
3427 | return NULL; | ||
3428 | } | ||
3429 | #endif | ||
3430 | |||
3431 | |||
3377 | void __init work_with_active_regions(int nid, work_fn_t work_fn, void *data) | 3432 | void __init work_with_active_regions(int nid, work_fn_t work_fn, void *data) |
3378 | { | 3433 | { |
3379 | int i; | 3434 | int i; |
@@ -4406,7 +4461,11 @@ void __init set_dma_reserve(unsigned long new_dma_reserve) | |||
4406 | } | 4461 | } |
4407 | 4462 | ||
4408 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 4463 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
4409 | struct pglist_data __refdata contig_page_data = { .bdata = &bootmem_node_data[0] }; | 4464 | struct pglist_data __refdata contig_page_data = { |
4465 | #ifndef CONFIG_NO_BOOTMEM | ||
4466 | .bdata = &bootmem_node_data[0] | ||
4467 | #endif | ||
4468 | }; | ||
4410 | EXPORT_SYMBOL(contig_page_data); | 4469 | EXPORT_SYMBOL(contig_page_data); |
4411 | #endif | 4470 | #endif |
4412 | 4471 | ||