Sizing the available memory should respect memory holes, so look at the memory map when setting the boundary for the memory allocator.
Signed-off-by: Juergen Gross <jgr...@suse.com> Reviewed-by: Samuel Thibault <samuel.thiba...@ens-lyon.org> --- V2: - rename "max" to "start" (Samuel Thibault) --- arch/x86/mm.c | 6 +----- e820.c | 14 ++++++++------ include/e820.h | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/arch/x86/mm.c b/arch/x86/mm.c index 8df93da..3bf6170 100644 --- a/arch/x86/mm.c +++ b/arch/x86/mm.c @@ -107,7 +107,6 @@ void arch_mm_preinit(void *p) { long ret; domid_t domid = DOMID_SELF; - unsigned long max; pt_base = page_table_base; first_free_pfn = PFN_UP(to_phys(&_end)); @@ -117,11 +116,8 @@ void arch_mm_preinit(void *p) xprintk("could not get memory size\n"); do_exit(); } - last_free_pfn = ret; - max = e820_get_maxpfn(); - if ( max < last_free_pfn ) - last_free_pfn = max; + last_free_pfn = e820_get_maxpfn(ret); } #endif diff --git a/e820.c b/e820.c index 70286cb..8030f43 100644 --- a/e820.c +++ b/e820.c @@ -285,10 +285,10 @@ void arch_print_memmap(void) } #endif -unsigned long e820_get_maxpfn(void) +unsigned long e820_get_maxpfn(unsigned long pages) { int i; - unsigned long pfn, max = 0; + unsigned long pfns, start = 0; e820_get_memmap(); @@ -296,10 +296,12 @@ unsigned long e820_get_maxpfn(void) { if ( e820_map[i].type != E820_RAM ) continue; - pfn = (e820_map[i].addr + e820_map[i].size) >> PAGE_SHIFT; - if ( pfn > max ) - max = pfn; + pfns = e820_map[i].size >> PAGE_SHIFT; + start = e820_map[i].addr >> PAGE_SHIFT; + if ( pages <= pfns ) + return start + pages; + pages -= pfns; } - return max; + return start + pfns; } diff --git a/include/e820.h b/include/e820.h index af2129f..6a57f05 100644 --- a/include/e820.h +++ b/include/e820.h @@ -49,6 +49,6 @@ struct __packed e820entry { extern struct e820entry e820_map[]; extern unsigned e820_entries; -unsigned long e820_get_maxpfn(void); +unsigned long e820_get_maxpfn(unsigned long pages); #endif /*__E820_HEADER*/ -- 2.26.2