diff options
author | Yinghai Lu <yinghai@kernel.org> | 2013-01-24 15:20:09 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2013-01-29 22:32:57 -0500 |
commit | 595ad9af8584908ea5fb698b836169d05b99f186 (patch) | |
tree | 851492cc2fa5c02b4b5122b7af154f7a8d7777c3 | |
parent | d1af6d045fba6b070fa81f54dfe9227214be99ea (diff) |
memblock: Add memblock_mem_size()
Use it to get mem size under the limit_pfn.
to replace local version in x86 reserved_initrd.
-v2: remove not needed cast that is pointed out by HPA.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Link: http://lkml.kernel.org/r/1359058816-7615-29-git-send-email-yinghai@kernel.org
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r-- | arch/x86/kernel/setup.c | 16 | ||||
-rw-r--r-- | include/linux/memblock.h | 1 | ||||
-rw-r--r-- | mm/memblock.c | 17 |
3 files changed, 19 insertions, 15 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index b80bee10982f..bbe8cdf7515e 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -363,20 +363,6 @@ static void __init relocate_initrd(void) | |||
363 | ramdisk_here, ramdisk_here + ramdisk_size - 1); | 363 | ramdisk_here, ramdisk_here + ramdisk_size - 1); |
364 | } | 364 | } |
365 | 365 | ||
366 | static u64 __init get_mem_size(unsigned long limit_pfn) | ||
367 | { | ||
368 | int i; | ||
369 | u64 mapped_pages = 0; | ||
370 | unsigned long start_pfn, end_pfn; | ||
371 | |||
372 | for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, NULL) { | ||
373 | start_pfn = min_t(unsigned long, start_pfn, limit_pfn); | ||
374 | end_pfn = min_t(unsigned long, end_pfn, limit_pfn); | ||
375 | mapped_pages += end_pfn - start_pfn; | ||
376 | } | ||
377 | |||
378 | return mapped_pages << PAGE_SHIFT; | ||
379 | } | ||
380 | static void __init early_reserve_initrd(void) | 366 | static void __init early_reserve_initrd(void) |
381 | { | 367 | { |
382 | /* Assume only end is not page aligned */ | 368 | /* Assume only end is not page aligned */ |
@@ -404,7 +390,7 @@ static void __init reserve_initrd(void) | |||
404 | 390 | ||
405 | initrd_start = 0; | 391 | initrd_start = 0; |
406 | 392 | ||
407 | mapped_size = get_mem_size(max_pfn_mapped); | 393 | mapped_size = memblock_mem_size(max_pfn_mapped); |
408 | if (ramdisk_size >= (mapped_size>>1)) | 394 | if (ramdisk_size >= (mapped_size>>1)) |
409 | panic("initrd too large to handle, " | 395 | panic("initrd too large to handle, " |
410 | "disabling initrd (%lld needed, %lld available)\n", | 396 | "disabling initrd (%lld needed, %lld available)\n", |
diff --git a/include/linux/memblock.h b/include/linux/memblock.h index d452ee191066..f388203db7e8 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h | |||
@@ -155,6 +155,7 @@ phys_addr_t memblock_alloc_base(phys_addr_t size, phys_addr_t align, | |||
155 | phys_addr_t __memblock_alloc_base(phys_addr_t size, phys_addr_t align, | 155 | phys_addr_t __memblock_alloc_base(phys_addr_t size, phys_addr_t align, |
156 | phys_addr_t max_addr); | 156 | phys_addr_t max_addr); |
157 | phys_addr_t memblock_phys_mem_size(void); | 157 | phys_addr_t memblock_phys_mem_size(void); |
158 | phys_addr_t memblock_mem_size(unsigned long limit_pfn); | ||
158 | phys_addr_t memblock_start_of_DRAM(void); | 159 | phys_addr_t memblock_start_of_DRAM(void); |
159 | phys_addr_t memblock_end_of_DRAM(void); | 160 | phys_addr_t memblock_end_of_DRAM(void); |
160 | void memblock_enforce_memory_limit(phys_addr_t memory_limit); | 161 | void memblock_enforce_memory_limit(phys_addr_t memory_limit); |
diff --git a/mm/memblock.c b/mm/memblock.c index 88adc8afb610..b8d9147e5c08 100644 --- a/mm/memblock.c +++ b/mm/memblock.c | |||
@@ -828,6 +828,23 @@ phys_addr_t __init memblock_phys_mem_size(void) | |||
828 | return memblock.memory.total_size; | 828 | return memblock.memory.total_size; |
829 | } | 829 | } |
830 | 830 | ||
831 | phys_addr_t __init memblock_mem_size(unsigned long limit_pfn) | ||
832 | { | ||
833 | unsigned long pages = 0; | ||
834 | struct memblock_region *r; | ||
835 | unsigned long start_pfn, end_pfn; | ||
836 | |||
837 | for_each_memblock(memory, r) { | ||
838 | start_pfn = memblock_region_memory_base_pfn(r); | ||
839 | end_pfn = memblock_region_memory_end_pfn(r); | ||
840 | start_pfn = min_t(unsigned long, start_pfn, limit_pfn); | ||
841 | end_pfn = min_t(unsigned long, end_pfn, limit_pfn); | ||
842 | pages += end_pfn - start_pfn; | ||
843 | } | ||
844 | |||
845 | return (phys_addr_t)pages << PAGE_SHIFT; | ||
846 | } | ||
847 | |||
831 | /* lowest address */ | 848 | /* lowest address */ |
832 | phys_addr_t __init_memblock memblock_start_of_DRAM(void) | 849 | phys_addr_t __init_memblock memblock_start_of_DRAM(void) |
833 | { | 850 | { |