memory-hotplug : implement register_page_bootmem_info_section of sparse-vmemmap
Subsystems (6)
RFC PATCH v4 10/13 memory-hotplug : implement register_page_bootmem_info_section of sparse-vmemmap
For removing memmap region of sparse-vmemmap which is allocated bootmem, memmap region of sparse-vmemmap needs to be registered by get_page_bootmem(). So the patch searches pages of virtual mapping and registers the pages by get_page_bootmem().
CC David Rientjes <[email protected]>
CC Jiang Liu <[email protected]>
CC Len Brown <[email protected]>
CC Benjamin Herrenschmidt <[email protected]>
CC Paul Mackerras <[email protected]>
CC Christoph Lameter <[email protected]>
Cc Minchan Kim <[email protected]>
CC Andrew Morton <[email protected]>
CC KOSAKI Motohiro <[email protected]>
CC Wen Congyang <[email protected]>
Signed-off-by Yasuaki Ishimatsu <[email protected]>
--- arch/x86/mm/init_64.c | 52 +++++++++++++++++++++++++++++++++++++++++ include/linux/memory_hotplug.h | 2 + include/linux/mm.h | 3 +- mm/memory_hotplug.c | 23 +++++++++++++++--- 4 files changed, 76 insertions(+), 4 deletions(-)
mm/memory_hotplug.c +20 -3
@@ -91,8 +91,8 @@ static void release_memory_resource(stru }#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE -static void get_page_bootmem (unsigned long info,struct page *page, -unsigned long type) +void get_page_bootmem (unsigned long info,struct page *page, +unsigned long type) {unsigned long page_type;
@@ -164,8 +164,25 @@ static void register_page_bootmem_info_s }#else -static inline void register_page_bootmem_info_section (unsigned long start_pfn) +static void register_page_bootmem_info_section (unsigned long start_pfn) { +unsigned long mapsize, section_nr; +struct mem_section *ms; +struct page *page, *memmap; + +if (!pfn_valid (start_pfn)) +return ; + + section_nr =pfn_to_section_nr (start_pfn); + ms =__nr_to_section (section_nr); + + memmap =sparse_decode_mem_map (ms->section_mem_map, section_nr); + + page =virt_to_page (memmap); + mapsize =sizeof (struct page ) *PAGES_PER_SECTION ; + mapsize =PAGE_ALIGN (mapsize) >>PAGE_SHIFT ; + +register_page_bootmem_memmap (section_nr, memmap,PAGES_PER_SECTION ); }#endif
include/linux/mm.h +2 -1
@@ -1586,7 +1586,8 @@ int vmemmap_populate_basepages(struct pa unsigned long pages, int node);int vmemmap_populate (struct page *start_page,unsigned long pages,int node);void vmemmap_populate_print_last (void ); - +void register_page_bootmem_memmap (unsigned long section_nr,struct page *map, +unsigned long size);enum mf_flags {MF_COUNT_INCREASED =1 <<0 ,
arch/x86/mm/init_64.c +52 -0
58 lines not on this page · raw message
include/linux/memory_hotplug.h +2 -0
@@ -162,6 +162,8 @@ static inline void arch_refresh_nodedataextern void register_page_bootmem_info_node (struct pglist_data *pgdat);extern void put_page_bootmem (struct page *page); +extern void get_page_bootmem (unsigned long ingo,struct page *page, +unsigned long type);/* * Lock for memory hotplug guarantees 1) all callbacks for memory hotplug