diff options
author | Bernhard Walle <bwalle@suse.de> | 2008-02-07 03:15:17 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-07 11:42:25 -0500 |
commit | 72a7fe3967dbf86cb34e24fbf1d957fe24d2f246 (patch) | |
tree | c19f7d0b530577359840e959cce204939caf0649 | |
parent | 25fad945a7f7ff2cf06e437381c6a1121784dbd9 (diff) |
Introduce flags for reserve_bootmem()
This patchset adds a flags variable to reserve_bootmem() and uses the
BOOTMEM_EXCLUSIVE flag in crashkernel reservation code to detect collisions
between crashkernel area and already used memory.
This patch:
Change the reserve_bootmem() function to accept a new flag BOOTMEM_EXCLUSIVE.
If that flag is set, the function returns with -EBUSY if the memory already
has been reserved in the past. This is to avoid conflicts.
Because that code runs before SMP initialisation, there's no race condition
inside reserve_bootmem_core().
[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: fix powerpc build]
Signed-off-by: Bernhard Walle <bwalle@suse.de>
Cc: <linux-arch@vger.kernel.org>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Vivek Goyal <vgoyal@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
43 files changed, 183 insertions, 105 deletions
diff --git a/arch/alpha/kernel/core_irongate.c b/arch/alpha/kernel/core_irongate.c index e4a0bcf1d28b..a872078497be 100644 --- a/arch/alpha/kernel/core_irongate.c +++ b/arch/alpha/kernel/core_irongate.c | |||
@@ -241,7 +241,8 @@ albacore_init_arch(void) | |||
241 | size / 1024); | 241 | size / 1024); |
242 | } | 242 | } |
243 | #endif | 243 | #endif |
244 | reserve_bootmem_node(NODE_DATA(0), pci_mem, memtop - pci_mem); | 244 | reserve_bootmem_node(NODE_DATA(0), pci_mem, memtop - |
245 | pci_mem, BOOTMEM_DEFAULT); | ||
245 | printk("irongate_init_arch: temporarily reserving " | 246 | printk("irongate_init_arch: temporarily reserving " |
246 | "region %08lx-%08lx for PCI\n", pci_mem, memtop - 1); | 247 | "region %08lx-%08lx for PCI\n", pci_mem, memtop - 1); |
247 | } | 248 | } |
diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c index beff6297f788..74c346625658 100644 --- a/arch/alpha/kernel/setup.c +++ b/arch/alpha/kernel/setup.c | |||
@@ -428,7 +428,8 @@ setup_memory(void *kernel_end) | |||
428 | } | 428 | } |
429 | 429 | ||
430 | /* Reserve the bootmap memory. */ | 430 | /* Reserve the bootmap memory. */ |
431 | reserve_bootmem(PFN_PHYS(bootmap_start), bootmap_size); | 431 | reserve_bootmem(PFN_PHYS(bootmap_start), bootmap_size, |
432 | BOOTMEM_DEFAULT); | ||
432 | printk("reserving pages %ld:%ld\n", bootmap_start, bootmap_start+PFN_UP(bootmap_size)); | 433 | printk("reserving pages %ld:%ld\n", bootmap_start, bootmap_start+PFN_UP(bootmap_size)); |
433 | 434 | ||
434 | #ifdef CONFIG_BLK_DEV_INITRD | 435 | #ifdef CONFIG_BLK_DEV_INITRD |
@@ -446,7 +447,7 @@ setup_memory(void *kernel_end) | |||
446 | phys_to_virt(PFN_PHYS(max_low_pfn))); | 447 | phys_to_virt(PFN_PHYS(max_low_pfn))); |
447 | } else { | 448 | } else { |
448 | reserve_bootmem(virt_to_phys((void *)initrd_start), | 449 | reserve_bootmem(virt_to_phys((void *)initrd_start), |
449 | INITRD_SIZE); | 450 | INITRD_SIZE, BOOTMEM_DEFAULT); |
450 | } | 451 | } |
451 | } | 452 | } |
452 | #endif /* CONFIG_BLK_DEV_INITRD */ | 453 | #endif /* CONFIG_BLK_DEV_INITRD */ |
diff --git a/arch/alpha/mm/numa.c b/arch/alpha/mm/numa.c index e3e3806a6f25..10ab7833e83c 100644 --- a/arch/alpha/mm/numa.c +++ b/arch/alpha/mm/numa.c | |||
@@ -242,7 +242,8 @@ setup_memory_node(int nid, void *kernel_end) | |||
242 | } | 242 | } |
243 | 243 | ||
244 | /* Reserve the bootmap memory. */ | 244 | /* Reserve the bootmap memory. */ |
245 | reserve_bootmem_node(NODE_DATA(nid), PFN_PHYS(bootmap_start), bootmap_size); | 245 | reserve_bootmem_node(NODE_DATA(nid), PFN_PHYS(bootmap_start), |
246 | bootmap_size, BOOTMEM_DEFAULT); | ||
246 | printk(" reserving pages %ld:%ld\n", bootmap_start, bootmap_start+PFN_UP(bootmap_size)); | 247 | printk(" reserving pages %ld:%ld\n", bootmap_start, bootmap_start+PFN_UP(bootmap_size)); |
247 | 248 | ||
248 | node_set_online(nid); | 249 | node_set_online(nid); |
@@ -281,7 +282,7 @@ setup_memory(void *kernel_end) | |||
281 | nid = kvaddr_to_nid(initrd_start); | 282 | nid = kvaddr_to_nid(initrd_start); |
282 | reserve_bootmem_node(NODE_DATA(nid), | 283 | reserve_bootmem_node(NODE_DATA(nid), |
283 | virt_to_phys((void *)initrd_start), | 284 | virt_to_phys((void *)initrd_start), |
284 | INITRD_SIZE); | 285 | INITRD_SIZE, BOOTMEM_DEFAULT); |
285 | } | 286 | } |
286 | } | 287 | } |
287 | #endif /* CONFIG_BLK_DEV_INITRD */ | 288 | #endif /* CONFIG_BLK_DEV_INITRD */ |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index c0ad7c0fbae0..ec00f26bffa4 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -239,7 +239,7 @@ bootmem_init_node(int node, int initrd_node, struct meminfo *mi) | |||
239 | * Reserve the bootmem bitmap for this node. | 239 | * Reserve the bootmem bitmap for this node. |
240 | */ | 240 | */ |
241 | reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT, | 241 | reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT, |
242 | boot_pages << PAGE_SHIFT); | 242 | boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT); |
243 | 243 | ||
244 | #ifdef CONFIG_BLK_DEV_INITRD | 244 | #ifdef CONFIG_BLK_DEV_INITRD |
245 | /* | 245 | /* |
@@ -247,7 +247,7 @@ bootmem_init_node(int node, int initrd_node, struct meminfo *mi) | |||
247 | */ | 247 | */ |
248 | if (node == initrd_node) { | 248 | if (node == initrd_node) { |
249 | reserve_bootmem_node(pgdat, phys_initrd_start, | 249 | reserve_bootmem_node(pgdat, phys_initrd_start, |
250 | phys_initrd_size); | 250 | phys_initrd_size, BOOTMEM_DEFAULT); |
251 | initrd_start = __phys_to_virt(phys_initrd_start); | 251 | initrd_start = __phys_to_virt(phys_initrd_start); |
252 | initrd_end = initrd_start + phys_initrd_size; | 252 | initrd_end = initrd_start + phys_initrd_size; |
253 | } | 253 | } |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index e5d61ee3d4a1..d41a75ed3dce 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -605,9 +605,11 @@ void __init reserve_node_zero(pg_data_t *pgdat) | |||
605 | * Note that this can only be in node 0. | 605 | * Note that this can only be in node 0. |
606 | */ | 606 | */ |
607 | #ifdef CONFIG_XIP_KERNEL | 607 | #ifdef CONFIG_XIP_KERNEL |
608 | reserve_bootmem_node(pgdat, __pa(&__data_start), &_end - &__data_start); | 608 | reserve_bootmem_node(pgdat, __pa(&__data_start), &_end - &__data_start, |
609 | BOOTMEM_DEFAULT); | ||
609 | #else | 610 | #else |
610 | reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext); | 611 | reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext, |
612 | BOOTMEM_DEFAULT); | ||
611 | #endif | 613 | #endif |
612 | 614 | ||
613 | /* | 615 | /* |
@@ -615,7 +617,7 @@ void __init reserve_node_zero(pg_data_t *pgdat) | |||
615 | * and can only be in node 0. | 617 | * and can only be in node 0. |
616 | */ | 618 | */ |
617 | reserve_bootmem_node(pgdat, __pa(swapper_pg_dir), | 619 | reserve_bootmem_node(pgdat, __pa(swapper_pg_dir), |
618 | PTRS_PER_PGD * sizeof(pgd_t)); | 620 | PTRS_PER_PGD * sizeof(pgd_t), BOOTMEM_DEFAULT); |
619 | 621 | ||
620 | /* | 622 | /* |
621 | * Hmm... This should go elsewhere, but we really really need to | 623 | * Hmm... This should go elsewhere, but we really really need to |
@@ -638,8 +640,10 @@ void __init reserve_node_zero(pg_data_t *pgdat) | |||
638 | /* H1940 and RX3715 need to reserve this for suspend */ | 640 | /* H1940 and RX3715 need to reserve this for suspend */ |
639 | 641 | ||
640 | if (machine_is_h1940() || machine_is_rx3715()) { | 642 | if (machine_is_h1940() || machine_is_rx3715()) { |
641 | reserve_bootmem_node(pgdat, 0x30003000, 0x1000); | 643 | reserve_bootmem_node(pgdat, 0x30003000, 0x1000, |
642 | reserve_bootmem_node(pgdat, 0x30081000, 0x1000); | 644 | BOOTMEM_DEFAULT); |
645 | reserve_bootmem_node(pgdat, 0x30081000, 0x1000, | ||
646 | BOOTMEM_DEFAULT); | ||
643 | } | 647 | } |
644 | 648 | ||
645 | #ifdef CONFIG_SA1111 | 649 | #ifdef CONFIG_SA1111 |
@@ -650,7 +654,8 @@ void __init reserve_node_zero(pg_data_t *pgdat) | |||
650 | res_size = __pa(swapper_pg_dir) - PHYS_OFFSET; | 654 | res_size = __pa(swapper_pg_dir) - PHYS_OFFSET; |
651 | #endif | 655 | #endif |
652 | if (res_size) | 656 | if (res_size) |
653 | reserve_bootmem_node(pgdat, PHYS_OFFSET, res_size); | 657 | reserve_bootmem_node(pgdat, PHYS_OFFSET, res_size, |
658 | BOOTMEM_DEFAULT); | ||
654 | } | 659 | } |
655 | 660 | ||
656 | /* | 661 | /* |
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index 8cd3a60954f0..63c62fdea521 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c | |||
@@ -27,9 +27,11 @@ void __init reserve_node_zero(pg_data_t *pgdat) | |||
27 | * Note that this can only be in node 0. | 27 | * Note that this can only be in node 0. |
28 | */ | 28 | */ |
29 | #ifdef CONFIG_XIP_KERNEL | 29 | #ifdef CONFIG_XIP_KERNEL |
30 | reserve_bootmem_node(pgdat, __pa(&__data_start), &_end - &__data_start); | 30 | reserve_bootmem_node(pgdat, __pa(&__data_start), &_end - &__data_start, |
31 | BOOTMEM_DEFAULT); | ||
31 | #else | 32 | #else |
32 | reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext); | 33 | reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext, |
34 | BOOTMEM_DEFAULT); | ||
33 | #endif | 35 | #endif |
34 | 36 | ||
35 | /* | 37 | /* |
@@ -37,7 +39,8 @@ void __init reserve_node_zero(pg_data_t *pgdat) | |||
37 | * some architectures which the DRAM is the exception vector to trap, | 39 | * some architectures which the DRAM is the exception vector to trap, |
38 | * alloc_page breaks with error, although it is not NULL, but "0." | 40 | * alloc_page breaks with error, although it is not NULL, but "0." |
39 | */ | 41 | */ |
40 | reserve_bootmem_node(pgdat, CONFIG_VECTORS_BASE, PAGE_SIZE); | 42 | reserve_bootmem_node(pgdat, CONFIG_VECTORS_BASE, PAGE_SIZE, |
43 | BOOTMEM_DEFAULT); | ||
41 | } | 44 | } |
42 | 45 | ||
43 | /* | 46 | /* |
diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c index ee40c1a0b83d..7854f19b77cf 100644 --- a/arch/arm/plat-omap/fb.c +++ b/arch/arm/plat-omap/fb.c | |||
@@ -207,7 +207,7 @@ void __init omapfb_reserve_sdram(void) | |||
207 | return; | 207 | return; |
208 | } | 208 | } |
209 | if (rg.paddr) | 209 | if (rg.paddr) |
210 | reserve_bootmem(rg.paddr, rg.size); | 210 | reserve_bootmem(rg.paddr, rg.size, BOOTMEM_DEFAULT); |
211 | reserved += rg.size; | 211 | reserved += rg.size; |
212 | omapfb_config.mem_desc.region[i] = rg; | 212 | omapfb_config.mem_desc.region[i] = rg; |
213 | configured_regions++; | 213 | configured_regions++; |
diff --git a/arch/avr32/kernel/setup.c b/arch/avr32/kernel/setup.c index 4b4c1884e1c5..e66a07a928cd 100644 --- a/arch/avr32/kernel/setup.c +++ b/arch/avr32/kernel/setup.c | |||
@@ -489,7 +489,8 @@ static void __init setup_bootmem(void) | |||
489 | /* Reserve space for the bootmem bitmap... */ | 489 | /* Reserve space for the bootmem bitmap... */ |
490 | reserve_bootmem_node(NODE_DATA(node), | 490 | reserve_bootmem_node(NODE_DATA(node), |
491 | PFN_PHYS(bootmap_pfn), | 491 | PFN_PHYS(bootmap_pfn), |
492 | bootmap_size); | 492 | bootmap_size, |
493 | BOOTMEM_DEFAULT); | ||
493 | 494 | ||
494 | /* ...and any other reserved regions. */ | 495 | /* ...and any other reserved regions. */ |
495 | for (res = reserved; res; res = res->sibling) { | 496 | for (res = reserved; res; res = res->sibling) { |
@@ -505,7 +506,8 @@ static void __init setup_bootmem(void) | |||
505 | && res->end < PFN_PHYS(max_pfn)) | 506 | && res->end < PFN_PHYS(max_pfn)) |
506 | reserve_bootmem_node( | 507 | reserve_bootmem_node( |
507 | NODE_DATA(node), res->start, | 508 | NODE_DATA(node), res->start, |
508 | res->end - res->start + 1); | 509 | res->end - res->start + 1, |
510 | BOOTMEM_DEFAULT); | ||
509 | } | 511 | } |
510 | 512 | ||
511 | node_set_online(node); | 513 | node_set_online(node); |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 462cae893757..6e106b3d7729 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
@@ -406,7 +406,7 @@ void __init setup_arch(char **cmdline_p) | |||
406 | */ | 406 | */ |
407 | free_bootmem(memory_start, memory_end - memory_start); | 407 | free_bootmem(memory_start, memory_end - memory_start); |
408 | 408 | ||
409 | reserve_bootmem(memory_start, bootmap_size); | 409 | reserve_bootmem(memory_start, bootmap_size, BOOTMEM_DEFAULT); |
410 | /* | 410 | /* |
411 | * get kmalloc into gear | 411 | * get kmalloc into gear |
412 | */ | 412 | */ |
diff --git a/arch/cris/kernel/setup.c b/arch/cris/kernel/setup.c index 65466c49d7a9..4da042e100a0 100644 --- a/arch/cris/kernel/setup.c +++ b/arch/cris/kernel/setup.c | |||
@@ -137,7 +137,7 @@ setup_arch(char **cmdline_p) | |||
137 | * Arguments are start, size | 137 | * Arguments are start, size |
138 | */ | 138 | */ |
139 | 139 | ||
140 | reserve_bootmem(PFN_PHYS(start_pfn), bootmap_size); | 140 | reserve_bootmem(PFN_PHYS(start_pfn), bootmap_size, BOOTMEM_DEFAULT); |
141 | 141 | ||
142 | /* paging_init() sets up the MMU and marks all pages as reserved */ | 142 | /* paging_init() sets up the MMU and marks all pages as reserved */ |
143 | 143 | ||
diff --git a/arch/frv/kernel/setup.c b/arch/frv/kernel/setup.c index b38ae1fc15fd..6c01464db699 100644 --- a/arch/frv/kernel/setup.c +++ b/arch/frv/kernel/setup.c | |||
@@ -925,13 +925,15 @@ static void __init setup_linux_memory(void) | |||
925 | #endif | 925 | #endif |
926 | 926 | ||
927 | /* take back the memory occupied by the kernel image and the bootmem alloc map */ | 927 | /* take back the memory occupied by the kernel image and the bootmem alloc map */ |
928 | reserve_bootmem(kstart, kend - kstart + bootmap_size); | 928 | reserve_bootmem(kstart, kend - kstart + bootmap_size, |
929 | BOOTMEM_DEFAULT); | ||
929 | 930 | ||
930 | /* reserve the memory occupied by the initial ramdisk */ | 931 | /* reserve the memory occupied by the initial ramdisk */ |
931 | #ifdef CONFIG_BLK_DEV_INITRD | 932 | #ifdef CONFIG_BLK_DEV_INITRD |
932 | if (LOADER_TYPE && INITRD_START) { | 933 | if (LOADER_TYPE && INITRD_START) { |
933 | if (INITRD_START + INITRD_SIZE <= (low_top_pfn << PAGE_SHIFT)) { | 934 | if (INITRD_START + INITRD_SIZE <= (low_top_pfn << PAGE_SHIFT)) { |
934 | reserve_bootmem(INITRD_START, INITRD_SIZE); | 935 | reserve_bootmem(INITRD_START, INITRD_SIZE, |
936 | BOOTMEM_DEFAULT); | ||
935 | initrd_start = INITRD_START + PAGE_OFFSET; | 937 | initrd_start = INITRD_START + PAGE_OFFSET; |
936 | initrd_end = initrd_start + INITRD_SIZE; | 938 | initrd_end = initrd_start + INITRD_SIZE; |
937 | } | 939 | } |
@@ -986,9 +988,10 @@ static void __init setup_uclinux_memory(void) | |||
986 | 988 | ||
987 | /* now take back the bits the core kernel is occupying */ | 989 | /* now take back the bits the core kernel is occupying */ |
988 | #ifndef CONFIG_PROTECT_KERNEL | 990 | #ifndef CONFIG_PROTECT_KERNEL |
989 | reserve_bootmem(kend, bootmap_size); | 991 | reserve_bootmem(kend, bootmap_size, BOOTMEM_DEFAULT); |
990 | reserve_bootmem((unsigned long) &__kernel_image_start, | 992 | reserve_bootmem((unsigned long) &__kernel_image_start, |
991 | kend - (unsigned long) &__kernel_image_start); | 993 | kend - (unsigned long) &__kernel_image_start, |
994 | BOOTMEM_DEFAULT); | ||
992 | 995 | ||
993 | #else | 996 | #else |
994 | dampr = __get_DAMPR(0); | 997 | dampr = __get_DAMPR(0); |
@@ -996,14 +999,15 @@ static void __init setup_uclinux_memory(void) | |||
996 | dampr = (dampr >> 4) + 17; | 999 | dampr = (dampr >> 4) + 17; |
997 | dampr = 1 << dampr; | 1000 | dampr = 1 << dampr; |
998 | 1001 | ||
999 | reserve_bootmem(__get_DAMPR(0) & xAMPRx_PPFN, dampr); | 1002 | reserve_bootmem(__get_DAMPR(0) & xAMPRx_PPFN, dampr, BOOTMEM_DEFAULT); |
1000 | #endif | 1003 | #endif |
1001 | 1004 | ||
1002 | /* reserve some memory to do uncached DMA through if requested */ | 1005 | /* reserve some memory to do uncached DMA through if requested */ |
1003 | #ifdef CONFIG_RESERVE_DMA_COHERENT | 1006 | #ifdef CONFIG_RESERVE_DMA_COHERENT |
1004 | if (dma_coherent_mem_start) | 1007 | if (dma_coherent_mem_start) |
1005 | reserve_bootmem(dma_coherent_mem_start, | 1008 | reserve_bootmem(dma_coherent_mem_start, |
1006 | dma_coherent_mem_end - dma_coherent_mem_start); | 1009 | dma_coherent_mem_end - dma_coherent_mem_start, |
1010 | BOOTMEM_DEFAULT); | ||
1007 | #endif | 1011 | #endif |
1008 | 1012 | ||
1009 | } /* end setup_uclinux_memory() */ | 1013 | } /* end setup_uclinux_memory() */ |
diff --git a/arch/h8300/kernel/setup.c b/arch/h8300/kernel/setup.c index b2e86d0255e6..cd3734614d9d 100644 --- a/arch/h8300/kernel/setup.c +++ b/arch/h8300/kernel/setup.c | |||
@@ -173,7 +173,7 @@ void __init setup_arch(char **cmdline_p) | |||
173 | * the bootmem bitmap so we then reserve it after freeing it :-) | 173 | * the bootmem bitmap so we then reserve it after freeing it :-) |
174 | */ | 174 | */ |
175 | free_bootmem(memory_start, memory_end - memory_start); | 175 | free_bootmem(memory_start, memory_end - memory_start); |
176 | reserve_bootmem(memory_start, bootmap_size); | 176 | reserve_bootmem(memory_start, bootmap_size, BOOTMEM_DEFAULT); |
177 | /* | 177 | /* |
178 | * get kmalloc into gear | 178 | * get kmalloc into gear |
179 | */ | 179 | */ |
diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c index 7e9c275ea148..344f64eca7a9 100644 --- a/arch/ia64/mm/contig.c +++ b/arch/ia64/mm/contig.c | |||
@@ -218,7 +218,7 @@ find_memory (void) | |||
218 | 218 | ||
219 | /* Free all available memory, then mark bootmem-map as being in use. */ | 219 | /* Free all available memory, then mark bootmem-map as being in use. */ |
220 | efi_memmap_walk(filter_rsvd_memory, free_bootmem); | 220 | efi_memmap_walk(filter_rsvd_memory, free_bootmem); |
221 | reserve_bootmem(bootmap_start, bootmap_size); | 221 | reserve_bootmem(bootmap_start, bootmap_size, BOOTMEM_DEFAULT); |
222 | 222 | ||
223 | find_initrd(); | 223 | find_initrd(); |
224 | 224 | ||
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 0b567398f38e..ee5e68b2af94 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
@@ -299,12 +299,12 @@ static void __init reserve_pernode_space(void) | |||
299 | pages = bdp->node_low_pfn - (bdp->node_boot_start>>PAGE_SHIFT); | 299 | pages = bdp->node_low_pfn - (bdp->node_boot_start>>PAGE_SHIFT); |
300 | size = bootmem_bootmap_pages(pages) << PAGE_SHIFT; | 300 | size = bootmem_bootmap_pages(pages) << PAGE_SHIFT; |
301 | base = __pa(bdp->node_bootmem_map); | 301 | base = __pa(bdp->node_bootmem_map); |
302 | reserve_bootmem_node(pdp, base, size); | 302 | reserve_bootmem_node(pdp, base, size, BOOTMEM_DEFAULT); |
303 | 303 | ||
304 | /* Now the per-node space */ | 304 | /* Now the per-node space */ |
305 | size = mem_data[node].pernode_size; | 305 | size = mem_data[node].pernode_size; |
306 | base = __pa(mem_data[node].pernode_addr); | 306 | base = __pa(mem_data[node].pernode_addr); |
307 | reserve_bootmem_node(pdp, base, size); | 307 | reserve_bootmem_node(pdp, base, size, BOOTMEM_DEFAULT); |
308 | } | 308 | } |
309 | } | 309 | } |
310 | 310 | ||
diff --git a/arch/m32r/kernel/setup.c b/arch/m32r/kernel/setup.c index d64814385d70..f1f5db0c4084 100644 --- a/arch/m32r/kernel/setup.c +++ b/arch/m32r/kernel/setup.c | |||
@@ -177,25 +177,28 @@ static unsigned long __init setup_memory(void) | |||
177 | */ | 177 | */ |
178 | reserve_bootmem(CONFIG_MEMORY_START + PAGE_SIZE, | 178 | reserve_bootmem(CONFIG_MEMORY_START + PAGE_SIZE, |
179 | (PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE - 1) | 179 | (PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE - 1) |
180 | - CONFIG_MEMORY_START); | 180 | - CONFIG_MEMORY_START, |
181 | BOOTMEM_DEFAULT); | ||
181 | 182 | ||
182 | /* | 183 | /* |
183 | * reserve physical page 0 - it's a special BIOS page on many boxes, | 184 | * reserve physical page 0 - it's a special BIOS page on many boxes, |
184 | * enabling clean reboots, SMP operation, laptop functions. | 185 | * enabling clean reboots, SMP operation, laptop functions. |
185 | */ | 186 | */ |
186 | reserve_bootmem(CONFIG_MEMORY_START, PAGE_SIZE); | 187 | reserve_bootmem(CONFIG_MEMORY_START, PAGE_SIZE, BOOTMEM_DEFAULT); |
187 | 188 | ||
188 | /* | 189 | /* |
189 | * reserve memory hole | 190 | * reserve memory hole |
190 | */ | 191 | */ |
191 | #ifdef CONFIG_MEMHOLE | 192 | #ifdef CONFIG_MEMHOLE |
192 | reserve_bootmem(CONFIG_MEMHOLE_START, CONFIG_MEMHOLE_SIZE); | 193 | reserve_bootmem(CONFIG_MEMHOLE_START, CONFIG_MEMHOLE_SIZE, |
194 | BOOTMEM_DEFAULT); | ||
193 | #endif | 195 | #endif |
194 | 196 | ||
195 | #ifdef CONFIG_BLK_DEV_INITRD | 197 | #ifdef CONFIG_BLK_DEV_INITRD |
196 | if (LOADER_TYPE && INITRD_START) { | 198 | if (LOADER_TYPE && INITRD_START) { |
197 | if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) { | 199 | if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) { |
198 | reserve_bootmem(INITRD_START, INITRD_SIZE); | 200 | reserve_bootmem(INITRD_START, INITRD_SIZE, |
201 | BOOTMEM_DEFAULT); | ||
199 | initrd_start = INITRD_START + PAGE_OFFSET; | 202 | initrd_start = INITRD_START + PAGE_OFFSET; |
200 | initrd_end = initrd_start + INITRD_SIZE; | 203 | initrd_end = initrd_start + INITRD_SIZE; |
201 | printk("initrd:start[%08lx],size[%08lx]\n", | 204 | printk("initrd:start[%08lx],size[%08lx]\n", |
diff --git a/arch/m32r/mm/discontig.c b/arch/m32r/mm/discontig.c index c7efdb0aefc5..07c1af7dc0e2 100644 --- a/arch/m32r/mm/discontig.c +++ b/arch/m32r/mm/discontig.c | |||
@@ -91,7 +91,8 @@ unsigned long __init setup_memory(void) | |||
91 | PFN_PHYS(mp->pages)); | 91 | PFN_PHYS(mp->pages)); |
92 | 92 | ||
93 | reserve_bootmem_node(NODE_DATA(nid), PFN_PHYS(mp->start_pfn), | 93 | reserve_bootmem_node(NODE_DATA(nid), PFN_PHYS(mp->start_pfn), |
94 | PFN_PHYS(mp->free_pfn - mp->start_pfn) + bootmap_size); | 94 | PFN_PHYS(mp->free_pfn - mp->start_pfn) + bootmap_size, |
95 | BOOTMEM_DEFAULT); | ||
95 | 96 | ||
96 | if (max_low_pfn < max_pfn) | 97 | if (max_low_pfn < max_pfn) |
97 | max_low_pfn = max_pfn; | 98 | max_low_pfn = max_pfn; |
@@ -104,7 +105,7 @@ unsigned long __init setup_memory(void) | |||
104 | if (LOADER_TYPE && INITRD_START) { | 105 | if (LOADER_TYPE && INITRD_START) { |
105 | if (INITRD_START + INITRD_SIZE <= PFN_PHYS(max_low_pfn)) { | 106 | if (INITRD_START + INITRD_SIZE <= PFN_PHYS(max_low_pfn)) { |
106 | reserve_bootmem_node(NODE_DATA(0), INITRD_START, | 107 | reserve_bootmem_node(NODE_DATA(0), INITRD_START, |
107 | INITRD_SIZE); | 108 | INITRD_SIZE, BOOTMEM_DEFAULT); |
108 | initrd_start = INITRD_START + PAGE_OFFSET; | 109 | initrd_start = INITRD_START + PAGE_OFFSET; |
109 | initrd_end = initrd_start + INITRD_SIZE; | 110 | initrd_end = initrd_start + INITRD_SIZE; |
110 | printk("initrd:start[%08lx],size[%08lx]\n", | 111 | printk("initrd:start[%08lx],size[%08lx]\n", |
diff --git a/arch/m68k/atari/stram.c b/arch/m68k/atari/stram.c index 8dda6515887a..0055a6c06f75 100644 --- a/arch/m68k/atari/stram.c +++ b/arch/m68k/atari/stram.c | |||
@@ -154,7 +154,7 @@ void __init atari_stram_reserve_pages(void *start_mem) | |||
154 | /* always reserve first page of ST-RAM, the first 2 kB are | 154 | /* always reserve first page of ST-RAM, the first 2 kB are |
155 | * supervisor-only! */ | 155 | * supervisor-only! */ |
156 | if (!kernel_in_stram) | 156 | if (!kernel_in_stram) |
157 | reserve_bootmem (0, PAGE_SIZE); | 157 | reserve_bootmem(0, PAGE_SIZE, BOOTMEM_DEFAULT); |
158 | 158 | ||
159 | } | 159 | } |
160 | 160 | ||
diff --git a/arch/m68k/kernel/setup.c b/arch/m68k/kernel/setup.c index ed3a4caec620..9a06c48edcb3 100644 --- a/arch/m68k/kernel/setup.c +++ b/arch/m68k/kernel/setup.c | |||
@@ -323,7 +323,8 @@ void __init setup_arch(char **cmdline_p) | |||
323 | #ifdef CONFIG_BLK_DEV_INITRD | 323 | #ifdef CONFIG_BLK_DEV_INITRD |
324 | if (m68k_ramdisk.size) { | 324 | if (m68k_ramdisk.size) { |
325 | reserve_bootmem_node(__virt_to_node(phys_to_virt(m68k_ramdisk.addr)), | 325 | reserve_bootmem_node(__virt_to_node(phys_to_virt(m68k_ramdisk.addr)), |
326 | m68k_ramdisk.addr, m68k_ramdisk.size); | 326 | m68k_ramdisk.addr, m68k_ramdisk.size, |
327 | BOOTMEM_DEFAULT); | ||
327 | initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr); | 328 | initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr); |
328 | initrd_end = initrd_start + m68k_ramdisk.size; | 329 | initrd_end = initrd_start + m68k_ramdisk.size; |
329 | printk("initrd: %08lx - %08lx\n", initrd_start, initrd_end); | 330 | printk("initrd: %08lx - %08lx\n", initrd_start, initrd_end); |
diff --git a/arch/m68knommu/kernel/setup.c b/arch/m68knommu/kernel/setup.c index 81507c53d4a9..156c6c662c7e 100644 --- a/arch/m68knommu/kernel/setup.c +++ b/arch/m68knommu/kernel/setup.c | |||
@@ -203,7 +203,7 @@ void __init setup_arch(char **cmdline_p) | |||
203 | * the bootmem bitmap so we then reserve it after freeing it :-) | 203 | * the bootmem bitmap so we then reserve it after freeing it :-) |
204 | */ | 204 | */ |
205 | free_bootmem(memory_start, memory_end - memory_start); | 205 | free_bootmem(memory_start, memory_end - memory_start); |
206 | reserve_bootmem(memory_start, bootmap_size); | 206 | reserve_bootmem(memory_start, bootmap_size, BOOTMEM_DEFAULT); |
207 | 207 | ||
208 | /* | 208 | /* |
209 | * Get kmalloc into gear. | 209 | * Get kmalloc into gear. |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index c032409cba9b..39f3dfe134fb 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -232,7 +232,7 @@ static void __init finalize_initrd(void) | |||
232 | goto disable; | 232 | goto disable; |
233 | } | 233 | } |
234 | 234 | ||
235 | reserve_bootmem(__pa(initrd_start), size); | 235 | reserve_bootmem(__pa(initrd_start), size, BOOTMEM_DEFAULT); |
236 | initrd_below_start_ok = 1; | 236 | initrd_below_start_ok = 1; |
237 | 237 | ||
238 | printk(KERN_INFO "Initial ramdisk at: 0x%lx (%lu bytes)\n", | 238 | printk(KERN_INFO "Initial ramdisk at: 0x%lx (%lu bytes)\n", |
@@ -413,7 +413,7 @@ static void __init bootmem_init(void) | |||
413 | /* | 413 | /* |
414 | * Reserve the bootmap memory. | 414 | * Reserve the bootmap memory. |
415 | */ | 415 | */ |
416 | reserve_bootmem(PFN_PHYS(mapstart), bootmap_size); | 416 | reserve_bootmem(PFN_PHYS(mapstart), bootmap_size, BOOTMEM_DEFAULT); |
417 | 417 | ||
418 | /* | 418 | /* |
419 | * Reserve initrd memory if needed. | 419 | * Reserve initrd memory if needed. |
diff --git a/arch/mips/sgi-ip27/ip27-memory.c b/arch/mips/sgi-ip27/ip27-memory.c index e5e023f50a07..bf438d02366e 100644 --- a/arch/mips/sgi-ip27/ip27-memory.c +++ b/arch/mips/sgi-ip27/ip27-memory.c | |||
@@ -465,7 +465,8 @@ static void __init node_mem_init(cnodeid_t node) | |||
465 | free_bootmem_node(NODE_DATA(node), slot_firstpfn << PAGE_SHIFT, | 465 | free_bootmem_node(NODE_DATA(node), slot_firstpfn << PAGE_SHIFT, |
466 | (slot_lastpfn - slot_firstpfn) << PAGE_SHIFT); | 466 | (slot_lastpfn - slot_firstpfn) << PAGE_SHIFT); |
467 | reserve_bootmem_node(NODE_DATA(node), slot_firstpfn << PAGE_SHIFT, | 467 | reserve_bootmem_node(NODE_DATA(node), slot_firstpfn << PAGE_SHIFT, |
468 | ((slot_freepfn - slot_firstpfn) << PAGE_SHIFT) + bootmap_size); | 468 | ((slot_freepfn - slot_firstpfn) << PAGE_SHIFT) + bootmap_size, |
469 | BOOTMEM_DEFAULT); | ||
469 | } | 470 | } |
470 | 471 | ||
471 | /* | 472 | /* |
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index aa875fa43488..eb80f5e33d7d 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
@@ -315,11 +315,13 @@ static void __init setup_bootmem(void) | |||
315 | #define PDC_CONSOLE_IO_IODC_SIZE 32768 | 315 | #define PDC_CONSOLE_IO_IODC_SIZE 32768 |
316 | 316 | ||
317 | reserve_bootmem_node(NODE_DATA(0), 0UL, | 317 | reserve_bootmem_node(NODE_DATA(0), 0UL, |
318 | (unsigned long)(PAGE0->mem_free + PDC_CONSOLE_IO_IODC_SIZE)); | 318 | (unsigned long)(PAGE0->mem_free + |
319 | PDC_CONSOLE_IO_IODC_SIZE), BOOTMEM_DEFAULT); | ||
319 | reserve_bootmem_node(NODE_DATA(0), __pa((unsigned long)_text), | 320 | reserve_bootmem_node(NODE_DATA(0), __pa((unsigned long)_text), |
320 | (unsigned long)(_end - _text)); | 321 | (unsigned long)(_end - _text), BOOTMEM_DEFAULT); |
321 | reserve_bootmem_node(NODE_DATA(0), (bootmap_start_pfn << PAGE_SHIFT), | 322 | reserve_bootmem_node(NODE_DATA(0), (bootmap_start_pfn << PAGE_SHIFT), |
322 | ((bootmap_pfn - bootmap_start_pfn) << PAGE_SHIFT)); | 323 | ((bootmap_pfn - bootmap_start_pfn) << PAGE_SHIFT), |
324 | BOOTMEM_DEFAULT); | ||
323 | 325 | ||
324 | #ifndef CONFIG_DISCONTIGMEM | 326 | #ifndef CONFIG_DISCONTIGMEM |
325 | 327 | ||
@@ -328,7 +330,8 @@ static void __init setup_bootmem(void) | |||
328 | for (i = 0; i < npmem_holes; i++) { | 330 | for (i = 0; i < npmem_holes; i++) { |
329 | reserve_bootmem_node(NODE_DATA(0), | 331 | reserve_bootmem_node(NODE_DATA(0), |
330 | (pmem_holes[i].start_pfn << PAGE_SHIFT), | 332 | (pmem_holes[i].start_pfn << PAGE_SHIFT), |
331 | (pmem_holes[i].pages << PAGE_SHIFT)); | 333 | (pmem_holes[i].pages << PAGE_SHIFT), |
334 | BOOTMEM_DEFAULT); | ||
332 | } | 335 | } |
333 | #endif | 336 | #endif |
334 | 337 | ||
@@ -346,7 +349,8 @@ static void __init setup_bootmem(void) | |||
346 | initrd_below_start_ok = 1; | 349 | initrd_below_start_ok = 1; |
347 | printk(KERN_INFO "initrd: reserving %08lx-%08lx (mem_max %08lx)\n", __pa(initrd_start), __pa(initrd_start) + initrd_reserve, mem_max); | 350 | printk(KERN_INFO "initrd: reserving %08lx-%08lx (mem_max %08lx)\n", __pa(initrd_start), __pa(initrd_start) + initrd_reserve, mem_max); |
348 | 351 | ||
349 | reserve_bootmem_node(NODE_DATA(0),__pa(initrd_start), initrd_reserve); | 352 | reserve_bootmem_node(NODE_DATA(0), __pa(initrd_start), |
353 | initrd_reserve, BOOTMEM_DEFAULT); | ||
350 | } | 354 | } |
351 | } | 355 | } |
352 | #endif | 356 | #endif |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index e8122447f019..ff5debf5eedd 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -220,12 +220,13 @@ void __init do_init_bootmem(void) | |||
220 | lmb_size_bytes(&lmb.reserved, i) - 1; | 220 | lmb_size_bytes(&lmb.reserved, i) - 1; |
221 | if (addr < total_lowmem) | 221 | if (addr < total_lowmem) |
222 | reserve_bootmem(lmb.reserved.region[i].base, | 222 | reserve_bootmem(lmb.reserved.region[i].base, |
223 | lmb_size_bytes(&lmb.reserved, i)); | 223 | lmb_size_bytes(&lmb.reserved, i), |
224 | BOOTMEM_DEFAULT); | ||
224 | else if (lmb.reserved.region[i].base < total_lowmem) { | 225 | else if (lmb.reserved.region[i].base < total_lowmem) { |
225 | unsigned long adjusted_size = total_lowmem - | 226 | unsigned long adjusted_size = total_lowmem - |
226 | lmb.reserved.region[i].base; | 227 | lmb.reserved.region[i].base; |
227 | reserve_bootmem(lmb.reserved.region[i].base, | 228 | reserve_bootmem(lmb.reserved.region[i].base, |
228 | adjusted_size); | 229 | adjusted_size, BOOTMEM_DEFAULT); |
229 | } | 230 | } |
230 | } | 231 | } |
231 | #else | 232 | #else |
@@ -234,7 +235,8 @@ void __init do_init_bootmem(void) | |||
234 | /* reserve the sections we're already using */ | 235 | /* reserve the sections we're already using */ |
235 | for (i = 0; i < lmb.reserved.cnt; i++) | 236 | for (i = 0; i < lmb.reserved.cnt; i++) |
236 | reserve_bootmem(lmb.reserved.region[i].base, | 237 | reserve_bootmem(lmb.reserved.region[i].base, |
237 | lmb_size_bytes(&lmb.reserved, i)); | 238 | lmb_size_bytes(&lmb.reserved, i), |
239 | BOOTMEM_DEFAULT); | ||
238 | 240 | ||
239 | #endif | 241 | #endif |
240 | /* XXX need to clip this if using highmem? */ | 242 | /* XXX need to clip this if using highmem? */ |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index c12adc3ddffd..bc60322d2436 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -675,7 +675,7 @@ void __init do_init_bootmem(void) | |||
675 | dbg("reserve_bootmem %lx %lx\n", physbase, | 675 | dbg("reserve_bootmem %lx %lx\n", physbase, |
676 | size); | 676 | size); |
677 | reserve_bootmem_node(NODE_DATA(nid), physbase, | 677 | reserve_bootmem_node(NODE_DATA(nid), physbase, |
678 | size); | 678 | size, BOOTMEM_DEFAULT); |
679 | } | 679 | } |
680 | } | 680 | } |
681 | 681 | ||
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 29ae165d1749..f9f8779022a0 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -649,21 +649,24 @@ setup_memory(void) | |||
649 | /* | 649 | /* |
650 | * Reserve memory used for lowcore/command line/kernel image. | 650 | * Reserve memory used for lowcore/command line/kernel image. |
651 | */ | 651 | */ |
652 | reserve_bootmem(0, (unsigned long)_ehead); | 652 | reserve_bootmem(0, (unsigned long)_ehead, BOOTMEM_DEFAULT); |
653 | reserve_bootmem((unsigned long)_stext, | 653 | reserve_bootmem((unsigned long)_stext, |
654 | PFN_PHYS(start_pfn) - (unsigned long)_stext); | 654 | PFN_PHYS(start_pfn) - (unsigned long)_stext, |
655 | BOOTMEM_DEFAULT); | ||
655 | /* | 656 | /* |
656 | * Reserve the bootmem bitmap itself as well. We do this in two | 657 | * Reserve the bootmem bitmap itself as well. We do this in two |
657 | * steps (first step was init_bootmem()) because this catches | 658 | * steps (first step was init_bootmem()) because this catches |
658 | * the (very unlikely) case of us accidentally initializing the | 659 | * the (very unlikely) case of us accidentally initializing the |
659 | * bootmem allocator with an invalid RAM area. | 660 | * bootmem allocator with an invalid RAM area. |
660 | */ | 661 | */ |
661 | reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size); | 662 | reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size, |
663 | BOOTMEM_DEFAULT); | ||
662 | 664 | ||
663 | #ifdef CONFIG_BLK_DEV_INITRD | 665 | #ifdef CONFIG_BLK_DEV_INITRD |
664 | if (INITRD_START && INITRD_SIZE) { | 666 | if (INITRD_START && INITRD_SIZE) { |
665 | if (INITRD_START + INITRD_SIZE <= memory_end) { | 667 | if (INITRD_START + INITRD_SIZE <= memory_end) { |
666 | reserve_bootmem(INITRD_START, INITRD_SIZE); | 668 | reserve_bootmem(INITRD_START, INITRD_SIZE, |
669 | BOOTMEM_DEFAULT); | ||
667 | initrd_start = INITRD_START; | 670 | initrd_start = INITRD_START; |
668 | initrd_end = initrd_start + INITRD_SIZE; | 671 | initrd_end = initrd_start + INITRD_SIZE; |
669 | } else { | 672 | } else { |
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index 855cdf9d85b1..af10db90a554 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -148,7 +148,8 @@ static void __init reserve_crashkernel(void) | |||
148 | (unsigned long)(free_mem >> 20)); | 148 | (unsigned long)(free_mem >> 20)); |
149 | crashk_res.start = crash_base; | 149 | crashk_res.start = crash_base; |
150 | crashk_res.end = crash_base + crash_size - 1; | 150 | crashk_res.end = crash_base + crash_size - 1; |
151 | reserve_bootmem(crash_base, crash_size); | 151 | reserve_bootmem(crash_base, crash_size, |
152 | BOOTMEM_DEFAULT); | ||
152 | } else | 153 | } else |
153 | printk(KERN_INFO "crashkernel reservation failed - " | 154 | printk(KERN_INFO "crashkernel reservation failed - " |
154 | "you have to specify a base address\n"); | 155 | "you have to specify a base address\n"); |
@@ -184,13 +185,14 @@ void __init setup_bootmem_allocator(unsigned long free_pfn) | |||
184 | * an invalid RAM area. | 185 | * an invalid RAM area. |
185 | */ | 186 | */ |
186 | reserve_bootmem(__MEMORY_START+PAGE_SIZE, | 187 | reserve_bootmem(__MEMORY_START+PAGE_SIZE, |
187 | (PFN_PHYS(free_pfn)+bootmap_size+PAGE_SIZE-1)-__MEMORY_START); | 188 | (PFN_PHYS(free_pfn)+bootmap_size+PAGE_SIZE-1)-__MEMORY_START, |
189 | BOOTMEM_DEFAULT); | ||
188 | 190 | ||
189 | /* | 191 | /* |
190 | * reserve physical page 0 - it's a special BIOS page on many boxes, | 192 | * reserve physical page 0 - it's a special BIOS page on many boxes, |
191 | * enabling clean reboots, SMP operation, laptop functions. | 193 | * enabling clean reboots, SMP operation, laptop functions. |
192 | */ | 194 | */ |
193 | reserve_bootmem(__MEMORY_START, PAGE_SIZE); | 195 | reserve_bootmem(__MEMORY_START, PAGE_SIZE, BOOTMEM_DEFAULT); |
194 | 196 | ||
195 | sparse_memory_present_with_active_regions(0); | 197 | sparse_memory_present_with_active_regions(0); |
196 | 198 | ||
@@ -200,7 +202,7 @@ void __init setup_bootmem_allocator(unsigned long free_pfn) | |||
200 | if (LOADER_TYPE && INITRD_START) { | 202 | if (LOADER_TYPE && INITRD_START) { |
201 | if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) { | 203 | if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) { |
202 | reserve_bootmem(INITRD_START + __MEMORY_START, | 204 | reserve_bootmem(INITRD_START + __MEMORY_START, |
203 | INITRD_SIZE); | 205 | INITRD_SIZE, BOOTMEM_DEFAULT); |
204 | initrd_start = INITRD_START + PAGE_OFFSET + | 206 | initrd_start = INITRD_START + PAGE_OFFSET + |
205 | __MEMORY_START; | 207 | __MEMORY_START; |
206 | initrd_end = initrd_start + INITRD_SIZE; | 208 | initrd_end = initrd_start + INITRD_SIZE; |
diff --git a/arch/sh/mm/numa.c b/arch/sh/mm/numa.c index 8aff065dd307..2de7302724fc 100644 --- a/arch/sh/mm/numa.c +++ b/arch/sh/mm/numa.c | |||
@@ -80,9 +80,9 @@ void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end) | |||
80 | 80 | ||
81 | /* Reserve the pgdat and bootmap space with the bootmem allocator */ | 81 | /* Reserve the pgdat and bootmap space with the bootmem allocator */ |
82 | reserve_bootmem_node(NODE_DATA(nid), start_pfn << PAGE_SHIFT, | 82 | reserve_bootmem_node(NODE_DATA(nid), start_pfn << PAGE_SHIFT, |
83 | sizeof(struct pglist_data)); | 83 | sizeof(struct pglist_data), BOOTMEM_DEFAULT); |
84 | reserve_bootmem_node(NODE_DATA(nid), free_pfn << PAGE_SHIFT, | 84 | reserve_bootmem_node(NODE_DATA(nid), free_pfn << PAGE_SHIFT, |
85 | bootmap_pages << PAGE_SHIFT); | 85 | bootmap_pages << PAGE_SHIFT, BOOTMEM_DEFAULT); |
86 | 86 | ||
87 | /* It's up */ | 87 | /* It's up */ |
88 | node_set_online(nid); | 88 | node_set_online(nid); |
diff --git a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c index a1bef07755a9..b89837accc88 100644 --- a/arch/sparc/mm/init.c +++ b/arch/sparc/mm/init.c | |||
@@ -259,7 +259,7 @@ unsigned long __init bootmem_init(unsigned long *pages_avail) | |||
259 | if (initrd_start) { | 259 | if (initrd_start) { |
260 | /* Reserve the initrd image area. */ | 260 | /* Reserve the initrd image area. */ |
261 | size = initrd_end - initrd_start; | 261 | size = initrd_end - initrd_start; |
262 | reserve_bootmem(initrd_start, size); | 262 | reserve_bootmem(initrd_start, size, BOOTMEM_DEFAULT); |
263 | *pages_avail -= PAGE_ALIGN(size) >> PAGE_SHIFT; | 263 | *pages_avail -= PAGE_ALIGN(size) >> PAGE_SHIFT; |
264 | 264 | ||
265 | initrd_start = (initrd_start - phys_base) + PAGE_OFFSET; | 265 | initrd_start = (initrd_start - phys_base) + PAGE_OFFSET; |
@@ -268,7 +268,7 @@ unsigned long __init bootmem_init(unsigned long *pages_avail) | |||
268 | #endif | 268 | #endif |
269 | /* Reserve the kernel text/data/bss. */ | 269 | /* Reserve the kernel text/data/bss. */ |
270 | size = (start_pfn << PAGE_SHIFT) - phys_base; | 270 | size = (start_pfn << PAGE_SHIFT) - phys_base; |
271 | reserve_bootmem(phys_base, size); | 271 | reserve_bootmem(phys_base, size, BOOTMEM_DEFAULT); |
272 | *pages_avail -= PAGE_ALIGN(size) >> PAGE_SHIFT; | 272 | *pages_avail -= PAGE_ALIGN(size) >> PAGE_SHIFT; |
273 | 273 | ||
274 | /* Reserve the bootmem map. We do not account for it | 274 | /* Reserve the bootmem map. We do not account for it |
@@ -276,7 +276,7 @@ unsigned long __init bootmem_init(unsigned long *pages_avail) | |||
276 | * in free_all_bootmem. | 276 | * in free_all_bootmem. |
277 | */ | 277 | */ |
278 | size = bootmap_size; | 278 | size = bootmap_size; |
279 | reserve_bootmem((bootmap_pfn << PAGE_SHIFT), size); | 279 | reserve_bootmem((bootmap_pfn << PAGE_SHIFT), size, BOOTMEM_DEFAULT); |
280 | *pages_avail -= PAGE_ALIGN(size) >> PAGE_SHIFT; | 280 | *pages_avail -= PAGE_ALIGN(size) >> PAGE_SHIFT; |
281 | 281 | ||
282 | return max_pfn; | 282 | return max_pfn; |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 523e993ee90c..e726c45645ff 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -997,7 +997,7 @@ static unsigned long __init bootmem_init(unsigned long *pages_avail, | |||
997 | prom_printf("reserve_bootmem(initrd): base[%llx] size[%lx]\n", | 997 | prom_printf("reserve_bootmem(initrd): base[%llx] size[%lx]\n", |
998 | initrd_start, initrd_end); | 998 | initrd_start, initrd_end); |
999 | #endif | 999 | #endif |
1000 | reserve_bootmem(initrd_start, size); | 1000 | reserve_bootmem(initrd_start, size, BOOTMEM_DEFAULT); |
1001 | 1001 | ||
1002 | initrd_start += PAGE_OFFSET; | 1002 | initrd_start += PAGE_OFFSET; |
1003 | initrd_end += PAGE_OFFSET; | 1003 | initrd_end += PAGE_OFFSET; |
@@ -1007,7 +1007,7 @@ static unsigned long __init bootmem_init(unsigned long *pages_avail, | |||
1007 | #ifdef CONFIG_DEBUG_BOOTMEM | 1007 | #ifdef CONFIG_DEBUG_BOOTMEM |
1008 | prom_printf("reserve_bootmem(kernel): base[%lx] size[%lx]\n", kern_base, kern_size); | 1008 | prom_printf("reserve_bootmem(kernel): base[%lx] size[%lx]\n", kern_base, kern_size); |
1009 | #endif | 1009 | #endif |
1010 | reserve_bootmem(kern_base, kern_size); | 1010 | reserve_bootmem(kern_base, kern_size, BOOTMEM_DEFAULT); |
1011 | *pages_avail -= PAGE_ALIGN(kern_size) >> PAGE_SHIFT; | 1011 | *pages_avail -= PAGE_ALIGN(kern_size) >> PAGE_SHIFT; |
1012 | 1012 | ||
1013 | /* Add back in the initmem pages. */ | 1013 | /* Add back in the initmem pages. */ |
@@ -1024,7 +1024,7 @@ static unsigned long __init bootmem_init(unsigned long *pages_avail, | |||
1024 | prom_printf("reserve_bootmem(bootmap): base[%lx] size[%lx]\n", | 1024 | prom_printf("reserve_bootmem(bootmap): base[%lx] size[%lx]\n", |
1025 | (bootmap_pfn << PAGE_SHIFT), size); | 1025 | (bootmap_pfn << PAGE_SHIFT), size); |
1026 | #endif | 1026 | #endif |
1027 | reserve_bootmem((bootmap_pfn << PAGE_SHIFT), size); | 1027 | reserve_bootmem((bootmap_pfn << PAGE_SHIFT), size, BOOTMEM_DEFAULT); |
1028 | 1028 | ||
1029 | for (i = 0; i < pavail_ents; i++) { | 1029 | for (i = 0; i < pavail_ents; i++) { |
1030 | unsigned long start_pfn, end_pfn; | 1030 | unsigned long start_pfn, end_pfn; |
@@ -1489,7 +1489,7 @@ static void __init taint_real_pages(void) | |||
1489 | goto do_next_page; | 1489 | goto do_next_page; |
1490 | } | 1490 | } |
1491 | } | 1491 | } |
1492 | reserve_bootmem(old_start, PAGE_SIZE); | 1492 | reserve_bootmem(old_start, PAGE_SIZE, BOOTMEM_DEFAULT); |
1493 | 1493 | ||
1494 | do_next_page: | 1494 | do_next_page: |
1495 | old_start += PAGE_SIZE; | 1495 | old_start += PAGE_SIZE; |
diff --git a/arch/v850/kernel/anna.c b/arch/v850/kernel/anna.c index 0e429041a117..5978a25170fb 100644 --- a/arch/v850/kernel/anna.c +++ b/arch/v850/kernel/anna.c | |||
@@ -85,7 +85,8 @@ void __init mach_reserve_bootmem () | |||
85 | /* The space between SRAM and SDRAM is filled with duplicate | 85 | /* The space between SRAM and SDRAM is filled with duplicate |
86 | images of SRAM. Prevent the kernel from using them. */ | 86 | images of SRAM. Prevent the kernel from using them. */ |
87 | reserve_bootmem (SRAM_ADDR + SRAM_SIZE, | 87 | reserve_bootmem (SRAM_ADDR + SRAM_SIZE, |
88 | SDRAM_ADDR - (SRAM_ADDR + SRAM_SIZE)); | 88 | SDRAM_ADDR - (SRAM_ADDR + SRAM_SIZE), |
89 | BOOTMEM_DEFAULT); | ||
89 | } | 90 | } |
90 | 91 | ||
91 | void mach_gettimeofday (struct timespec *tv) | 92 | void mach_gettimeofday (struct timespec *tv) |
diff --git a/arch/v850/kernel/as85ep1.c b/arch/v850/kernel/as85ep1.c index 18437bc5c3ad..b525ecf3aea4 100644 --- a/arch/v850/kernel/as85ep1.c +++ b/arch/v850/kernel/as85ep1.c | |||
@@ -116,7 +116,8 @@ void __init mach_reserve_bootmem () | |||
116 | if (SDRAM_ADDR < RAM_END && SDRAM_ADDR > RAM_START) | 116 | if (SDRAM_ADDR < RAM_END && SDRAM_ADDR > RAM_START) |
117 | /* We can't use the space between SRAM and SDRAM, so | 117 | /* We can't use the space between SRAM and SDRAM, so |
118 | prevent the kernel from trying. */ | 118 | prevent the kernel from trying. */ |
119 | reserve_bootmem (SRAM_END, SDRAM_ADDR - SRAM_END); | 119 | reserve_bootmem(SRAM_END, SDRAM_ADDR - SRAM_END, |
120 | BOOTMEM_DEFAULT); | ||
120 | } | 121 | } |
121 | 122 | ||
122 | void mach_gettimeofday (struct timespec *tv) | 123 | void mach_gettimeofday (struct timespec *tv) |
diff --git a/arch/v850/kernel/rte_ma1_cb.c b/arch/v850/kernel/rte_ma1_cb.c index 9a716f946421..08abf3d5f8df 100644 --- a/arch/v850/kernel/rte_ma1_cb.c +++ b/arch/v850/kernel/rte_ma1_cb.c | |||
@@ -46,13 +46,15 @@ void __init mach_reserve_bootmem () | |||
46 | { | 46 | { |
47 | #ifdef CONFIG_RTE_CB_MULTI | 47 | #ifdef CONFIG_RTE_CB_MULTI |
48 | /* Prevent the kernel from touching the monitor's scratch RAM. */ | 48 | /* Prevent the kernel from touching the monitor's scratch RAM. */ |
49 | reserve_bootmem (MON_SCRATCH_ADDR, MON_SCRATCH_SIZE); | 49 | reserve_bootmem(MON_SCRATCH_ADDR, MON_SCRATCH_SIZE, |
50 | BOOTMEM_DEFAULT); | ||
50 | #endif | 51 | #endif |
51 | 52 | ||
52 | /* The space between SRAM and SDRAM is filled with duplicate | 53 | /* The space between SRAM and SDRAM is filled with duplicate |
53 | images of SRAM. Prevent the kernel from using them. */ | 54 | images of SRAM. Prevent the kernel from using them. */ |
54 | reserve_bootmem (SRAM_ADDR + SRAM_SIZE, | 55 | reserve_bootmem (SRAM_ADDR + SRAM_SIZE, |
55 | SDRAM_ADDR - (SRAM_ADDR + SRAM_SIZE)); | 56 | SDRAM_ADDR - (SRAM_ADDR + SRAM_SIZE), |
57 | BOOTMEM_DEFAULT); | ||
56 | } | 58 | } |
57 | 59 | ||
58 | void mach_gettimeofday (struct timespec *tv) | 60 | void mach_gettimeofday (struct timespec *tv) |
diff --git a/arch/v850/kernel/setup.c b/arch/v850/kernel/setup.c index a914f244f494..a0a8456a8430 100644 --- a/arch/v850/kernel/setup.c +++ b/arch/v850/kernel/setup.c | |||
@@ -241,15 +241,18 @@ init_bootmem_alloc (unsigned long ram_start, unsigned long ram_len) | |||
241 | if (kram_end > kram_start) | 241 | if (kram_end > kram_start) |
242 | /* Reserve the RAM part of the kernel's address space, so it | 242 | /* Reserve the RAM part of the kernel's address space, so it |
243 | doesn't get allocated. */ | 243 | doesn't get allocated. */ |
244 | reserve_bootmem (kram_start, kram_end - kram_start); | 244 | reserve_bootmem(kram_start, kram_end - kram_start, |
245 | BOOTMEM_DEFAULT); | ||
245 | 246 | ||
246 | if (intv_in_ram && !intv_in_kram) | 247 | if (intv_in_ram && !intv_in_kram) |
247 | /* Reserve the interrupt vector space. */ | 248 | /* Reserve the interrupt vector space. */ |
248 | reserve_bootmem (intv_start, intv_end - intv_start); | 249 | reserve_bootmem(intv_start, intv_end - intv_start, |
250 | BOOTMEM_DEFAULT); | ||
249 | 251 | ||
250 | if (bootmap >= ram_start && bootmap < ram_end) | 252 | if (bootmap >= ram_start && bootmap < ram_end) |
251 | /* Reserve the bootmap space. */ | 253 | /* Reserve the bootmap space. */ |
252 | reserve_bootmem (bootmap, bootmap_len); | 254 | reserve_bootmem(bootmap, bootmap_len, |
255 | BOOTMEM_DEFAULT); | ||
253 | 256 | ||
254 | /* Reserve the memory used by the root filesystem image if it's | 257 | /* Reserve the memory used by the root filesystem image if it's |
255 | in RAM. */ | 258 | in RAM. */ |
@@ -257,7 +260,8 @@ init_bootmem_alloc (unsigned long ram_start, unsigned long ram_len) | |||
257 | && (unsigned long)&_root_fs_image_start >= ram_start | 260 | && (unsigned long)&_root_fs_image_start >= ram_start |
258 | && (unsigned long)&_root_fs_image_start < ram_end) | 261 | && (unsigned long)&_root_fs_image_start < ram_end) |
259 | reserve_bootmem ((unsigned long)&_root_fs_image_start, | 262 | reserve_bootmem ((unsigned long)&_root_fs_image_start, |
260 | &_root_fs_image_end - &_root_fs_image_start); | 263 | &_root_fs_image_end - &_root_fs_image_start, |
264 | BOOTMEM_DEFAULT); | ||
261 | 265 | ||
262 | /* Let the platform-dependent code reserve some too. */ | 266 | /* Let the platform-dependent code reserve some too. */ |
263 | if (mrb) | 267 | if (mrb) |
diff --git a/arch/x86/kernel/mpparse_32.c b/arch/x86/kernel/mpparse_32.c index 67009cdd5eca..f349e68e45a0 100644 --- a/arch/x86/kernel/mpparse_32.c +++ b/arch/x86/kernel/mpparse_32.c | |||
@@ -736,7 +736,8 @@ static int __init smp_scan_config (unsigned long base, unsigned long length) | |||
736 | smp_found_config = 1; | 736 | smp_found_config = 1; |
737 | printk(KERN_INFO "found SMP MP-table at [%p] %08lx\n", | 737 | printk(KERN_INFO "found SMP MP-table at [%p] %08lx\n", |
738 | mpf, virt_to_phys(mpf)); | 738 | mpf, virt_to_phys(mpf)); |
739 | reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE); | 739 | reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE, |
740 | BOOTMEM_DEFAULT); | ||
740 | if (mpf->mpf_physptr) { | 741 | if (mpf->mpf_physptr) { |
741 | /* | 742 | /* |
742 | * We cannot access to MPC table to compute | 743 | * We cannot access to MPC table to compute |
@@ -751,7 +752,8 @@ static int __init smp_scan_config (unsigned long base, unsigned long length) | |||
751 | unsigned long end = max_low_pfn * PAGE_SIZE; | 752 | unsigned long end = max_low_pfn * PAGE_SIZE; |
752 | if (mpf->mpf_physptr + size > end) | 753 | if (mpf->mpf_physptr + size > end) |
753 | size = end - mpf->mpf_physptr; | 754 | size = end - mpf->mpf_physptr; |
754 | reserve_bootmem(mpf->mpf_physptr, size); | 755 | reserve_bootmem(mpf->mpf_physptr, size, |
756 | BOOTMEM_DEFAULT); | ||
755 | } | 757 | } |
756 | 758 | ||
757 | mpf_found = mpf; | 759 | mpf_found = mpf; |
diff --git a/arch/x86/kernel/setup_32.c b/arch/x86/kernel/setup_32.c index 62adc5f20be5..d1d8c347cc0b 100644 --- a/arch/x86/kernel/setup_32.c +++ b/arch/x86/kernel/setup_32.c | |||
@@ -390,7 +390,7 @@ static void __init reserve_ebda_region(void) | |||
390 | unsigned int addr; | 390 | unsigned int addr; |
391 | addr = get_bios_ebda(); | 391 | addr = get_bios_ebda(); |
392 | if (addr) | 392 | if (addr) |
393 | reserve_bootmem(addr, PAGE_SIZE); | 393 | reserve_bootmem(addr, PAGE_SIZE, BOOTMEM_DEFAULT); |
394 | } | 394 | } |
395 | 395 | ||
396 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 396 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
@@ -484,7 +484,8 @@ static void __init reserve_crashkernel(void) | |||
484 | (unsigned long)(total_mem >> 20)); | 484 | (unsigned long)(total_mem >> 20)); |
485 | crashk_res.start = crash_base; | 485 | crashk_res.start = crash_base; |
486 | crashk_res.end = crash_base + crash_size - 1; | 486 | crashk_res.end = crash_base + crash_size - 1; |
487 | reserve_bootmem(crash_base, crash_size); | 487 | reserve_bootmem(crash_base, crash_size, |
488 | BOOTMEM_DEFAULT); | ||
488 | } else | 489 | } else |
489 | printk(KERN_INFO "crashkernel reservation failed - " | 490 | printk(KERN_INFO "crashkernel reservation failed - " |
490 | "you have to specify a base address\n"); | 491 | "you have to specify a base address\n"); |
@@ -525,7 +526,7 @@ static void __init reserve_initrd(void) | |||
525 | } | 526 | } |
526 | if (ramdisk_end <= end_of_lowmem) { | 527 | if (ramdisk_end <= end_of_lowmem) { |
527 | /* All in lowmem, easy case */ | 528 | /* All in lowmem, easy case */ |
528 | reserve_bootmem(ramdisk_image, ramdisk_size); | 529 | reserve_bootmem(ramdisk_image, ramdisk_size, BOOTMEM_DEFAULT); |
529 | initrd_start = ramdisk_image + PAGE_OFFSET; | 530 | initrd_start = ramdisk_image + PAGE_OFFSET; |
530 | initrd_end = initrd_start+ramdisk_size; | 531 | initrd_end = initrd_start+ramdisk_size; |
531 | return; | 532 | return; |
@@ -536,7 +537,7 @@ static void __init reserve_initrd(void) | |||
536 | 537 | ||
537 | /* Note: this includes all the lowmem currently occupied by | 538 | /* Note: this includes all the lowmem currently occupied by |
538 | the initrd, we rely on that fact to keep the data intact. */ | 539 | the initrd, we rely on that fact to keep the data intact. */ |
539 | reserve_bootmem(ramdisk_here, ramdisk_size); | 540 | reserve_bootmem(ramdisk_here, ramdisk_size, BOOTMEM_DEFAULT); |
540 | initrd_start = ramdisk_here + PAGE_OFFSET; | 541 | initrd_start = ramdisk_here + PAGE_OFFSET; |
541 | initrd_end = initrd_start + ramdisk_size; | 542 | initrd_end = initrd_start + ramdisk_size; |
542 | 543 | ||
@@ -606,13 +607,14 @@ void __init setup_bootmem_allocator(void) | |||
606 | * bootmem allocator with an invalid RAM area. | 607 | * bootmem allocator with an invalid RAM area. |
607 | */ | 608 | */ |
608 | reserve_bootmem(__pa_symbol(_text), (PFN_PHYS(min_low_pfn) + | 609 | reserve_bootmem(__pa_symbol(_text), (PFN_PHYS(min_low_pfn) + |
609 | bootmap_size + PAGE_SIZE-1) - __pa_symbol(_text)); | 610 | bootmap_size + PAGE_SIZE-1) - __pa_symbol(_text), |
611 | BOOTMEM_DEFAULT); | ||
610 | 612 | ||
611 | /* | 613 | /* |
612 | * reserve physical page 0 - it's a special BIOS page on many boxes, | 614 | * reserve physical page 0 - it's a special BIOS page on many boxes, |
613 | * enabling clean reboots, SMP operation, laptop functions. | 615 | * enabling clean reboots, SMP operation, laptop functions. |
614 | */ | 616 | */ |
615 | reserve_bootmem(0, PAGE_SIZE); | 617 | reserve_bootmem(0, PAGE_SIZE, BOOTMEM_DEFAULT); |
616 | 618 | ||
617 | /* reserve EBDA region, it's a 4K region */ | 619 | /* reserve EBDA region, it's a 4K region */ |
618 | reserve_ebda_region(); | 620 | reserve_ebda_region(); |
@@ -622,7 +624,7 @@ void __init setup_bootmem_allocator(void) | |||
622 | unless you have no PS/2 mouse plugged in. */ | 624 | unless you have no PS/2 mouse plugged in. */ |
623 | if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && | 625 | if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && |
624 | boot_cpu_data.x86 == 6) | 626 | boot_cpu_data.x86 == 6) |
625 | reserve_bootmem(0xa0000 - 4096, 4096); | 627 | reserve_bootmem(0xa0000 - 4096, 4096, BOOTMEM_DEFAULT); |
626 | 628 | ||
627 | #ifdef CONFIG_SMP | 629 | #ifdef CONFIG_SMP |
628 | /* | 630 | /* |
@@ -630,7 +632,7 @@ void __init setup_bootmem_allocator(void) | |||
630 | * FIXME: Don't need the extra page at 4K, but need to fix | 632 | * FIXME: Don't need the extra page at 4K, but need to fix |
631 | * trampoline before removing it. (see the GDT stuff) | 633 | * trampoline before removing it. (see the GDT stuff) |
632 | */ | 634 | */ |
633 | reserve_bootmem(PAGE_SIZE, PAGE_SIZE); | 635 | reserve_bootmem(PAGE_SIZE, PAGE_SIZE, BOOTMEM_DEFAULT); |
634 | #endif | 636 | #endif |
635 | #ifdef CONFIG_ACPI_SLEEP | 637 | #ifdef CONFIG_ACPI_SLEEP |
636 | /* | 638 | /* |
diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c index c8939dfddfba..8345c3b12f05 100644 --- a/arch/x86/kernel/setup_64.c +++ b/arch/x86/kernel/setup_64.c | |||
@@ -189,7 +189,7 @@ contig_initmem_init(unsigned long start_pfn, unsigned long end_pfn) | |||
189 | bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn); | 189 | bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn); |
190 | e820_register_active_regions(0, start_pfn, end_pfn); | 190 | e820_register_active_regions(0, start_pfn, end_pfn); |
191 | free_bootmem_with_active_regions(0, end_pfn); | 191 | free_bootmem_with_active_regions(0, end_pfn); |
192 | reserve_bootmem(bootmap, bootmap_size); | 192 | reserve_bootmem(bootmap, bootmap_size, BOOTMEM_DEFAULT); |
193 | } | 193 | } |
194 | #endif | 194 | #endif |
195 | 195 | ||
@@ -238,7 +238,8 @@ static void __init reserve_crashkernel(void) | |||
238 | (unsigned long)(free_mem >> 20)); | 238 | (unsigned long)(free_mem >> 20)); |
239 | crashk_res.start = crash_base; | 239 | crashk_res.start = crash_base; |
240 | crashk_res.end = crash_base + crash_size - 1; | 240 | crashk_res.end = crash_base + crash_size - 1; |
241 | reserve_bootmem(crash_base, crash_size); | 241 | reserve_bootmem(crash_base, crash_size, |
242 | BOOTMEM_DEFAULT); | ||
242 | } else | 243 | } else |
243 | printk(KERN_INFO "crashkernel reservation failed - " | 244 | printk(KERN_INFO "crashkernel reservation failed - " |
244 | "you have to specify a base address\n"); | 245 | "you have to specify a base address\n"); |
diff --git a/arch/x86/mm/discontig_32.c b/arch/x86/mm/discontig_32.c index 04b1d20e2613..c394ca0720b8 100644 --- a/arch/x86/mm/discontig_32.c +++ b/arch/x86/mm/discontig_32.c | |||
@@ -391,7 +391,8 @@ unsigned long __init setup_memory(void) | |||
391 | void __init numa_kva_reserve(void) | 391 | void __init numa_kva_reserve(void) |
392 | { | 392 | { |
393 | if (kva_pages) | 393 | if (kva_pages) |
394 | reserve_bootmem(PFN_PHYS(kva_start_pfn), PFN_PHYS(kva_pages)); | 394 | reserve_bootmem(PFN_PHYS(kva_start_pfn), PFN_PHYS(kva_pages), |
395 | BOOTMEM_DEFAULT); | ||
395 | } | 396 | } |
396 | 397 | ||
397 | void __init zone_sizes_init(void) | 398 | void __init zone_sizes_init(void) |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 9b61c75a2355..5fe880fc305d 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -644,9 +644,9 @@ void __init reserve_bootmem_generic(unsigned long phys, unsigned len) | |||
644 | 644 | ||
645 | /* Should check here against the e820 map to avoid double free */ | 645 | /* Should check here against the e820 map to avoid double free */ |
646 | #ifdef CONFIG_NUMA | 646 | #ifdef CONFIG_NUMA |
647 | reserve_bootmem_node(NODE_DATA(nid), phys, len); | 647 | reserve_bootmem_node(NODE_DATA(nid), phys, len, BOOTMEM_DEFAULT); |
648 | #else | 648 | #else |
649 | reserve_bootmem(phys, len); | 649 | reserve_bootmem(phys, len, BOOTMEM_DEFAULT); |
650 | #endif | 650 | #endif |
651 | if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) { | 651 | if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) { |
652 | dma_reserve += len / PAGE_SIZE; | 652 | dma_reserve += len / PAGE_SIZE; |
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index 5a02bf4c91ec..1aecc658cd7d 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
@@ -238,9 +238,10 @@ void __init setup_node_bootmem(int nodeid, unsigned long start, | |||
238 | 238 | ||
239 | free_bootmem_with_active_regions(nodeid, end); | 239 | free_bootmem_with_active_regions(nodeid, end); |
240 | 240 | ||
241 | reserve_bootmem_node(NODE_DATA(nodeid), nodedata_phys, pgdat_size); | 241 | reserve_bootmem_node(NODE_DATA(nodeid), nodedata_phys, pgdat_size, |
242 | BOOTMEM_DEFAULT); | ||
242 | reserve_bootmem_node(NODE_DATA(nodeid), bootmap_start, | 243 | reserve_bootmem_node(NODE_DATA(nodeid), bootmap_start, |
243 | bootmap_pages<<PAGE_SHIFT); | 244 | bootmap_pages<<PAGE_SHIFT, BOOTMEM_DEFAULT); |
244 | #ifdef CONFIG_ACPI_NUMA | 245 | #ifdef CONFIG_ACPI_NUMA |
245 | srat_reserve_add_area(nodeid); | 246 | srat_reserve_add_area(nodeid); |
246 | #endif | 247 | #endif |
diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c index 65416f843e59..ecd91ea8a8ae 100644 --- a/arch/x86/mm/srat_64.c +++ b/arch/x86/mm/srat_64.c | |||
@@ -488,7 +488,8 @@ void __init srat_reserve_add_area(int nodeid) | |||
488 | printk(KERN_INFO "SRAT: This will cost you %Lu MB of " | 488 | printk(KERN_INFO "SRAT: This will cost you %Lu MB of " |
489 | "pre-allocated memory.\n", (unsigned long long)total_mb); | 489 | "pre-allocated memory.\n", (unsigned long long)total_mb); |
490 | reserve_bootmem_node(NODE_DATA(nodeid), nodes_add[nodeid].start, | 490 | reserve_bootmem_node(NODE_DATA(nodeid), nodes_add[nodeid].start, |
491 | nodes_add[nodeid].end - nodes_add[nodeid].start); | 491 | nodes_add[nodeid].end - nodes_add[nodeid].start, |
492 | BOOTMEM_DEFAULT); | ||
492 | } | 493 | } |
493 | } | 494 | } |
494 | 495 | ||
diff --git a/include/asm-x86/mmzone_32.h b/include/asm-x86/mmzone_32.h index 5d6f4ce6e6d6..274a59566c45 100644 --- a/include/asm-x86/mmzone_32.h +++ b/include/asm-x86/mmzone_32.h | |||
@@ -107,8 +107,8 @@ static inline int pfn_valid(int pfn) | |||
107 | /* | 107 | /* |
108 | * Following are macros that are specific to this numa platform. | 108 | * Following are macros that are specific to this numa platform. |
109 | */ | 109 | */ |
110 | #define reserve_bootmem(addr, size) \ | 110 | #define reserve_bootmem(addr, size, flags) \ |
111 | reserve_bootmem_node(NODE_DATA(0), (addr), (size)) | 111 | reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) |
112 | #define alloc_bootmem(x) \ | 112 | #define alloc_bootmem(x) \ |
113 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) | 113 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) |
114 | #define alloc_bootmem_low(x) \ | 114 | #define alloc_bootmem_low(x) \ |
diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index 0365ec9fc0c9..4e4e340592fb 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h | |||
@@ -60,8 +60,20 @@ extern void *__alloc_bootmem_core(struct bootmem_data *bdata, | |||
60 | unsigned long goal, | 60 | unsigned long goal, |
61 | unsigned long limit); | 61 | unsigned long limit); |
62 | 62 | ||
63 | /* | ||
64 | * flags for reserve_bootmem (also if CONFIG_HAVE_ARCH_BOOTMEM_NODE, | ||
65 | * the architecture-specific code should honor this) | ||
66 | */ | ||
67 | #define BOOTMEM_DEFAULT 0 | ||
68 | #define BOOTMEM_EXCLUSIVE (1<<0) | ||
69 | |||
63 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE | 70 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE |
64 | extern void reserve_bootmem(unsigned long addr, unsigned long size); | 71 | /* |
72 | * If flags is 0, then the return value is always 0 (success). If | ||
73 | * flags contains BOOTMEM_EXCLUSIVE, then -EBUSY is returned if the | ||
74 | * memory already was reserved. | ||
75 | */ | ||
76 | extern int reserve_bootmem(unsigned long addr, unsigned long size, int flags); | ||
65 | #define alloc_bootmem(x) \ | 77 | #define alloc_bootmem(x) \ |
66 | __alloc_bootmem(x, SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) | 78 | __alloc_bootmem(x, SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) |
67 | #define alloc_bootmem_low(x) \ | 79 | #define alloc_bootmem_low(x) \ |
@@ -84,7 +96,8 @@ extern unsigned long init_bootmem_node(pg_data_t *pgdat, | |||
84 | unsigned long endpfn); | 96 | unsigned long endpfn); |
85 | extern void reserve_bootmem_node(pg_data_t *pgdat, | 97 | extern void reserve_bootmem_node(pg_data_t *pgdat, |
86 | unsigned long physaddr, | 98 | unsigned long physaddr, |
87 | unsigned long size); | 99 | unsigned long size, |
100 | int flags); | ||
88 | extern void free_bootmem_node(pg_data_t *pgdat, | 101 | extern void free_bootmem_node(pg_data_t *pgdat, |
89 | unsigned long addr, | 102 | unsigned long addr, |
90 | unsigned long size); | 103 | unsigned long size); |
diff --git a/mm/bootmem.c b/mm/bootmem.c index 00a96970b237..f6ff4337b424 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
@@ -111,11 +111,12 @@ static unsigned long __init init_bootmem_core(pg_data_t *pgdat, | |||
111 | * might be used for boot-time allocations - or it might get added | 111 | * might be used for boot-time allocations - or it might get added |
112 | * to the free page pool later on. | 112 | * to the free page pool later on. |
113 | */ | 113 | */ |
114 | static void __init reserve_bootmem_core(bootmem_data_t *bdata, unsigned long addr, | 114 | static int __init reserve_bootmem_core(bootmem_data_t *bdata, |
115 | unsigned long size) | 115 | unsigned long addr, unsigned long size, int flags) |
116 | { | 116 | { |
117 | unsigned long sidx, eidx; | 117 | unsigned long sidx, eidx; |
118 | unsigned long i; | 118 | unsigned long i; |
119 | int ret; | ||
119 | 120 | ||
120 | /* | 121 | /* |
121 | * round up, partially reserved pages are considered | 122 | * round up, partially reserved pages are considered |
@@ -133,7 +134,20 @@ static void __init reserve_bootmem_core(bootmem_data_t *bdata, unsigned long add | |||
133 | #ifdef CONFIG_DEBUG_BOOTMEM | 134 | #ifdef CONFIG_DEBUG_BOOTMEM |
134 | printk("hm, page %08lx reserved twice.\n", i*PAGE_SIZE); | 135 | printk("hm, page %08lx reserved twice.\n", i*PAGE_SIZE); |
135 | #endif | 136 | #endif |
137 | if (flags & BOOTMEM_EXCLUSIVE) { | ||
138 | ret = -EBUSY; | ||
139 | goto err; | ||
140 | } | ||
136 | } | 141 | } |
142 | |||
143 | return 0; | ||
144 | |||
145 | err: | ||
146 | /* unreserve memory we accidentally reserved */ | ||
147 | for (i--; i >= sidx; i--) | ||
148 | clear_bit(i, bdata->node_bootmem_map); | ||
149 | |||
150 | return ret; | ||
137 | } | 151 | } |
138 | 152 | ||
139 | static void __init free_bootmem_core(bootmem_data_t *bdata, unsigned long addr, | 153 | static void __init free_bootmem_core(bootmem_data_t *bdata, unsigned long addr, |
@@ -374,9 +388,9 @@ unsigned long __init init_bootmem_node(pg_data_t *pgdat, unsigned long freepfn, | |||
374 | } | 388 | } |
375 | 389 | ||
376 | void __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr, | 390 | void __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr, |
377 | unsigned long size) | 391 | unsigned long size, int flags) |
378 | { | 392 | { |
379 | reserve_bootmem_core(pgdat->bdata, physaddr, size); | 393 | reserve_bootmem_core(pgdat->bdata, physaddr, size, flags); |
380 | } | 394 | } |
381 | 395 | ||
382 | void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr, | 396 | void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr, |
@@ -398,9 +412,10 @@ unsigned long __init init_bootmem(unsigned long start, unsigned long pages) | |||
398 | } | 412 | } |
399 | 413 | ||
400 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE | 414 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE |
401 | void __init reserve_bootmem(unsigned long addr, unsigned long size) | 415 | int __init reserve_bootmem(unsigned long addr, unsigned long size, |
416 | int flags) | ||
402 | { | 417 | { |
403 | reserve_bootmem_core(NODE_DATA(0)->bdata, addr, size); | 418 | return reserve_bootmem_core(NODE_DATA(0)->bdata, addr, size, flags); |
404 | } | 419 | } |
405 | #endif /* !CONFIG_HAVE_ARCH_BOOTMEM_NODE */ | 420 | #endif /* !CONFIG_HAVE_ARCH_BOOTMEM_NODE */ |
406 | 421 | ||