aboutsummaryrefslogtreecommitdiffstats
path: root/mm/sparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/sparse.c')
-rw-r--r--mm/sparse.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/mm/sparse.c b/mm/sparse.c
index 5032c9a619de..9d7fd666015e 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -222,7 +222,8 @@ void __init memory_present(int nid, unsigned long start, unsigned long end)
222 222
223 ms = __nr_to_section(section); 223 ms = __nr_to_section(section);
224 if (!ms->section_mem_map) { 224 if (!ms->section_mem_map) {
225 ms->section_mem_map = sparse_encode_early_nid(nid); 225 ms->section_mem_map = sparse_encode_early_nid(nid) |
226 SECTION_IS_ONLINE;
226 section_mark_present(ms); 227 section_mark_present(ms);
227 } 228 }
228 } 229 }
@@ -622,6 +623,48 @@ void __init sparse_init(void)
622} 623}
623 624
624#ifdef CONFIG_MEMORY_HOTPLUG 625#ifdef CONFIG_MEMORY_HOTPLUG
626
627/* Mark all memory sections within the pfn range as online */
628void online_mem_sections(unsigned long start_pfn, unsigned long end_pfn)
629{
630 unsigned long pfn;
631
632 for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
633 unsigned long section_nr = pfn_to_section_nr(start_pfn);
634 struct mem_section *ms;
635
636 /* onlining code should never touch invalid ranges */
637 if (WARN_ON(!valid_section_nr(section_nr)))
638 continue;
639
640 ms = __nr_to_section(section_nr);
641 ms->section_mem_map |= SECTION_IS_ONLINE;
642 }
643}
644
645#ifdef CONFIG_MEMORY_HOTREMOVE
646/* Mark all memory sections within the pfn range as online */
647void offline_mem_sections(unsigned long start_pfn, unsigned long end_pfn)
648{
649 unsigned long pfn;
650
651 for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
652 unsigned long section_nr = pfn_to_section_nr(start_pfn);
653 struct mem_section *ms;
654
655 /*
656 * TODO this needs some double checking. Offlining code makes
657 * sure to check pfn_valid but those checks might be just bogus
658 */
659 if (WARN_ON(!valid_section_nr(section_nr)))
660 continue;
661
662 ms = __nr_to_section(section_nr);
663 ms->section_mem_map &= ~SECTION_IS_ONLINE;
664 }
665}
666#endif
667
625#ifdef CONFIG_SPARSEMEM_VMEMMAP 668#ifdef CONFIG_SPARSEMEM_VMEMMAP
626static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid) 669static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid)
627{ 670{