x86_64/mm: check and print vmemmap allocation continuous
On big systems with lots of memory, don't print out too much during bootup, and make it easy to find if it is continuous. on 256G 8 sockets system will get [ffffe20000000000-ffffe20002bfffff] PMD -> [ffff810001400000-ffff810003ffffff] on node 0 [ffffe2001c700000-ffffe2001c7fffff] potential offnode page_structs [ffffe20002c00000-ffffe2001c7fffff] PMD -> [ffff81000c000000-ffff8100255fffff] on node 0 [ffffe20038700000-ffffe200387fffff] potential offnode page_structs [ffffe2001c800000-ffffe200387fffff] PMD -> [ffff810820200000-ffff81083c1fffff] on node 1 [ffffe20040000000-ffffe2007fffffff] PUD ->ffff811027a00000 on node 2 [ffffe20038800000-ffffe2003fffffff] PMD -> [ffff811020200000-ffff8110279fffff] on node 2 [ffffe20054700000-ffffe200547fffff] potential offnode page_structs [ffffe20040000000-ffffe200547fffff] PMD -> [ffff811027c00000-ffff81103c3fffff] on node 2 [ffffe20070700000-ffffe200707fffff] potential offnode page_structs [ffffe20054800000-ffffe200707fffff] PMD -> [ffff811820200000-ffff81183c1fffff] on node 3 [ffffe20080000000-ffffe200bfffffff] PUD ->ffff81202fa00000 on node 4 [ffffe20070800000-ffffe2007fffffff] PMD -> [ffff812020200000-ffff81202f9fffff] on node 4 [ffffe2008c700000-ffffe2008c7fffff] potential offnode page_structs [ffffe20080000000-ffffe2008c7fffff] PMD -> [ffff81202fc00000-ffff81203c3fffff] on node 4 [ffffe200a8700000-ffffe200a87fffff] potential offnode page_structs [ffffe2008c800000-ffffe200a87fffff] PMD -> [ffff812820200000-ffff81283c1fffff] on node 5 [ffffe200c0000000-ffffe200ffffffff] PUD ->ffff813037a00000 on node 6 [ffffe200a8800000-ffffe200bfffffff] PMD -> [ffff813020200000-ffff8130379fffff] on node 6 [ffffe200c4700000-ffffe200c47fffff] potential offnode page_structs [ffffe200c0000000-ffffe200c47fffff] PMD -> [ffff813037c00000-ffff81303c3fffff] on node 6 [ffffe200c4800000-ffffe200e07fffff] PMD -> [ffff813820200000-ffff81383c1fffff] on node 7 instead of a very long print out... Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Родитель
1a27fc0a42
Коммит
c2b91e2eec
|
@ -932,6 +932,10 @@ const char *arch_vma_name(struct vm_area_struct *vma)
|
||||||
/*
|
/*
|
||||||
* Initialise the sparsemem vmemmap using huge-pages at the PMD level.
|
* Initialise the sparsemem vmemmap using huge-pages at the PMD level.
|
||||||
*/
|
*/
|
||||||
|
static long __meminitdata addr_start, addr_end;
|
||||||
|
static void __meminitdata *p_start, *p_end;
|
||||||
|
static int __meminitdata node_start;
|
||||||
|
|
||||||
int __meminit
|
int __meminit
|
||||||
vmemmap_populate(struct page *start_page, unsigned long size, int node)
|
vmemmap_populate(struct page *start_page, unsigned long size, int node)
|
||||||
{
|
{
|
||||||
|
@ -966,12 +970,32 @@ vmemmap_populate(struct page *start_page, unsigned long size, int node)
|
||||||
PAGE_KERNEL_LARGE);
|
PAGE_KERNEL_LARGE);
|
||||||
set_pmd(pmd, __pmd(pte_val(entry)));
|
set_pmd(pmd, __pmd(pte_val(entry)));
|
||||||
|
|
||||||
printk(KERN_DEBUG " [%lx-%lx] PMD ->%p on node %d\n",
|
/* check to see if we have contiguous blocks */
|
||||||
addr, addr + PMD_SIZE - 1, p, node);
|
if (p_end != p || node_start != node) {
|
||||||
|
if (p_start)
|
||||||
|
printk(KERN_DEBUG " [%lx-%lx] PMD -> [%p-%p] on node %d\n",
|
||||||
|
addr_start, addr_end-1, p_start, p_end-1, node_start);
|
||||||
|
addr_start = addr;
|
||||||
|
node_start = node;
|
||||||
|
p_start = p;
|
||||||
|
}
|
||||||
|
addr_end = addr + PMD_SIZE;
|
||||||
|
p_end = p + PMD_SIZE;
|
||||||
} else {
|
} else {
|
||||||
vmemmap_verify((pte_t *)pmd, node, addr, next);
|
vmemmap_verify((pte_t *)pmd, node, addr, next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __meminit vmemmap_populate_print_last(void)
|
||||||
|
{
|
||||||
|
if (p_start) {
|
||||||
|
printk(KERN_DEBUG " [%lx-%lx] PMD -> [%p-%p] on node %d\n",
|
||||||
|
addr_start, addr_end-1, p_start, p_end-1, node_start);
|
||||||
|
p_start = NULL;
|
||||||
|
p_end = NULL;
|
||||||
|
node_start = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1229,6 +1229,7 @@ void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
|
||||||
int vmemmap_populate_basepages(struct page *start_page,
|
int vmemmap_populate_basepages(struct page *start_page,
|
||||||
unsigned long pages, int node);
|
unsigned long pages, int node);
|
||||||
int vmemmap_populate(struct page *start_page, unsigned long pages, int node);
|
int vmemmap_populate(struct page *start_page, unsigned long pages, int node);
|
||||||
|
void vmemmap_populate_print_last(void);
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* _LINUX_MM_H */
|
#endif /* _LINUX_MM_H */
|
||||||
|
|
|
@ -295,6 +295,9 @@ struct page __init *sparse_early_mem_map_alloc(unsigned long pnum)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __attribute__((weak)) __meminit vmemmap_populate_print_last(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Allocate the accumulated non-linear sections, allocate a mem_map
|
* Allocate the accumulated non-linear sections, allocate a mem_map
|
||||||
* for each and record the physical to section mapping.
|
* for each and record the physical to section mapping.
|
||||||
|
@ -345,6 +348,8 @@ void __init sparse_init(void)
|
||||||
usemap);
|
usemap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vmemmap_populate_print_last();
|
||||||
|
|
||||||
free_bootmem(__pa(usemap_map), size);
|
free_bootmem(__pa(usemap_map), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче