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>
This commit is contained in:
committed by
H. Peter Anvin
parent
d1af6d045f
commit
595ad9af85
@@ -363,20 +363,6 @@ static void __init relocate_initrd(void)
|
|||||||
ramdisk_here, ramdisk_here + ramdisk_size - 1);
|
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)
|
static void __init early_reserve_initrd(void)
|
||||||
{
|
{
|
||||||
/* Assume only end is not page aligned */
|
/* Assume only end is not page aligned */
|
||||||
@@ -404,7 +390,7 @@ static void __init reserve_initrd(void)
|
|||||||
|
|
||||||
initrd_start = 0;
|
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))
|
if (ramdisk_size >= (mapped_size>>1))
|
||||||
panic("initrd too large to handle, "
|
panic("initrd too large to handle, "
|
||||||
"disabling initrd (%lld needed, %lld available)\n",
|
"disabling initrd (%lld needed, %lld available)\n",
|
||||||
|
@@ -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 __memblock_alloc_base(phys_addr_t size, phys_addr_t align,
|
||||||
phys_addr_t max_addr);
|
phys_addr_t max_addr);
|
||||||
phys_addr_t memblock_phys_mem_size(void);
|
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_start_of_DRAM(void);
|
||||||
phys_addr_t memblock_end_of_DRAM(void);
|
phys_addr_t memblock_end_of_DRAM(void);
|
||||||
void memblock_enforce_memory_limit(phys_addr_t memory_limit);
|
void memblock_enforce_memory_limit(phys_addr_t memory_limit);
|
||||||
|
@@ -828,6 +828,23 @@ phys_addr_t __init memblock_phys_mem_size(void)
|
|||||||
return memblock.memory.total_size;
|
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 */
|
/* lowest address */
|
||||||
phys_addr_t __init_memblock memblock_start_of_DRAM(void)
|
phys_addr_t __init_memblock memblock_start_of_DRAM(void)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user