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: Baoquan He <bhe@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: David Hildenbrand <david@redhat.com> Acked-by: Michal 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.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
0a9f9f6231
commit
95a5a34dfe
38
mm/sparse.c
38
mm/sparse.c
|
@ -750,6 +750,22 @@ static bool is_subsection_map_empty(struct mem_section *ms)
|
|||
}
|
||||
#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,
|
||||
struct vmem_altmap *altmap)
|
||||
{
|
||||
|
@ -760,23 +776,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages,
|
|||
|
||||
if (clear_subsection_map(pfn, nr_pages))
|
||||
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);
|
||||
if (empty) {
|
||||
unsigned long section_nr = pfn_to_section_nr(pfn);
|
||||
|
@ -890,6 +890,10 @@ static struct page * __meminit section_activate(int nid, unsigned long pfn,
|
|||
*
|
||||
* 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:
|
||||
* * 0 - On success.
|
||||
* * -EEXIST - Section has been present.
|
||||
|
|
Loading…
Reference in New Issue