aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2013-01-24 15:20:09 -0500
committerH. Peter Anvin <hpa@linux.intel.com>2013-01-29 22:32:57 -0500
commit595ad9af8584908ea5fb698b836169d05b99f186 (patch)
tree851492cc2fa5c02b4b5122b7af154f7a8d7777c3
parentd1af6d045fba6b070fa81f54dfe9227214be99ea (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.c16
-rw-r--r--include/linux/memblock.h1
-rw-r--r--mm/memblock.c17
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
366static 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}
380static void __init early_reserve_initrd(void) 366static 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,
155phys_addr_t __memblock_alloc_base(phys_addr_t size, phys_addr_t align, 155phys_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);
157phys_addr_t memblock_phys_mem_size(void); 157phys_addr_t memblock_phys_mem_size(void);
158phys_addr_t memblock_mem_size(unsigned long limit_pfn);
158phys_addr_t memblock_start_of_DRAM(void); 159phys_addr_t memblock_start_of_DRAM(void);
159phys_addr_t memblock_end_of_DRAM(void); 160phys_addr_t memblock_end_of_DRAM(void);
160void memblock_enforce_memory_limit(phys_addr_t memory_limit); 161void 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
831phys_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 */
832phys_addr_t __init_memblock memblock_start_of_DRAM(void) 849phys_addr_t __init_memblock memblock_start_of_DRAM(void)
833{ 850{