Commit 72a7fe3967dbf86cb34e24fbf1d957fe24d2f246
Committed by
Linus Torvalds
1 parent
25fad945a7
Exists in
master
and in
39 other branches
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>
Showing 43 changed files with 183 additions and 105 deletions Side-by-side Diff
- arch/alpha/kernel/core_irongate.c
- arch/alpha/kernel/setup.c
- arch/alpha/mm/numa.c
- arch/arm/mm/init.c
- arch/arm/mm/mmu.c
- arch/arm/mm/nommu.c
- arch/arm/plat-omap/fb.c
- arch/avr32/kernel/setup.c
- arch/blackfin/kernel/setup.c
- arch/cris/kernel/setup.c
- arch/frv/kernel/setup.c
- arch/h8300/kernel/setup.c
- arch/ia64/mm/contig.c
- arch/ia64/mm/discontig.c
- arch/m32r/kernel/setup.c
- arch/m32r/mm/discontig.c
- arch/m68k/atari/stram.c
- arch/m68k/kernel/setup.c
- arch/m68knommu/kernel/setup.c
- arch/mips/kernel/setup.c
- arch/mips/sgi-ip27/ip27-memory.c
- arch/parisc/mm/init.c
- arch/powerpc/mm/mem.c
- arch/powerpc/mm/numa.c
- arch/s390/kernel/setup.c
- arch/sh/kernel/setup.c
- arch/sh/mm/numa.c
- arch/sparc/mm/init.c
- arch/sparc64/mm/init.c
- arch/v850/kernel/anna.c
- arch/v850/kernel/as85ep1.c
- arch/v850/kernel/rte_ma1_cb.c
- arch/v850/kernel/setup.c
- arch/x86/kernel/mpparse_32.c
- arch/x86/kernel/setup_32.c
- arch/x86/kernel/setup_64.c
- arch/x86/mm/discontig_32.c
- arch/x86/mm/init_64.c
- arch/x86/mm/numa_64.c
- arch/x86/mm/srat_64.c
- include/asm-x86/mmzone_32.h
- include/linux/bootmem.h
- mm/bootmem.c
arch/alpha/kernel/core_irongate.c
... | ... | @@ -241,7 +241,8 @@ |
241 | 241 | size / 1024); |
242 | 242 | } |
243 | 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 | 246 | printk("irongate_init_arch: temporarily reserving " |
246 | 247 | "region %08lx-%08lx for PCI\n", pci_mem, memtop - 1); |
247 | 248 | } |
arch/alpha/kernel/setup.c
... | ... | @@ -428,7 +428,8 @@ |
428 | 428 | } |
429 | 429 | |
430 | 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 | 433 | printk("reserving pages %ld:%ld\n", bootmap_start, bootmap_start+PFN_UP(bootmap_size)); |
433 | 434 | |
434 | 435 | #ifdef CONFIG_BLK_DEV_INITRD |
... | ... | @@ -446,7 +447,7 @@ |
446 | 447 | phys_to_virt(PFN_PHYS(max_low_pfn))); |
447 | 448 | } else { |
448 | 449 | reserve_bootmem(virt_to_phys((void *)initrd_start), |
449 | - INITRD_SIZE); | |
450 | + INITRD_SIZE, BOOTMEM_DEFAULT); | |
450 | 451 | } |
451 | 452 | } |
452 | 453 | #endif /* CONFIG_BLK_DEV_INITRD */ |
arch/alpha/mm/numa.c
... | ... | @@ -242,7 +242,8 @@ |
242 | 242 | } |
243 | 243 | |
244 | 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 | 247 | printk(" reserving pages %ld:%ld\n", bootmap_start, bootmap_start+PFN_UP(bootmap_size)); |
247 | 248 | |
248 | 249 | node_set_online(nid); |
... | ... | @@ -281,7 +282,7 @@ |
281 | 282 | nid = kvaddr_to_nid(initrd_start); |
282 | 283 | reserve_bootmem_node(NODE_DATA(nid), |
283 | 284 | virt_to_phys((void *)initrd_start), |
284 | - INITRD_SIZE); | |
285 | + INITRD_SIZE, BOOTMEM_DEFAULT); | |
285 | 286 | } |
286 | 287 | } |
287 | 288 | #endif /* CONFIG_BLK_DEV_INITRD */ |
arch/arm/mm/init.c
... | ... | @@ -239,7 +239,7 @@ |
239 | 239 | * Reserve the bootmem bitmap for this node. |
240 | 240 | */ |
241 | 241 | reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT, |
242 | - boot_pages << PAGE_SHIFT); | |
242 | + boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT); | |
243 | 243 | |
244 | 244 | #ifdef CONFIG_BLK_DEV_INITRD |
245 | 245 | /* |
... | ... | @@ -247,7 +247,7 @@ |
247 | 247 | */ |
248 | 248 | if (node == initrd_node) { |
249 | 249 | reserve_bootmem_node(pgdat, phys_initrd_start, |
250 | - phys_initrd_size); | |
250 | + phys_initrd_size, BOOTMEM_DEFAULT); | |
251 | 251 | initrd_start = __phys_to_virt(phys_initrd_start); |
252 | 252 | initrd_end = initrd_start + phys_initrd_size; |
253 | 253 | } |
arch/arm/mm/mmu.c
... | ... | @@ -605,9 +605,11 @@ |
605 | 605 | * Note that this can only be in node 0. |
606 | 606 | */ |
607 | 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 | 610 | #else |
610 | - reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext); | |
611 | + reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext, | |
612 | + BOOTMEM_DEFAULT); | |
611 | 613 | #endif |
612 | 614 | |
613 | 615 | /* |
... | ... | @@ -615,7 +617,7 @@ |
615 | 617 | * and can only be in node 0. |
616 | 618 | */ |
617 | 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 | 623 | * Hmm... This should go elsewhere, but we really really need to |
... | ... | @@ -638,8 +640,10 @@ |
638 | 640 | /* H1940 and RX3715 need to reserve this for suspend */ |
639 | 641 | |
640 | 642 | if (machine_is_h1940() || machine_is_rx3715()) { |
641 | - reserve_bootmem_node(pgdat, 0x30003000, 0x1000); | |
642 | - reserve_bootmem_node(pgdat, 0x30081000, 0x1000); | |
643 | + reserve_bootmem_node(pgdat, 0x30003000, 0x1000, | |
644 | + BOOTMEM_DEFAULT); | |
645 | + reserve_bootmem_node(pgdat, 0x30081000, 0x1000, | |
646 | + BOOTMEM_DEFAULT); | |
643 | 647 | } |
644 | 648 | |
645 | 649 | #ifdef CONFIG_SA1111 |
... | ... | @@ -650,7 +654,8 @@ |
650 | 654 | res_size = __pa(swapper_pg_dir) - PHYS_OFFSET; |
651 | 655 | #endif |
652 | 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 | /* |
arch/arm/mm/nommu.c
... | ... | @@ -27,9 +27,11 @@ |
27 | 27 | * Note that this can only be in node 0. |
28 | 28 | */ |
29 | 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 | 32 | #else |
32 | - reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext); | |
33 | + reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext, | |
34 | + BOOTMEM_DEFAULT); | |
33 | 35 | #endif |
34 | 36 | |
35 | 37 | /* |
... | ... | @@ -37,7 +39,8 @@ |
37 | 39 | * some architectures which the DRAM is the exception vector to trap, |
38 | 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 | /* |
arch/arm/plat-omap/fb.c
arch/avr32/kernel/setup.c
... | ... | @@ -489,7 +489,8 @@ |
489 | 489 | /* Reserve space for the bootmem bitmap... */ |
490 | 490 | reserve_bootmem_node(NODE_DATA(node), |
491 | 491 | PFN_PHYS(bootmap_pfn), |
492 | - bootmap_size); | |
492 | + bootmap_size, | |
493 | + BOOTMEM_DEFAULT); | |
493 | 494 | |
494 | 495 | /* ...and any other reserved regions. */ |
495 | 496 | for (res = reserved; res; res = res->sibling) { |
... | ... | @@ -505,7 +506,8 @@ |
505 | 506 | && res->end < PFN_PHYS(max_pfn)) |
506 | 507 | reserve_bootmem_node( |
507 | 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 | 513 | node_set_online(node); |
arch/blackfin/kernel/setup.c
arch/cris/kernel/setup.c
... | ... | @@ -137,7 +137,7 @@ |
137 | 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 | 142 | /* paging_init() sets up the MMU and marks all pages as reserved */ |
143 | 143 |
arch/frv/kernel/setup.c
... | ... | @@ -925,13 +925,15 @@ |
925 | 925 | #endif |
926 | 926 | |
927 | 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 | 931 | /* reserve the memory occupied by the initial ramdisk */ |
931 | 932 | #ifdef CONFIG_BLK_DEV_INITRD |
932 | 933 | if (LOADER_TYPE && INITRD_START) { |
933 | 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 | 937 | initrd_start = INITRD_START + PAGE_OFFSET; |
936 | 938 | initrd_end = initrd_start + INITRD_SIZE; |
937 | 939 | } |
938 | 940 | |
... | ... | @@ -986,9 +988,10 @@ |
986 | 988 | |
987 | 989 | /* now take back the bits the core kernel is occupying */ |
988 | 990 | #ifndef CONFIG_PROTECT_KERNEL |
989 | - reserve_bootmem(kend, bootmap_size); | |
991 | + reserve_bootmem(kend, bootmap_size, BOOTMEM_DEFAULT); | |
990 | 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 | 996 | #else |
994 | 997 | dampr = __get_DAMPR(0); |
995 | 998 | |
... | ... | @@ -996,14 +999,15 @@ |
996 | 999 | dampr = (dampr >> 4) + 17; |
997 | 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 | 1003 | #endif |
1001 | 1004 | |
1002 | 1005 | /* reserve some memory to do uncached DMA through if requested */ |
1003 | 1006 | #ifdef CONFIG_RESERVE_DMA_COHERENT |
1004 | 1007 | if (dma_coherent_mem_start) |
1005 | 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 | 1011 | #endif |
1008 | 1012 | |
1009 | 1013 | } /* end setup_uclinux_memory() */ |
arch/h8300/kernel/setup.c
... | ... | @@ -173,7 +173,7 @@ |
173 | 173 | * the bootmem bitmap so we then reserve it after freeing it :-) |
174 | 174 | */ |
175 | 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 | 178 | * get kmalloc into gear |
179 | 179 | */ |
arch/ia64/mm/contig.c
... | ... | @@ -218,7 +218,7 @@ |
218 | 218 | |
219 | 219 | /* Free all available memory, then mark bootmem-map as being in use. */ |
220 | 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 | 223 | find_initrd(); |
224 | 224 |
arch/ia64/mm/discontig.c
... | ... | @@ -299,12 +299,12 @@ |
299 | 299 | pages = bdp->node_low_pfn - (bdp->node_boot_start>>PAGE_SHIFT); |
300 | 300 | size = bootmem_bootmap_pages(pages) << PAGE_SHIFT; |
301 | 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 | 304 | /* Now the per-node space */ |
305 | 305 | size = mem_data[node].pernode_size; |
306 | 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 |
arch/m32r/kernel/setup.c
... | ... | @@ -177,25 +177,28 @@ |
177 | 177 | */ |
178 | 178 | reserve_bootmem(CONFIG_MEMORY_START + PAGE_SIZE, |
179 | 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 | 184 | * reserve physical page 0 - it's a special BIOS page on many boxes, |
184 | 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 | 190 | * reserve memory hole |
190 | 191 | */ |
191 | 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 | 195 | #endif |
194 | 196 | |
195 | 197 | #ifdef CONFIG_BLK_DEV_INITRD |
196 | 198 | if (LOADER_TYPE && INITRD_START) { |
197 | 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 | 202 | initrd_start = INITRD_START + PAGE_OFFSET; |
200 | 203 | initrd_end = initrd_start + INITRD_SIZE; |
201 | 204 | printk("initrd:start[%08lx],size[%08lx]\n", |
arch/m32r/mm/discontig.c
... | ... | @@ -91,7 +91,8 @@ |
91 | 91 | PFN_PHYS(mp->pages)); |
92 | 92 | |
93 | 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 | 97 | if (max_low_pfn < max_pfn) |
97 | 98 | max_low_pfn = max_pfn; |
... | ... | @@ -104,7 +105,7 @@ |
104 | 105 | if (LOADER_TYPE && INITRD_START) { |
105 | 106 | if (INITRD_START + INITRD_SIZE <= PFN_PHYS(max_low_pfn)) { |
106 | 107 | reserve_bootmem_node(NODE_DATA(0), INITRD_START, |
107 | - INITRD_SIZE); | |
108 | + INITRD_SIZE, BOOTMEM_DEFAULT); | |
108 | 109 | initrd_start = INITRD_START + PAGE_OFFSET; |
109 | 110 | initrd_end = initrd_start + INITRD_SIZE; |
110 | 111 | printk("initrd:start[%08lx],size[%08lx]\n", |
arch/m68k/atari/stram.c
arch/m68k/kernel/setup.c
... | ... | @@ -323,7 +323,8 @@ |
323 | 323 | #ifdef CONFIG_BLK_DEV_INITRD |
324 | 324 | if (m68k_ramdisk.size) { |
325 | 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 | 328 | initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr); |
328 | 329 | initrd_end = initrd_start + m68k_ramdisk.size; |
329 | 330 | printk("initrd: %08lx - %08lx\n", initrd_start, initrd_end); |
arch/m68knommu/kernel/setup.c
... | ... | @@ -203,7 +203,7 @@ |
203 | 203 | * the bootmem bitmap so we then reserve it after freeing it :-) |
204 | 204 | */ |
205 | 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 | 209 | * Get kmalloc into gear. |
arch/mips/kernel/setup.c
... | ... | @@ -232,7 +232,7 @@ |
232 | 232 | goto disable; |
233 | 233 | } |
234 | 234 | |
235 | - reserve_bootmem(__pa(initrd_start), size); | |
235 | + reserve_bootmem(__pa(initrd_start), size, BOOTMEM_DEFAULT); | |
236 | 236 | initrd_below_start_ok = 1; |
237 | 237 | |
238 | 238 | printk(KERN_INFO "Initial ramdisk at: 0x%lx (%lu bytes)\n", |
... | ... | @@ -413,7 +413,7 @@ |
413 | 413 | /* |
414 | 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 | 419 | * Reserve initrd memory if needed. |
arch/mips/sgi-ip27/ip27-memory.c
... | ... | @@ -465,7 +465,8 @@ |
465 | 465 | free_bootmem_node(NODE_DATA(node), slot_firstpfn << PAGE_SHIFT, |
466 | 466 | (slot_lastpfn - slot_firstpfn) << PAGE_SHIFT); |
467 | 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 | /* |
arch/parisc/mm/init.c
... | ... | @@ -315,11 +315,13 @@ |
315 | 315 | #define PDC_CONSOLE_IO_IODC_SIZE 32768 |
316 | 316 | |
317 | 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 | 320 | reserve_bootmem_node(NODE_DATA(0), __pa((unsigned long)_text), |
320 | - (unsigned long)(_end - _text)); | |
321 | + (unsigned long)(_end - _text), BOOTMEM_DEFAULT); | |
321 | 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 | 326 | #ifndef CONFIG_DISCONTIGMEM |
325 | 327 | |
... | ... | @@ -328,7 +330,8 @@ |
328 | 330 | for (i = 0; i < npmem_holes; i++) { |
329 | 331 | reserve_bootmem_node(NODE_DATA(0), |
330 | 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 | 336 | #endif |
334 | 337 | |
... | ... | @@ -346,7 +349,8 @@ |
346 | 349 | initrd_below_start_ok = 1; |
347 | 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 | 356 | #endif |
arch/powerpc/mm/mem.c
... | ... | @@ -220,12 +220,13 @@ |
220 | 220 | lmb_size_bytes(&lmb.reserved, i) - 1; |
221 | 221 | if (addr < total_lowmem) |
222 | 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 | 225 | else if (lmb.reserved.region[i].base < total_lowmem) { |
225 | 226 | unsigned long adjusted_size = total_lowmem - |
226 | 227 | lmb.reserved.region[i].base; |
227 | 228 | reserve_bootmem(lmb.reserved.region[i].base, |
228 | - adjusted_size); | |
229 | + adjusted_size, BOOTMEM_DEFAULT); | |
229 | 230 | } |
230 | 231 | } |
231 | 232 | #else |
... | ... | @@ -234,7 +235,8 @@ |
234 | 235 | /* reserve the sections we're already using */ |
235 | 236 | for (i = 0; i < lmb.reserved.cnt; i++) |
236 | 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 | 241 | #endif |
240 | 242 | /* XXX need to clip this if using highmem? */ |
arch/powerpc/mm/numa.c
arch/s390/kernel/setup.c
... | ... | @@ -649,21 +649,24 @@ |
649 | 649 | /* |
650 | 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 | 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 | 657 | * Reserve the bootmem bitmap itself as well. We do this in two |
657 | 658 | * steps (first step was init_bootmem()) because this catches |
658 | 659 | * the (very unlikely) case of us accidentally initializing the |
659 | 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 | 665 | #ifdef CONFIG_BLK_DEV_INITRD |
664 | 666 | if (INITRD_START && INITRD_SIZE) { |
665 | 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 | 670 | initrd_start = INITRD_START; |
668 | 671 | initrd_end = initrd_start + INITRD_SIZE; |
669 | 672 | } else { |
arch/sh/kernel/setup.c
... | ... | @@ -148,7 +148,8 @@ |
148 | 148 | (unsigned long)(free_mem >> 20)); |
149 | 149 | crashk_res.start = crash_base; |
150 | 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 | 153 | } else |
153 | 154 | printk(KERN_INFO "crashkernel reservation failed - " |
154 | 155 | "you have to specify a base address\n"); |
155 | 156 | |
... | ... | @@ -184,13 +185,14 @@ |
184 | 185 | * an invalid RAM area. |
185 | 186 | */ |
186 | 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 | 192 | * reserve physical page 0 - it's a special BIOS page on many boxes, |
191 | 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 | 197 | sparse_memory_present_with_active_regions(0); |
196 | 198 | |
... | ... | @@ -200,7 +202,7 @@ |
200 | 202 | if (LOADER_TYPE && INITRD_START) { |
201 | 203 | if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) { |
202 | 204 | reserve_bootmem(INITRD_START + __MEMORY_START, |
203 | - INITRD_SIZE); | |
205 | + INITRD_SIZE, BOOTMEM_DEFAULT); | |
204 | 206 | initrd_start = INITRD_START + PAGE_OFFSET + |
205 | 207 | __MEMORY_START; |
206 | 208 | initrd_end = initrd_start + INITRD_SIZE; |
arch/sh/mm/numa.c
... | ... | @@ -80,9 +80,9 @@ |
80 | 80 | |
81 | 81 | /* Reserve the pgdat and bootmap space with the bootmem allocator */ |
82 | 82 | reserve_bootmem_node(NODE_DATA(nid), start_pfn << PAGE_SHIFT, |
83 | - sizeof(struct pglist_data)); | |
83 | + sizeof(struct pglist_data), BOOTMEM_DEFAULT); | |
84 | 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 | 87 | /* It's up */ |
88 | 88 | node_set_online(nid); |
arch/sparc/mm/init.c
... | ... | @@ -259,7 +259,7 @@ |
259 | 259 | if (initrd_start) { |
260 | 260 | /* Reserve the initrd image area. */ |
261 | 261 | size = initrd_end - initrd_start; |
262 | - reserve_bootmem(initrd_start, size); | |
262 | + reserve_bootmem(initrd_start, size, BOOTMEM_DEFAULT); | |
263 | 263 | *pages_avail -= PAGE_ALIGN(size) >> PAGE_SHIFT; |
264 | 264 | |
265 | 265 | initrd_start = (initrd_start - phys_base) + PAGE_OFFSET; |
... | ... | @@ -268,7 +268,7 @@ |
268 | 268 | #endif |
269 | 269 | /* Reserve the kernel text/data/bss. */ |
270 | 270 | size = (start_pfn << PAGE_SHIFT) - phys_base; |
271 | - reserve_bootmem(phys_base, size); | |
271 | + reserve_bootmem(phys_base, size, BOOTMEM_DEFAULT); | |
272 | 272 | *pages_avail -= PAGE_ALIGN(size) >> PAGE_SHIFT; |
273 | 273 | |
274 | 274 | /* Reserve the bootmem map. We do not account for it |
... | ... | @@ -276,7 +276,7 @@ |
276 | 276 | * in free_all_bootmem. |
277 | 277 | */ |
278 | 278 | size = bootmap_size; |
279 | - reserve_bootmem((bootmap_pfn << PAGE_SHIFT), size); | |
279 | + reserve_bootmem((bootmap_pfn << PAGE_SHIFT), size, BOOTMEM_DEFAULT); | |
280 | 280 | *pages_avail -= PAGE_ALIGN(size) >> PAGE_SHIFT; |
281 | 281 | |
282 | 282 | return max_pfn; |
arch/sparc64/mm/init.c
... | ... | @@ -997,7 +997,7 @@ |
997 | 997 | prom_printf("reserve_bootmem(initrd): base[%llx] size[%lx]\n", |
998 | 998 | initrd_start, initrd_end); |
999 | 999 | #endif |
1000 | - reserve_bootmem(initrd_start, size); | |
1000 | + reserve_bootmem(initrd_start, size, BOOTMEM_DEFAULT); | |
1001 | 1001 | |
1002 | 1002 | initrd_start += PAGE_OFFSET; |
1003 | 1003 | initrd_end += PAGE_OFFSET; |
... | ... | @@ -1007,7 +1007,7 @@ |
1007 | 1007 | #ifdef CONFIG_DEBUG_BOOTMEM |
1008 | 1008 | prom_printf("reserve_bootmem(kernel): base[%lx] size[%lx]\n", kern_base, kern_size); |
1009 | 1009 | #endif |
1010 | - reserve_bootmem(kern_base, kern_size); | |
1010 | + reserve_bootmem(kern_base, kern_size, BOOTMEM_DEFAULT); | |
1011 | 1011 | *pages_avail -= PAGE_ALIGN(kern_size) >> PAGE_SHIFT; |
1012 | 1012 | |
1013 | 1013 | /* Add back in the initmem pages. */ |
... | ... | @@ -1024,7 +1024,7 @@ |
1024 | 1024 | prom_printf("reserve_bootmem(bootmap): base[%lx] size[%lx]\n", |
1025 | 1025 | (bootmap_pfn << PAGE_SHIFT), size); |
1026 | 1026 | #endif |
1027 | - reserve_bootmem((bootmap_pfn << PAGE_SHIFT), size); | |
1027 | + reserve_bootmem((bootmap_pfn << PAGE_SHIFT), size, BOOTMEM_DEFAULT); | |
1028 | 1028 | |
1029 | 1029 | for (i = 0; i < pavail_ents; i++) { |
1030 | 1030 | unsigned long start_pfn, end_pfn; |
... | ... | @@ -1489,7 +1489,7 @@ |
1489 | 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 | 1494 | do_next_page: |
1495 | 1495 | old_start += PAGE_SIZE; |
arch/v850/kernel/anna.c
... | ... | @@ -85,7 +85,8 @@ |
85 | 85 | /* The space between SRAM and SDRAM is filled with duplicate |
86 | 86 | images of SRAM. Prevent the kernel from using them. */ |
87 | 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 | 92 | void mach_gettimeofday (struct timespec *tv) |
arch/v850/kernel/as85ep1.c
... | ... | @@ -116,7 +116,8 @@ |
116 | 116 | if (SDRAM_ADDR < RAM_END && SDRAM_ADDR > RAM_START) |
117 | 117 | /* We can't use the space between SRAM and SDRAM, so |
118 | 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 | 123 | void mach_gettimeofday (struct timespec *tv) |
arch/v850/kernel/rte_ma1_cb.c
... | ... | @@ -46,13 +46,15 @@ |
46 | 46 | { |
47 | 47 | #ifdef CONFIG_RTE_CB_MULTI |
48 | 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 | 51 | #endif |
51 | 52 | |
52 | 53 | /* The space between SRAM and SDRAM is filled with duplicate |
53 | 54 | images of SRAM. Prevent the kernel from using them. */ |
54 | 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 | 60 | void mach_gettimeofday (struct timespec *tv) |
arch/v850/kernel/setup.c
... | ... | @@ -241,15 +241,18 @@ |
241 | 241 | if (kram_end > kram_start) |
242 | 242 | /* Reserve the RAM part of the kernel's address space, so it |
243 | 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 | 247 | if (intv_in_ram && !intv_in_kram) |
247 | 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 | 252 | if (bootmap >= ram_start && bootmap < ram_end) |
251 | 253 | /* Reserve the bootmap space. */ |
252 | - reserve_bootmem (bootmap, bootmap_len); | |
254 | + reserve_bootmem(bootmap, bootmap_len, | |
255 | + BOOTMEM_DEFAULT); | |
253 | 256 | |
254 | 257 | /* Reserve the memory used by the root filesystem image if it's |
255 | 258 | in RAM. */ |
... | ... | @@ -257,7 +260,8 @@ |
257 | 260 | && (unsigned long)&_root_fs_image_start >= ram_start |
258 | 261 | && (unsigned long)&_root_fs_image_start < ram_end) |
259 | 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 | 266 | /* Let the platform-dependent code reserve some too. */ |
263 | 267 | if (mrb) |
arch/x86/kernel/mpparse_32.c
... | ... | @@ -736,7 +736,8 @@ |
736 | 736 | smp_found_config = 1; |
737 | 737 | printk(KERN_INFO "found SMP MP-table at [%p] %08lx\n", |
738 | 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 | 741 | if (mpf->mpf_physptr) { |
741 | 742 | /* |
742 | 743 | * We cannot access to MPC table to compute |
... | ... | @@ -751,7 +752,8 @@ |
751 | 752 | unsigned long end = max_low_pfn * PAGE_SIZE; |
752 | 753 | if (mpf->mpf_physptr + size > end) |
753 | 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 | 759 | mpf_found = mpf; |
arch/x86/kernel/setup_32.c
... | ... | @@ -390,7 +390,7 @@ |
390 | 390 | unsigned int addr; |
391 | 391 | addr = get_bios_ebda(); |
392 | 392 | if (addr) |
393 | - reserve_bootmem(addr, PAGE_SIZE); | |
393 | + reserve_bootmem(addr, PAGE_SIZE, BOOTMEM_DEFAULT); | |
394 | 394 | } |
395 | 395 | |
396 | 396 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
... | ... | @@ -484,7 +484,8 @@ |
484 | 484 | (unsigned long)(total_mem >> 20)); |
485 | 485 | crashk_res.start = crash_base; |
486 | 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 | 489 | } else |
489 | 490 | printk(KERN_INFO "crashkernel reservation failed - " |
490 | 491 | "you have to specify a base address\n"); |
... | ... | @@ -525,7 +526,7 @@ |
525 | 526 | } |
526 | 527 | if (ramdisk_end <= end_of_lowmem) { |
527 | 528 | /* All in lowmem, easy case */ |
528 | - reserve_bootmem(ramdisk_image, ramdisk_size); | |
529 | + reserve_bootmem(ramdisk_image, ramdisk_size, BOOTMEM_DEFAULT); | |
529 | 530 | initrd_start = ramdisk_image + PAGE_OFFSET; |
530 | 531 | initrd_end = initrd_start+ramdisk_size; |
531 | 532 | return; |
... | ... | @@ -536,7 +537,7 @@ |
536 | 537 | |
537 | 538 | /* Note: this includes all the lowmem currently occupied by |
538 | 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 | 541 | initrd_start = ramdisk_here + PAGE_OFFSET; |
541 | 542 | initrd_end = initrd_start + ramdisk_size; |
542 | 543 | |
543 | 544 | |
... | ... | @@ -606,13 +607,14 @@ |
606 | 607 | * bootmem allocator with an invalid RAM area. |
607 | 608 | */ |
608 | 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 | 614 | * reserve physical page 0 - it's a special BIOS page on many boxes, |
613 | 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 | 619 | /* reserve EBDA region, it's a 4K region */ |
618 | 620 | reserve_ebda_region(); |
... | ... | @@ -622,7 +624,7 @@ |
622 | 624 | unless you have no PS/2 mouse plugged in. */ |
623 | 625 | if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && |
624 | 626 | boot_cpu_data.x86 == 6) |
625 | - reserve_bootmem(0xa0000 - 4096, 4096); | |
627 | + reserve_bootmem(0xa0000 - 4096, 4096, BOOTMEM_DEFAULT); | |
626 | 628 | |
627 | 629 | #ifdef CONFIG_SMP |
628 | 630 | /* |
... | ... | @@ -630,7 +632,7 @@ |
630 | 632 | * FIXME: Don't need the extra page at 4K, but need to fix |
631 | 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 | 636 | #endif |
635 | 637 | #ifdef CONFIG_ACPI_SLEEP |
636 | 638 | /* |
arch/x86/kernel/setup_64.c
... | ... | @@ -189,7 +189,7 @@ |
189 | 189 | bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn); |
190 | 190 | e820_register_active_regions(0, start_pfn, end_pfn); |
191 | 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 | 194 | #endif |
195 | 195 | |
... | ... | @@ -238,7 +238,8 @@ |
238 | 238 | (unsigned long)(free_mem >> 20)); |
239 | 239 | crashk_res.start = crash_base; |
240 | 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 | 243 | } else |
243 | 244 | printk(KERN_INFO "crashkernel reservation failed - " |
244 | 245 | "you have to specify a base address\n"); |
arch/x86/mm/discontig_32.c
... | ... | @@ -391,7 +391,8 @@ |
391 | 391 | void __init numa_kva_reserve(void) |
392 | 392 | { |
393 | 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 | 398 | void __init zone_sizes_init(void) |
arch/x86/mm/init_64.c
... | ... | @@ -644,9 +644,9 @@ |
644 | 644 | |
645 | 645 | /* Should check here against the e820 map to avoid double free */ |
646 | 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 | 648 | #else |
649 | - reserve_bootmem(phys, len); | |
649 | + reserve_bootmem(phys, len, BOOTMEM_DEFAULT); | |
650 | 650 | #endif |
651 | 651 | if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) { |
652 | 652 | dma_reserve += len / PAGE_SIZE; |
arch/x86/mm/numa_64.c
... | ... | @@ -238,9 +238,10 @@ |
238 | 238 | |
239 | 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 | 243 | reserve_bootmem_node(NODE_DATA(nodeid), bootmap_start, |
243 | - bootmap_pages<<PAGE_SHIFT); | |
244 | + bootmap_pages<<PAGE_SHIFT, BOOTMEM_DEFAULT); | |
244 | 245 | #ifdef CONFIG_ACPI_NUMA |
245 | 246 | srat_reserve_add_area(nodeid); |
246 | 247 | #endif |
arch/x86/mm/srat_64.c
... | ... | @@ -488,7 +488,8 @@ |
488 | 488 | printk(KERN_INFO "SRAT: This will cost you %Lu MB of " |
489 | 489 | "pre-allocated memory.\n", (unsigned long long)total_mb); |
490 | 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 |
include/asm-x86/mmzone_32.h
... | ... | @@ -107,8 +107,8 @@ |
107 | 107 | /* |
108 | 108 | * Following are macros that are specific to this numa platform. |
109 | 109 | */ |
110 | -#define reserve_bootmem(addr, size) \ | |
111 | - reserve_bootmem_node(NODE_DATA(0), (addr), (size)) | |
110 | +#define reserve_bootmem(addr, size, flags) \ | |
111 | + reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) | |
112 | 112 | #define alloc_bootmem(x) \ |
113 | 113 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) |
114 | 114 | #define alloc_bootmem_low(x) \ |
include/linux/bootmem.h
... | ... | @@ -60,8 +60,20 @@ |
60 | 60 | unsigned long goal, |
61 | 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 | 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 | 77 | #define alloc_bootmem(x) \ |
66 | 78 | __alloc_bootmem(x, SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) |
67 | 79 | #define alloc_bootmem_low(x) \ |
... | ... | @@ -84,7 +96,8 @@ |
84 | 96 | unsigned long endpfn); |
85 | 97 | extern void reserve_bootmem_node(pg_data_t *pgdat, |
86 | 98 | unsigned long physaddr, |
87 | - unsigned long size); | |
99 | + unsigned long size, | |
100 | + int flags); | |
88 | 101 | extern void free_bootmem_node(pg_data_t *pgdat, |
89 | 102 | unsigned long addr, |
90 | 103 | unsigned long size); |
mm/bootmem.c
... | ... | @@ -111,11 +111,12 @@ |
111 | 111 | * might be used for boot-time allocations - or it might get added |
112 | 112 | * to the free page pool later on. |
113 | 113 | */ |
114 | -static void __init reserve_bootmem_core(bootmem_data_t *bdata, unsigned long addr, | |
115 | - unsigned long size) | |
114 | +static int __init reserve_bootmem_core(bootmem_data_t *bdata, | |
115 | + unsigned long addr, unsigned long size, int flags) | |
116 | 116 | { |
117 | 117 | unsigned long sidx, eidx; |
118 | 118 | unsigned long i; |
119 | + int ret; | |
119 | 120 | |
120 | 121 | /* |
121 | 122 | * round up, partially reserved pages are considered |
122 | 123 | |
... | ... | @@ -133,7 +134,20 @@ |
133 | 134 | #ifdef CONFIG_DEBUG_BOOTMEM |
134 | 135 | printk("hm, page %08lx reserved twice.\n", i*PAGE_SIZE); |
135 | 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 | 153 | static void __init free_bootmem_core(bootmem_data_t *bdata, unsigned long addr, |
140 | 154 | |
... | ... | @@ -374,9 +388,9 @@ |
374 | 388 | } |
375 | 389 | |
376 | 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 | 396 | void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr, |
383 | 397 | |
... | ... | @@ -398,9 +412,10 @@ |
398 | 412 | } |
399 | 413 | |
400 | 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 | 420 | #endif /* !CONFIG_HAVE_ARCH_BOOTMEM_NODE */ |
406 | 421 |