memblock: Add memblock_mem_size()
authorYinghai Lu <yinghai@kernel.org>
Thu, 24 Jan 2013 20:20:09 +0000 (12:20 -0800)
committerH. Peter Anvin <hpa@linux.intel.com>
Wed, 30 Jan 2013 03:32:57 +0000 (19:32 -0800)
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>
arch/x86/kernel/setup.c
include/linux/memblock.h
mm/memblock.c

index b80bee10982f9b8dd5313f7c53d8e253a835c984..bbe8cdf7515e3612d38aa73fe9529f6b1097e35d 100644 (file)
@@ -363,20 +363,6 @@ static void __init relocate_initrd(void)
                ramdisk_here, ramdisk_here + ramdisk_size - 1);
 }
 
-static u64 __init get_mem_size(unsigned long limit_pfn)
-{
-       int i;
-       u64 mapped_pages = 0;
-       unsigned long start_pfn, end_pfn;
-
-       for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, NULL) {
-               start_pfn = min_t(unsigned long, start_pfn, limit_pfn);
-               end_pfn = min_t(unsigned long, end_pfn, limit_pfn);
-               mapped_pages += end_pfn - start_pfn;
-       }
-
-       return mapped_pages << PAGE_SHIFT;
-}
 static void __init early_reserve_initrd(void)
 {
        /* Assume only end is not page aligned */
@@ -404,7 +390,7 @@ static void __init reserve_initrd(void)
 
        initrd_start = 0;
 
-       mapped_size = get_mem_size(max_pfn_mapped);
+       mapped_size = memblock_mem_size(max_pfn_mapped);
        if (ramdisk_size >= (mapped_size>>1))
                panic("initrd too large to handle, "
                       "disabling initrd (%lld needed, %lld available)\n",
index d452ee191066456278080c92322e093986baa1fb..f388203db7e85b421bfb58d3963f2edbc315c70c 100644 (file)
@@ -155,6 +155,7 @@ phys_addr_t memblock_alloc_base(phys_addr_t size, phys_addr_t align,
 phys_addr_t __memblock_alloc_base(phys_addr_t size, phys_addr_t align,
                                  phys_addr_t max_addr);
 phys_addr_t memblock_phys_mem_size(void);
+phys_addr_t memblock_mem_size(unsigned long limit_pfn);
 phys_addr_t memblock_start_of_DRAM(void);
 phys_addr_t memblock_end_of_DRAM(void);
 void memblock_enforce_memory_limit(phys_addr_t memory_limit);
index 88adc8afb6103d6c1ba2eb7e20c1ed226cf2b1d3..b8d9147e5c084de3264fc49ea93c95e22eddf49d 100644 (file)
@@ -828,6 +828,23 @@ phys_addr_t __init memblock_phys_mem_size(void)
        return memblock.memory.total_size;
 }
 
+phys_addr_t __init memblock_mem_size(unsigned long limit_pfn)
+{
+       unsigned long pages = 0;
+       struct memblock_region *r;
+       unsigned long start_pfn, end_pfn;
+
+       for_each_memblock(memory, r) {
+               start_pfn = memblock_region_memory_base_pfn(r);
+               end_pfn = memblock_region_memory_end_pfn(r);
+               start_pfn = min_t(unsigned long, start_pfn, limit_pfn);
+               end_pfn = min_t(unsigned long, end_pfn, limit_pfn);
+               pages += end_pfn - start_pfn;
+       }
+
+       return (phys_addr_t)pages << PAGE_SHIFT;
+}
+
 /* lowest address */
 phys_addr_t __init_memblock memblock_start_of_DRAM(void)
 {