@@ -288,11 +288,11 @@ struct page *sparse_decode_mem_map(unsigned long coded_mem_map, unsigned long pn
288288
289289static void __meminit sparse_init_one_section (struct mem_section * ms ,
290290 unsigned long pnum , struct page * mem_map ,
291- struct mem_section_usage * usage )
291+ struct mem_section_usage * usage , unsigned long flags )
292292{
293293 ms -> section_mem_map &= ~SECTION_MAP_MASK ;
294- ms -> section_mem_map |= sparse_encode_mem_map (mem_map , pnum ) |
295- SECTION_HAS_MEM_MAP ;
294+ ms -> section_mem_map |= sparse_encode_mem_map (mem_map , pnum )
295+ | SECTION_HAS_MEM_MAP | flags ;
296296 ms -> usage = usage ;
297297}
298298
@@ -497,7 +497,8 @@ static void __init sparse_init_nid(int nid, unsigned long pnum_begin,
497497 goto failed ;
498498 }
499499 check_usemap_section_nr (nid , usage );
500- sparse_init_one_section (__nr_to_section (pnum ), pnum , map , usage );
500+ sparse_init_one_section (__nr_to_section (pnum ), pnum , map , usage ,
501+ SECTION_IS_EARLY );
501502 usage = (void * ) usage + mem_section_usage_size ();
502503 }
503504 sparse_buffer_fini ();
@@ -732,7 +733,7 @@ int __meminit sparse_add_one_section(int nid, unsigned long start_pfn,
732733
733734 set_section_nid (section_nr , nid );
734735 section_mark_present (ms );
735- sparse_init_one_section (ms , section_nr , memmap , usage );
736+ sparse_init_one_section (ms , section_nr , memmap , usage , 0 );
736737
737738out :
738739 if (ret < 0 ) {
@@ -772,19 +773,16 @@ static inline void clear_hwpoisoned_pages(struct page *memmap, int nr_pages)
772773}
773774#endif
774775
775- static void free_section_usage (struct page * memmap ,
776+ static void free_section_usage (struct mem_section * ms , struct page * memmap ,
776777 struct mem_section_usage * usage , struct vmem_altmap * altmap )
777778{
778- struct page * usage_page ;
779-
780779 if (!usage )
781780 return ;
782781
783- usage_page = virt_to_page (usage );
784782 /*
785783 * Check to see if allocation came from hot-plug-add
786784 */
787- if (PageSlab ( usage_page ) || PageCompound ( usage_page )) {
785+ if (! early_section ( ms )) {
788786 kfree (usage );
789787 if (memmap )
790788 __kfree_section_memmap (memmap , altmap );
@@ -816,6 +814,6 @@ void sparse_remove_one_section(struct mem_section *ms, unsigned long map_offset,
816814
817815 clear_hwpoisoned_pages (memmap + map_offset ,
818816 PAGES_PER_SECTION - map_offset );
819- free_section_usage (memmap , usage , altmap );
817+ free_section_usage (ms , memmap , usage , altmap );
820818}
821819#endif /* CONFIG_MEMORY_HOTPLUG */
0 commit comments