Commit 95a5a34d authored by Baoquan He's avatar Baoquan He Committed by Linus Torvalds

mm/sparse.c: add note about only VMEMMAP supporting sub-section hotplug

And tell check_pfn_span() gating the porper alignment and size of hot
added memory region.

And also move the code comments from inside section_deactivate() to being
above it.  The code comments are reasonable for the whole function, and
the moving makes code cleaner.
Signed-off-by: default avatarBaoquan He <bhe@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
Acked-by: default avatarMichal Hocko <mhocko@suse.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
Cc: Wei Yang <richard.weiyang@gmail.com>
Link: http://lkml.kernel.org/r/20200312124414.439-5-bhe@redhat.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0a9f9f62
...@@ -750,6 +750,22 @@ static bool is_subsection_map_empty(struct mem_section *ms) ...@@ -750,6 +750,22 @@ static bool is_subsection_map_empty(struct mem_section *ms)
} }
#endif #endif
/*
* To deactivate a memory region, there are 3 cases to handle across
* two configurations (SPARSEMEM_VMEMMAP={y,n}):
*
* 1. deactivation of a partial hot-added section (only possible in
* the SPARSEMEM_VMEMMAP=y case).
* a) section was present at memory init.
* b) section was hot-added post memory init.
* 2. deactivation of a complete hot-added section.
* 3. deactivation of a complete section from memory init.
*
* For 1, when subsection_map does not empty we will not be freeing the
* usage map, but still need to free the vmemmap range.
*
* For 2 and 3, the SPARSEMEM_VMEMMAP={y,n} cases are unified
*/
static void section_deactivate(unsigned long pfn, unsigned long nr_pages, static void section_deactivate(unsigned long pfn, unsigned long nr_pages,
struct vmem_altmap *altmap) struct vmem_altmap *altmap)
{ {
...@@ -760,23 +776,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, ...@@ -760,23 +776,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages,
if (clear_subsection_map(pfn, nr_pages)) if (clear_subsection_map(pfn, nr_pages))
return; return;
/*
* There are 3 cases to handle across two configurations
* (SPARSEMEM_VMEMMAP={y,n}):
*
* 1/ deactivation of a partial hot-added section (only possible
* in the SPARSEMEM_VMEMMAP=y case).
* a/ section was present at memory init
* b/ section was hot-added post memory init
* 2/ deactivation of a complete hot-added section
* 3/ deactivation of a complete section from memory init
*
* For 1/, when subsection_map does not empty we will not be
* freeing the usage map, but still need to free the vmemmap
* range.
*
* For 2/ and 3/ the SPARSEMEM_VMEMMAP={y,n} cases are unified
*/
empty = is_subsection_map_empty(ms); empty = is_subsection_map_empty(ms);
if (empty) { if (empty) {
unsigned long section_nr = pfn_to_section_nr(pfn); unsigned long section_nr = pfn_to_section_nr(pfn);
...@@ -890,6 +890,10 @@ static struct page * __meminit section_activate(int nid, unsigned long pfn, ...@@ -890,6 +890,10 @@ static struct page * __meminit section_activate(int nid, unsigned long pfn,
* *
* This is only intended for hotplug. * This is only intended for hotplug.
* *
* Note that only VMEMMAP supports sub-section aligned hotplug,
* the proper alignment and size are gated by check_pfn_span().
*
*
* Return: * Return:
* * 0 - On success. * * 0 - On success.
* * -EEXIST - Section has been present. * * -EEXIST - Section has been present.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment