diff options
Diffstat (limited to 'mm/sparse.c')
-rw-r--r-- | mm/sparse.c | 45 |
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 */ | ||
628 | void 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 */ | ||
647 | void 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 |
626 | static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid) | 669 | static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid) |
627 | { | 670 | { |