aboutsummaryrefslogtreecommitdiffstats
path: root/mm/bootmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/bootmem.c')
-rw-r--r--mm/bootmem.c206
1 files changed, 114 insertions, 92 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c
index d213feded10d..d53112fcb404 100644
--- a/mm/bootmem.c
+++ b/mm/bootmem.c
@@ -8,17 +8,15 @@
8 * free memory collector. It's used to deal with reserved 8 * free memory collector. It's used to deal with reserved
9 * system memory and memory holes as well. 9 * system memory and memory holes as well.
10 */ 10 */
11
12#include <linux/mm.h>
13#include <linux/kernel_stat.h>
14#include <linux/swap.h>
15#include <linux/interrupt.h>
16#include <linux/init.h> 11#include <linux/init.h>
12#include <linux/pfn.h>
17#include <linux/bootmem.h> 13#include <linux/bootmem.h>
18#include <linux/mmzone.h>
19#include <linux/module.h> 14#include <linux/module.h>
20#include <asm/dma.h> 15
16#include <asm/bug.h>
21#include <asm/io.h> 17#include <asm/io.h>
18#include <asm/processor.h>
19
22#include "internal.h" 20#include "internal.h"
23 21
24/* 22/*
@@ -29,9 +27,7 @@ unsigned long max_low_pfn;
29unsigned long min_low_pfn; 27unsigned long min_low_pfn;
30unsigned long max_pfn; 28unsigned long max_pfn;
31 29
32EXPORT_SYMBOL(max_pfn); /* This is exported so 30EXPORT_UNUSED_SYMBOL(max_pfn); /* June 2006 */
33 * dma_get_required_mask(), which uses
34 * it, can be an inline function */
35 31
36static LIST_HEAD(bdata_list); 32static LIST_HEAD(bdata_list);
37#ifdef CONFIG_CRASH_DUMP 33#ifdef CONFIG_CRASH_DUMP
@@ -43,7 +39,7 @@ unsigned long saved_max_pfn;
43#endif 39#endif
44 40
45/* return the number of _pages_ that will be allocated for the boot bitmap */ 41/* return the number of _pages_ that will be allocated for the boot bitmap */
46unsigned long __init bootmem_bootmap_pages (unsigned long pages) 42unsigned long __init bootmem_bootmap_pages(unsigned long pages)
47{ 43{
48 unsigned long mapsize; 44 unsigned long mapsize;
49 45
@@ -53,12 +49,14 @@ unsigned long __init bootmem_bootmap_pages (unsigned long pages)
53 49
54 return mapsize; 50 return mapsize;
55} 51}
52
56/* 53/*
57 * link bdata in order 54 * link bdata in order
58 */ 55 */
59static void link_bootmem(bootmem_data_t *bdata) 56static void __init link_bootmem(bootmem_data_t *bdata)
60{ 57{
61 bootmem_data_t *ent; 58 bootmem_data_t *ent;
59
62 if (list_empty(&bdata_list)) { 60 if (list_empty(&bdata_list)) {
63 list_add(&bdata->list, &bdata_list); 61 list_add(&bdata->list, &bdata_list);
64 return; 62 return;
@@ -71,22 +69,32 @@ static void link_bootmem(bootmem_data_t *bdata)
71 } 69 }
72 } 70 }
73 list_add_tail(&bdata->list, &bdata_list); 71 list_add_tail(&bdata->list, &bdata_list);
74 return;
75} 72}
76 73
74/*
75 * Given an initialised bdata, it returns the size of the boot bitmap
76 */
77static unsigned long __init get_mapsize(bootmem_data_t *bdata)
78{
79 unsigned long mapsize;
80 unsigned long start = PFN_DOWN(bdata->node_boot_start);
81 unsigned long end = bdata->node_low_pfn;
82
83 mapsize = ((end - start) + 7) / 8;
84 return ALIGN(mapsize, sizeof(long));
85}
77 86
78/* 87/*
79 * Called once to set up the allocator itself. 88 * Called once to set up the allocator itself.
80 */ 89 */
81static unsigned long __init init_bootmem_core (pg_data_t *pgdat, 90static unsigned long __init init_bootmem_core(pg_data_t *pgdat,
82 unsigned long mapstart, unsigned long start, unsigned long end) 91 unsigned long mapstart, unsigned long start, unsigned long end)
83{ 92{
84 bootmem_data_t *bdata = pgdat->bdata; 93 bootmem_data_t *bdata = pgdat->bdata;
85 unsigned long mapsize = ((end - start)+7)/8; 94 unsigned long mapsize;
86 95
87 mapsize = ALIGN(mapsize, sizeof(long)); 96 bdata->node_bootmem_map = phys_to_virt(PFN_PHYS(mapstart));
88 bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT); 97 bdata->node_boot_start = PFN_PHYS(start);
89 bdata->node_boot_start = (start << PAGE_SHIFT);
90 bdata->node_low_pfn = end; 98 bdata->node_low_pfn = end;
91 link_bootmem(bdata); 99 link_bootmem(bdata);
92 100
@@ -94,6 +102,7 @@ static unsigned long __init init_bootmem_core (pg_data_t *pgdat,
94 * Initially all pages are reserved - setup_arch() has to 102 * Initially all pages are reserved - setup_arch() has to
95 * register free RAM areas explicitly. 103 * register free RAM areas explicitly.
96 */ 104 */
105 mapsize = get_mapsize(bdata);
97 memset(bdata->node_bootmem_map, 0xff, mapsize); 106 memset(bdata->node_bootmem_map, 0xff, mapsize);
98 107
99 return mapsize; 108 return mapsize;
@@ -104,22 +113,22 @@ static unsigned long __init init_bootmem_core (pg_data_t *pgdat,
104 * might be used for boot-time allocations - or it might get added 113 * might be used for boot-time allocations - or it might get added
105 * to the free page pool later on. 114 * to the free page pool later on.
106 */ 115 */
107static void __init reserve_bootmem_core(bootmem_data_t *bdata, unsigned long addr, unsigned long size) 116static void __init reserve_bootmem_core(bootmem_data_t *bdata, unsigned long addr,
117 unsigned long size)
108{ 118{
119 unsigned long sidx, eidx;
109 unsigned long i; 120 unsigned long i;
121
110 /* 122 /*
111 * round up, partially reserved pages are considered 123 * round up, partially reserved pages are considered
112 * fully reserved. 124 * fully reserved.
113 */ 125 */
114 unsigned long sidx = (addr - bdata->node_boot_start)/PAGE_SIZE;
115 unsigned long eidx = (addr + size - bdata->node_boot_start +
116 PAGE_SIZE-1)/PAGE_SIZE;
117 unsigned long end = (addr + size + PAGE_SIZE-1)/PAGE_SIZE;
118
119 BUG_ON(!size); 126 BUG_ON(!size);
120 BUG_ON(sidx >= eidx); 127 BUG_ON(PFN_DOWN(addr) >= bdata->node_low_pfn);
121 BUG_ON((addr >> PAGE_SHIFT) >= bdata->node_low_pfn); 128 BUG_ON(PFN_UP(addr + size) > bdata->node_low_pfn);
122 BUG_ON(end > bdata->node_low_pfn); 129
130 sidx = PFN_DOWN(addr - bdata->node_boot_start);
131 eidx = PFN_UP(addr + size - bdata->node_boot_start);
123 132
124 for (i = sidx; i < eidx; i++) 133 for (i = sidx; i < eidx; i++)
125 if (test_and_set_bit(i, bdata->node_bootmem_map)) { 134 if (test_and_set_bit(i, bdata->node_bootmem_map)) {
@@ -129,20 +138,18 @@ static void __init reserve_bootmem_core(bootmem_data_t *bdata, unsigned long add
129 } 138 }
130} 139}
131 140
132static void __init free_bootmem_core(bootmem_data_t *bdata, unsigned long addr, unsigned long size) 141static void __init free_bootmem_core(bootmem_data_t *bdata, unsigned long addr,
142 unsigned long size)
133{ 143{
144 unsigned long sidx, eidx;
134 unsigned long i; 145 unsigned long i;
135 unsigned long start; 146
136 /* 147 /*
137 * round down end of usable mem, partially free pages are 148 * round down end of usable mem, partially free pages are
138 * considered reserved. 149 * considered reserved.
139 */ 150 */
140 unsigned long sidx;
141 unsigned long eidx = (addr + size - bdata->node_boot_start)/PAGE_SIZE;
142 unsigned long end = (addr + size)/PAGE_SIZE;
143
144 BUG_ON(!size); 151 BUG_ON(!size);
145 BUG_ON(end > bdata->node_low_pfn); 152 BUG_ON(PFN_DOWN(addr + size) > bdata->node_low_pfn);
146 153
147 if (addr < bdata->last_success) 154 if (addr < bdata->last_success)
148 bdata->last_success = addr; 155 bdata->last_success = addr;
@@ -150,8 +157,8 @@ static void __init free_bootmem_core(bootmem_data_t *bdata, unsigned long addr,
150 /* 157 /*
151 * Round up the beginning of the address. 158 * Round up the beginning of the address.
152 */ 159 */
153 start = (addr + PAGE_SIZE-1) / PAGE_SIZE; 160 sidx = PFN_UP(addr) - PFN_DOWN(bdata->node_boot_start);
154 sidx = start - (bdata->node_boot_start/PAGE_SIZE); 161 eidx = PFN_DOWN(addr + size - bdata->node_boot_start);
155 162
156 for (i = sidx; i < eidx; i++) { 163 for (i = sidx; i < eidx; i++) {
157 if (unlikely(!test_and_clear_bit(i, bdata->node_bootmem_map))) 164 if (unlikely(!test_and_clear_bit(i, bdata->node_bootmem_map)))
@@ -177,10 +184,10 @@ __alloc_bootmem_core(struct bootmem_data *bdata, unsigned long size,
177 unsigned long align, unsigned long goal, unsigned long limit) 184 unsigned long align, unsigned long goal, unsigned long limit)
178{ 185{
179 unsigned long offset, remaining_size, areasize, preferred; 186 unsigned long offset, remaining_size, areasize, preferred;
180 unsigned long i, start = 0, incr, eidx, end_pfn = bdata->node_low_pfn; 187 unsigned long i, start = 0, incr, eidx, end_pfn;
181 void *ret; 188 void *ret;
182 189
183 if(!size) { 190 if (!size) {
184 printk("__alloc_bootmem_core(): zero-sized request\n"); 191 printk("__alloc_bootmem_core(): zero-sized request\n");
185 BUG(); 192 BUG();
186 } 193 }
@@ -189,23 +196,22 @@ __alloc_bootmem_core(struct bootmem_data *bdata, unsigned long size,
189 if (limit && bdata->node_boot_start >= limit) 196 if (limit && bdata->node_boot_start >= limit)
190 return NULL; 197 return NULL;
191 198
192 limit >>=PAGE_SHIFT; 199 end_pfn = bdata->node_low_pfn;
200 limit = PFN_DOWN(limit);
193 if (limit && end_pfn > limit) 201 if (limit && end_pfn > limit)
194 end_pfn = limit; 202 end_pfn = limit;
195 203
196 eidx = end_pfn - (bdata->node_boot_start >> PAGE_SHIFT); 204 eidx = end_pfn - PFN_DOWN(bdata->node_boot_start);
197 offset = 0; 205 offset = 0;
198 if (align && 206 if (align && (bdata->node_boot_start & (align - 1UL)) != 0)
199 (bdata->node_boot_start & (align - 1UL)) != 0) 207 offset = align - (bdata->node_boot_start & (align - 1UL));
200 offset = (align - (bdata->node_boot_start & (align - 1UL))); 208 offset = PFN_DOWN(offset);
201 offset >>= PAGE_SHIFT;
202 209
203 /* 210 /*
204 * We try to allocate bootmem pages above 'goal' 211 * We try to allocate bootmem pages above 'goal'
205 * first, then we try to allocate lower pages. 212 * first, then we try to allocate lower pages.
206 */ 213 */
207 if (goal && (goal >= bdata->node_boot_start) && 214 if (goal && goal >= bdata->node_boot_start && PFN_DOWN(goal) < end_pfn) {
208 ((goal >> PAGE_SHIFT) < end_pfn)) {
209 preferred = goal - bdata->node_boot_start; 215 preferred = goal - bdata->node_boot_start;
210 216
211 if (bdata->last_success >= preferred) 217 if (bdata->last_success >= preferred)
@@ -214,9 +220,8 @@ __alloc_bootmem_core(struct bootmem_data *bdata, unsigned long size,
214 } else 220 } else
215 preferred = 0; 221 preferred = 0;
216 222
217 preferred = ALIGN(preferred, align) >> PAGE_SHIFT; 223 preferred = PFN_DOWN(ALIGN(preferred, align)) + offset;
218 preferred += offset; 224 areasize = (size + PAGE_SIZE-1) / PAGE_SIZE;
219 areasize = (size+PAGE_SIZE-1)/PAGE_SIZE;
220 incr = align >> PAGE_SHIFT ? : 1; 225 incr = align >> PAGE_SHIFT ? : 1;
221 226
222restart_scan: 227restart_scan:
@@ -231,7 +236,7 @@ restart_scan:
231 for (j = i + 1; j < i + areasize; ++j) { 236 for (j = i + 1; j < i + areasize; ++j) {
232 if (j >= eidx) 237 if (j >= eidx)
233 goto fail_block; 238 goto fail_block;
234 if (test_bit (j, bdata->node_bootmem_map)) 239 if (test_bit(j, bdata->node_bootmem_map))
235 goto fail_block; 240 goto fail_block;
236 } 241 }
237 start = i; 242 start = i;
@@ -247,7 +252,7 @@ restart_scan:
247 return NULL; 252 return NULL;
248 253
249found: 254found:
250 bdata->last_success = start << PAGE_SHIFT; 255 bdata->last_success = PFN_PHYS(start);
251 BUG_ON(start >= eidx); 256 BUG_ON(start >= eidx);
252 257
253 /* 258 /*
@@ -259,19 +264,21 @@ found:
259 bdata->last_offset && bdata->last_pos+1 == start) { 264 bdata->last_offset && bdata->last_pos+1 == start) {
260 offset = ALIGN(bdata->last_offset, align); 265 offset = ALIGN(bdata->last_offset, align);
261 BUG_ON(offset > PAGE_SIZE); 266 BUG_ON(offset > PAGE_SIZE);
262 remaining_size = PAGE_SIZE-offset; 267 remaining_size = PAGE_SIZE - offset;
263 if (size < remaining_size) { 268 if (size < remaining_size) {
264 areasize = 0; 269 areasize = 0;
265 /* last_pos unchanged */ 270 /* last_pos unchanged */
266 bdata->last_offset = offset+size; 271 bdata->last_offset = offset + size;
267 ret = phys_to_virt(bdata->last_pos*PAGE_SIZE + offset + 272 ret = phys_to_virt(bdata->last_pos * PAGE_SIZE +
268 bdata->node_boot_start); 273 offset +
274 bdata->node_boot_start);
269 } else { 275 } else {
270 remaining_size = size - remaining_size; 276 remaining_size = size - remaining_size;
271 areasize = (remaining_size+PAGE_SIZE-1)/PAGE_SIZE; 277 areasize = (remaining_size + PAGE_SIZE-1) / PAGE_SIZE;
272 ret = phys_to_virt(bdata->last_pos*PAGE_SIZE + offset + 278 ret = phys_to_virt(bdata->last_pos * PAGE_SIZE +
273 bdata->node_boot_start); 279 offset +
274 bdata->last_pos = start+areasize-1; 280 bdata->node_boot_start);
281 bdata->last_pos = start + areasize - 1;
275 bdata->last_offset = remaining_size; 282 bdata->last_offset = remaining_size;
276 } 283 }
277 bdata->last_offset &= ~PAGE_MASK; 284 bdata->last_offset &= ~PAGE_MASK;
@@ -284,7 +291,7 @@ found:
284 /* 291 /*
285 * Reserve the area now: 292 * Reserve the area now:
286 */ 293 */
287 for (i = start; i < start+areasize; i++) 294 for (i = start; i < start + areasize; i++)
288 if (unlikely(test_and_set_bit(i, bdata->node_bootmem_map))) 295 if (unlikely(test_and_set_bit(i, bdata->node_bootmem_map)))
289 BUG(); 296 BUG();
290 memset(ret, 0, size); 297 memset(ret, 0, size);
@@ -305,8 +312,8 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat)
305 312
306 count = 0; 313 count = 0;
307 /* first extant page of the node */ 314 /* first extant page of the node */
308 pfn = bdata->node_boot_start >> PAGE_SHIFT; 315 pfn = PFN_DOWN(bdata->node_boot_start);
309 idx = bdata->node_low_pfn - (bdata->node_boot_start >> PAGE_SHIFT); 316 idx = bdata->node_low_pfn - pfn;
310 map = bdata->node_bootmem_map; 317 map = bdata->node_bootmem_map;
311 /* Check physaddr is O(LOG2(BITS_PER_LONG)) page aligned */ 318 /* Check physaddr is O(LOG2(BITS_PER_LONG)) page aligned */
312 if (bdata->node_boot_start == 0 || 319 if (bdata->node_boot_start == 0 ||
@@ -335,7 +342,7 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat)
335 } 342 }
336 } 343 }
337 } else { 344 } else {
338 i+=BITS_PER_LONG; 345 i += BITS_PER_LONG;
339 } 346 }
340 pfn += BITS_PER_LONG; 347 pfn += BITS_PER_LONG;
341 } 348 }
@@ -347,9 +354,10 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat)
347 */ 354 */
348 page = virt_to_page(bdata->node_bootmem_map); 355 page = virt_to_page(bdata->node_bootmem_map);
349 count = 0; 356 count = 0;
350 for (i = 0; i < ((bdata->node_low_pfn-(bdata->node_boot_start >> PAGE_SHIFT))/8 + PAGE_SIZE-1)/PAGE_SIZE; i++,page++) { 357 idx = (get_mapsize(bdata) + PAGE_SIZE-1) >> PAGE_SHIFT;
351 count++; 358 for (i = 0; i < idx; i++, page++) {
352 __free_pages_bootmem(page, 0); 359 __free_pages_bootmem(page, 0);
360 count++;
353 } 361 }
354 total += count; 362 total += count;
355 bdata->node_bootmem_map = NULL; 363 bdata->node_bootmem_map = NULL;
@@ -357,64 +365,72 @@ static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat)
357 return total; 365 return total;
358} 366}
359 367
360unsigned long __init init_bootmem_node (pg_data_t *pgdat, unsigned long freepfn, unsigned long startpfn, unsigned long endpfn) 368unsigned long __init init_bootmem_node(pg_data_t *pgdat, unsigned long freepfn,
369 unsigned long startpfn, unsigned long endpfn)
361{ 370{
362 return(init_bootmem_core(pgdat, freepfn, startpfn, endpfn)); 371 return init_bootmem_core(pgdat, freepfn, startpfn, endpfn);
363} 372}
364 373
365void __init reserve_bootmem_node (pg_data_t *pgdat, unsigned long physaddr, unsigned long size) 374void __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
375 unsigned long size)
366{ 376{
367 reserve_bootmem_core(pgdat->bdata, physaddr, size); 377 reserve_bootmem_core(pgdat->bdata, physaddr, size);
368} 378}
369 379
370void __init free_bootmem_node (pg_data_t *pgdat, unsigned long physaddr, unsigned long size) 380void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
381 unsigned long size)
371{ 382{
372 free_bootmem_core(pgdat->bdata, physaddr, size); 383 free_bootmem_core(pgdat->bdata, physaddr, size);
373} 384}
374 385
375unsigned long __init free_all_bootmem_node (pg_data_t *pgdat) 386unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)
376{ 387{
377 return(free_all_bootmem_core(pgdat)); 388 return free_all_bootmem_core(pgdat);
378} 389}
379 390
380unsigned long __init init_bootmem (unsigned long start, unsigned long pages) 391unsigned long __init init_bootmem(unsigned long start, unsigned long pages)
381{ 392{
382 max_low_pfn = pages; 393 max_low_pfn = pages;
383 min_low_pfn = start; 394 min_low_pfn = start;
384 return(init_bootmem_core(NODE_DATA(0), start, 0, pages)); 395 return init_bootmem_core(NODE_DATA(0), start, 0, pages);
385} 396}
386 397
387#ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE 398#ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE
388void __init reserve_bootmem (unsigned long addr, unsigned long size) 399void __init reserve_bootmem(unsigned long addr, unsigned long size)
389{ 400{
390 reserve_bootmem_core(NODE_DATA(0)->bdata, addr, size); 401 reserve_bootmem_core(NODE_DATA(0)->bdata, addr, size);
391} 402}
392#endif /* !CONFIG_HAVE_ARCH_BOOTMEM_NODE */ 403#endif /* !CONFIG_HAVE_ARCH_BOOTMEM_NODE */
393 404
394void __init free_bootmem (unsigned long addr, unsigned long size) 405void __init free_bootmem(unsigned long addr, unsigned long size)
395{ 406{
396 free_bootmem_core(NODE_DATA(0)->bdata, addr, size); 407 free_bootmem_core(NODE_DATA(0)->bdata, addr, size);
397} 408}
398 409
399unsigned long __init free_all_bootmem (void) 410unsigned long __init free_all_bootmem(void)
400{ 411{
401 return(free_all_bootmem_core(NODE_DATA(0))); 412 return free_all_bootmem_core(NODE_DATA(0));
402} 413}
403 414
404void * __init __alloc_bootmem_nopanic(unsigned long size, unsigned long align, unsigned long goal) 415void * __init __alloc_bootmem_nopanic(unsigned long size, unsigned long align,
416 unsigned long goal)
405{ 417{
406 bootmem_data_t *bdata; 418 bootmem_data_t *bdata;
407 void *ptr; 419 void *ptr;
408 420
409 list_for_each_entry(bdata, &bdata_list, list) 421 list_for_each_entry(bdata, &bdata_list, list) {
410 if ((ptr = __alloc_bootmem_core(bdata, size, align, goal, 0))) 422 ptr = __alloc_bootmem_core(bdata, size, align, goal, 0);
411 return(ptr); 423 if (ptr)
424 return ptr;
425 }
412 return NULL; 426 return NULL;
413} 427}
414 428
415void * __init __alloc_bootmem(unsigned long size, unsigned long align, unsigned long goal) 429void * __init __alloc_bootmem(unsigned long size, unsigned long align,
430 unsigned long goal)
416{ 431{
417 void *mem = __alloc_bootmem_nopanic(size,align,goal); 432 void *mem = __alloc_bootmem_nopanic(size,align,goal);
433
418 if (mem) 434 if (mem)
419 return mem; 435 return mem;
420 /* 436 /*
@@ -426,29 +442,34 @@ void * __init __alloc_bootmem(unsigned long size, unsigned long align, unsigned
426} 442}
427 443
428 444
429void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size, unsigned long align, 445void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size,
430 unsigned long goal) 446 unsigned long align, unsigned long goal)
431{ 447{
432 void *ptr; 448 void *ptr;
433 449
434 ptr = __alloc_bootmem_core(pgdat->bdata, size, align, goal, 0); 450 ptr = __alloc_bootmem_core(pgdat->bdata, size, align, goal, 0);
435 if (ptr) 451 if (ptr)
436 return (ptr); 452 return ptr;
437 453
438 return __alloc_bootmem(size, align, goal); 454 return __alloc_bootmem(size, align, goal);
439} 455}
440 456
441#define LOW32LIMIT 0xffffffff 457#ifndef ARCH_LOW_ADDRESS_LIMIT
458#define ARCH_LOW_ADDRESS_LIMIT 0xffffffffUL
459#endif
442 460
443void * __init __alloc_bootmem_low(unsigned long size, unsigned long align, unsigned long goal) 461void * __init __alloc_bootmem_low(unsigned long size, unsigned long align,
462 unsigned long goal)
444{ 463{
445 bootmem_data_t *bdata; 464 bootmem_data_t *bdata;
446 void *ptr; 465 void *ptr;
447 466
448 list_for_each_entry(bdata, &bdata_list, list) 467 list_for_each_entry(bdata, &bdata_list, list) {
449 if ((ptr = __alloc_bootmem_core(bdata, size, 468 ptr = __alloc_bootmem_core(bdata, size, align, goal,
450 align, goal, LOW32LIMIT))) 469 ARCH_LOW_ADDRESS_LIMIT);
451 return(ptr); 470 if (ptr)
471 return ptr;
472 }
452 473
453 /* 474 /*
454 * Whoops, we cannot satisfy the allocation request. 475 * Whoops, we cannot satisfy the allocation request.
@@ -461,5 +482,6 @@ void * __init __alloc_bootmem_low(unsigned long size, unsigned long align, unsig
461void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size, 482void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size,
462 unsigned long align, unsigned long goal) 483 unsigned long align, unsigned long goal)
463{ 484{
464 return __alloc_bootmem_core(pgdat->bdata, size, align, goal, LOW32LIMIT); 485 return __alloc_bootmem_core(pgdat->bdata, size, align, goal,
486 ARCH_LOW_ADDRESS_LIMIT);
465} 487}