Skip to content

Commit

Permalink
mm/sparse.c: add note about only VMEMMAP supporting sub-section hotplug
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Reviewed-by: David Hildenbrand <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Cc: Dan Williams <[email protected]>
Cc: Pankaj Gupta <[email protected]>
Cc: Wei Yang <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Baoquan He authored and torvalds committed Apr 7, 2020
1 parent 0a9f9f6 commit 95a5a34
Showing 1 changed file with 21 additions and 17 deletions.
38 changes: 21 additions & 17 deletions mm/sparse.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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);
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 95a5a34

Please sign in to comment.