aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/mm/init_64.c28
-rw-r--r--include/linux/mm.h1
-rw-r--r--mm/sparse.c5
3 files changed, 32 insertions, 2 deletions
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 7dc4fbc2d6b0..5fbb8652cf59 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -932,6 +932,10 @@ const char *arch_vma_name(struct vm_area_struct *vma)
932/* 932/*
933 * Initialise the sparsemem vmemmap using huge-pages at the PMD level. 933 * Initialise the sparsemem vmemmap using huge-pages at the PMD level.
934 */ 934 */
935static long __meminitdata addr_start, addr_end;
936static void __meminitdata *p_start, *p_end;
937static int __meminitdata node_start;
938
935int __meminit 939int __meminit
936vmemmap_populate(struct page *start_page, unsigned long size, int node) 940vmemmap_populate(struct page *start_page, unsigned long size, int node)
937{ 941{
@@ -966,12 +970,32 @@ vmemmap_populate(struct page *start_page, unsigned long size, int node)
966 PAGE_KERNEL_LARGE); 970 PAGE_KERNEL_LARGE);
967 set_pmd(pmd, __pmd(pte_val(entry))); 971 set_pmd(pmd, __pmd(pte_val(entry)));
968 972
969 printk(KERN_DEBUG " [%lx-%lx] PMD ->%p on node %d\n", 973 /* check to see if we have contiguous blocks */
970 addr, addr + PMD_SIZE - 1, p, node); 974 if (p_end != p || node_start != node) {
975 if (p_start)
976 printk(KERN_DEBUG " [%lx-%lx] PMD -> [%p-%p] on node %d\n",
977 addr_start, addr_end-1, p_start, p_end-1, node_start);
978 addr_start = addr;
979 node_start = node;
980 p_start = p;
981 }
982 addr_end = addr + PMD_SIZE;
983 p_end = p + PMD_SIZE;
971 } else { 984 } else {
972 vmemmap_verify((pte_t *)pmd, node, addr, next); 985 vmemmap_verify((pte_t *)pmd, node, addr, next);
973 } 986 }
974 } 987 }
975 return 0; 988 return 0;
976} 989}
990
991void __meminit vmemmap_populate_print_last(void)
992{
993 if (p_start) {
994 printk(KERN_DEBUG " [%lx-%lx] PMD -> [%p-%p] on node %d\n",
995 addr_start, addr_end-1, p_start, p_end-1, node_start);
996 p_start = NULL;
997 p_end = NULL;
998 node_start = 0;
999 }
1000}
977#endif 1001#endif
diff --git a/include/linux/mm.h b/include/linux/mm.h
index b695875d63e3..286d31521605 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1229,6 +1229,7 @@ void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
1229int vmemmap_populate_basepages(struct page *start_page, 1229int vmemmap_populate_basepages(struct page *start_page,
1230 unsigned long pages, int node); 1230 unsigned long pages, int node);
1231int vmemmap_populate(struct page *start_page, unsigned long pages, int node); 1231int vmemmap_populate(struct page *start_page, unsigned long pages, int node);
1232void vmemmap_populate_print_last(void);
1232 1233
1233#endif /* __KERNEL__ */ 1234#endif /* __KERNEL__ */
1234#endif /* _LINUX_MM_H */ 1235#endif /* _LINUX_MM_H */
diff --git a/mm/sparse.c b/mm/sparse.c
index 458109b99e61..7e9191381f86 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -295,6 +295,9 @@ struct page __init *sparse_early_mem_map_alloc(unsigned long pnum)
295 return NULL; 295 return NULL;
296} 296}
297 297
298void __attribute__((weak)) __meminit vmemmap_populate_print_last(void)
299{
300}
298/* 301/*
299 * Allocate the accumulated non-linear sections, allocate a mem_map 302 * Allocate the accumulated non-linear sections, allocate a mem_map
300 * for each and record the physical to section mapping. 303 * for each and record the physical to section mapping.
@@ -345,6 +348,8 @@ void __init sparse_init(void)
345 usemap); 348 usemap);
346 } 349 }
347 350
351 vmemmap_populate_print_last();
352
348 free_bootmem(__pa(usemap_map), size); 353 free_bootmem(__pa(usemap_map), size);
349} 354}
350 355