Commit 72a7fe3967dbf86cb34e24fbf1d957fe24d2f246

Authored by Bernhard Walle
Committed by Linus Torvalds
1 parent 25fad945a7

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
... ... @@ -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 */
... ... @@ -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 }
... ... @@ -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 /*
... ... @@ -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
... ... @@ -207,7 +207,7 @@
207 207 return;
208 208 }
209 209 if (rg.paddr)
210   - reserve_bootmem(rg.paddr, rg.size);
  210 + reserve_bootmem(rg.paddr, rg.size, BOOTMEM_DEFAULT);
211 211 reserved += rg.size;
212 212 omapfb_config.mem_desc.region[i] = rg;
213 213 configured_regions++;
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
... ... @@ -406,7 +406,7 @@
406 406 */
407 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 411 * get kmalloc into gear
412 412 */
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
... ... @@ -154,7 +154,7 @@
154 154 /* always reserve first page of ST-RAM, the first 2 kB are
155 155 * supervisor-only! */
156 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  
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
... ... @@ -675,7 +675,7 @@
675 675 dbg("reserve_bootmem %lx %lx\n", physbase,
676 676 size);
677 677 reserve_bootmem_node(NODE_DATA(nid), physbase,
678   - size);
  678 + size, BOOTMEM_DEFAULT);
679 679 }
680 680 }
681 681  
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;
... ... @@ -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);
... ... @@ -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