diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 21:05:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 21:05:31 -0400 |
commit | 7d36014b972a3833b883a7ef41e6bd3b0d187850 (patch) | |
tree | 5c828b0de1cd357288135cc04461d31386b89c26 /mm/nobootmem.c | |
parent | 442a9ffabb21f175027e93e72ea05159818271a6 (diff) | |
parent | ecb41a77411358d385e3fde5b4e98a5f3d9cfdd5 (diff) |
Merge branch 'akpm' (Andrew's patch-bomb)
Merge patches through Andrew Morton:
"180 patches - err 181 - listed below:
- most of MM. I held back the (large) "memcg: add hugetlb extension"
series because a bunfight has recently broken out.
- leds. After this, Bryan Wu will be handling drivers/leds/
- backlight
- lib/
- rtc"
* emailed from Andrew Morton <akpm@linux-foundation.org>: (181 patches)
drivers/rtc/rtc-s3c.c: fix compiler warning
drivers/rtc/rtc-tegra.c: clean up probe/remove routines
drivers/rtc/rtc-pl031.c: remove RTC timer interrupt handling
drivers/rtc/rtc-lpc32xx.c: add device tree support
drivers/rtc/rtc-m41t93.c: don't let get_time() reset M41T93_FLAG_OF
rtc: ds1307: add trickle charger support
rtc: ds1307: remove superfluous initialization
rtc: rename CONFIG_RTC_MXC to CONFIG_RTC_DRV_MXC
drivers/rtc/Kconfig: place RTC_DRV_IMXDI and RTC_MXC under "on-CPU RTC drivers"
drivers/rtc/rtc-pcf8563.c: add RTC_VL_READ/RTC_VL_CLR ioctl feature
rtc: add ioctl to get/clear battery low voltage status
drivers/rtc/rtc-ep93xx.c: convert to use module_platform_driver()
rtc/spear: add Device Tree probing capability
lib/vsprintf.c: "%#o",0 becomes '0' instead of '00'
radix-tree: fix preload vector size
spinlock_debug: print kallsyms name for lock
vsprintf: fix %ps on non symbols when using kallsyms
lib/bitmap.c: fix documentation for scnprintf() functions
lib/string_helpers.c: make arrays static
lib/test-kstrtox.c: mark const init data with __initconst instead of __initdata
...
Diffstat (limited to 'mm/nobootmem.c')
-rw-r--r-- | mm/nobootmem.c | 112 |
1 files changed, 52 insertions, 60 deletions
diff --git a/mm/nobootmem.c b/mm/nobootmem.c index 1983fb1c7026..d23415c001bc 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c | |||
@@ -274,86 +274,85 @@ void * __init __alloc_bootmem(unsigned long size, unsigned long align, | |||
274 | return ___alloc_bootmem(size, align, goal, limit); | 274 | return ___alloc_bootmem(size, align, goal, limit); |
275 | } | 275 | } |
276 | 276 | ||
277 | /** | 277 | static void * __init ___alloc_bootmem_node_nopanic(pg_data_t *pgdat, |
278 | * __alloc_bootmem_node - allocate boot memory from a specific node | 278 | unsigned long size, |
279 | * @pgdat: node to allocate from | 279 | unsigned long align, |
280 | * @size: size of the request in bytes | 280 | unsigned long goal, |
281 | * @align: alignment of the region | 281 | unsigned long limit) |
282 | * @goal: preferred starting address of the region | ||
283 | * | ||
284 | * The goal is dropped if it can not be satisfied and the allocation will | ||
285 | * fall back to memory below @goal. | ||
286 | * | ||
287 | * Allocation may fall back to any node in the system if the specified node | ||
288 | * can not hold the requested memory. | ||
289 | * | ||
290 | * The function panics if the request can not be satisfied. | ||
291 | */ | ||
292 | void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size, | ||
293 | unsigned long align, unsigned long goal) | ||
294 | { | 282 | { |
295 | void *ptr; | 283 | void *ptr; |
296 | 284 | ||
297 | if (WARN_ON_ONCE(slab_is_available())) | ||
298 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); | ||
299 | |||
300 | again: | 285 | again: |
301 | ptr = __alloc_memory_core_early(pgdat->node_id, size, align, | 286 | ptr = __alloc_memory_core_early(pgdat->node_id, size, align, |
302 | goal, -1ULL); | 287 | goal, limit); |
303 | if (ptr) | 288 | if (ptr) |
304 | return ptr; | 289 | return ptr; |
305 | 290 | ||
306 | ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align, | 291 | ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align, |
307 | goal, -1ULL); | 292 | goal, limit); |
308 | if (!ptr && goal) { | 293 | if (ptr) |
294 | return ptr; | ||
295 | |||
296 | if (goal) { | ||
309 | goal = 0; | 297 | goal = 0; |
310 | goto again; | 298 | goto again; |
311 | } | 299 | } |
312 | return ptr; | 300 | |
301 | return NULL; | ||
313 | } | 302 | } |
314 | 303 | ||
315 | void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size, | 304 | void * __init __alloc_bootmem_node_nopanic(pg_data_t *pgdat, unsigned long size, |
316 | unsigned long align, unsigned long goal) | 305 | unsigned long align, unsigned long goal) |
317 | { | 306 | { |
318 | return __alloc_bootmem_node(pgdat, size, align, goal); | 307 | if (WARN_ON_ONCE(slab_is_available())) |
308 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); | ||
309 | |||
310 | return ___alloc_bootmem_node_nopanic(pgdat, size, align, goal, 0); | ||
319 | } | 311 | } |
320 | 312 | ||
321 | #ifdef CONFIG_SPARSEMEM | 313 | void * __init ___alloc_bootmem_node(pg_data_t *pgdat, unsigned long size, |
322 | /** | 314 | unsigned long align, unsigned long goal, |
323 | * alloc_bootmem_section - allocate boot memory from a specific section | 315 | unsigned long limit) |
324 | * @size: size of the request in bytes | ||
325 | * @section_nr: sparse map section to allocate from | ||
326 | * | ||
327 | * Return NULL on failure. | ||
328 | */ | ||
329 | void * __init alloc_bootmem_section(unsigned long size, | ||
330 | unsigned long section_nr) | ||
331 | { | 316 | { |
332 | unsigned long pfn, goal, limit; | 317 | void *ptr; |
333 | 318 | ||
334 | pfn = section_nr_to_pfn(section_nr); | 319 | ptr = ___alloc_bootmem_node_nopanic(pgdat, size, align, goal, limit); |
335 | goal = pfn << PAGE_SHIFT; | 320 | if (ptr) |
336 | limit = section_nr_to_pfn(section_nr + 1) << PAGE_SHIFT; | 321 | return ptr; |
337 | 322 | ||
338 | return __alloc_memory_core_early(early_pfn_to_nid(pfn), size, | 323 | printk(KERN_ALERT "bootmem alloc of %lu bytes failed!\n", size); |
339 | SMP_CACHE_BYTES, goal, limit); | 324 | panic("Out of memory"); |
325 | return NULL; | ||
340 | } | 326 | } |
341 | #endif | ||
342 | 327 | ||
343 | void * __init __alloc_bootmem_node_nopanic(pg_data_t *pgdat, unsigned long size, | 328 | /** |
329 | * __alloc_bootmem_node - allocate boot memory from a specific node | ||
330 | * @pgdat: node to allocate from | ||
331 | * @size: size of the request in bytes | ||
332 | * @align: alignment of the region | ||
333 | * @goal: preferred starting address of the region | ||
334 | * | ||
335 | * The goal is dropped if it can not be satisfied and the allocation will | ||
336 | * fall back to memory below @goal. | ||
337 | * | ||
338 | * Allocation may fall back to any node in the system if the specified node | ||
339 | * can not hold the requested memory. | ||
340 | * | ||
341 | * The function panics if the request can not be satisfied. | ||
342 | */ | ||
343 | void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size, | ||
344 | unsigned long align, unsigned long goal) | 344 | unsigned long align, unsigned long goal) |
345 | { | 345 | { |
346 | void *ptr; | ||
347 | |||
348 | if (WARN_ON_ONCE(slab_is_available())) | 346 | if (WARN_ON_ONCE(slab_is_available())) |
349 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); | 347 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); |
350 | 348 | ||
351 | ptr = __alloc_memory_core_early(pgdat->node_id, size, align, | 349 | return ___alloc_bootmem_node(pgdat, size, align, goal, 0); |
352 | goal, -1ULL); | 350 | } |
353 | if (ptr) | ||
354 | return ptr; | ||
355 | 351 | ||
356 | return __alloc_bootmem_nopanic(size, align, goal); | 352 | void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size, |
353 | unsigned long align, unsigned long goal) | ||
354 | { | ||
355 | return __alloc_bootmem_node(pgdat, size, align, goal); | ||
357 | } | 356 | } |
358 | 357 | ||
359 | #ifndef ARCH_LOW_ADDRESS_LIMIT | 358 | #ifndef ARCH_LOW_ADDRESS_LIMIT |
@@ -397,16 +396,9 @@ void * __init __alloc_bootmem_low(unsigned long size, unsigned long align, | |||
397 | void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size, | 396 | void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size, |
398 | unsigned long align, unsigned long goal) | 397 | unsigned long align, unsigned long goal) |
399 | { | 398 | { |
400 | void *ptr; | ||
401 | |||
402 | if (WARN_ON_ONCE(slab_is_available())) | 399 | if (WARN_ON_ONCE(slab_is_available())) |
403 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); | 400 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); |
404 | 401 | ||
405 | ptr = __alloc_memory_core_early(pgdat->node_id, size, align, | 402 | return ___alloc_bootmem_node(pgdat, size, align, goal, |
406 | goal, ARCH_LOW_ADDRESS_LIMIT); | 403 | ARCH_LOW_ADDRESS_LIMIT); |
407 | if (ptr) | ||
408 | return ptr; | ||
409 | |||
410 | return __alloc_memory_core_early(MAX_NUMNODES, size, align, | ||
411 | goal, ARCH_LOW_ADDRESS_LIMIT); | ||
412 | } | 404 | } |