Commit 0a9f9f62 authored by Baoquan He's avatar Baoquan He Committed by Linus Torvalds

mm/sparse.c: only use subsection map in VMEMMAP case

Currently, to support subsection aligned memory region adding for pmem,
subsection map is added to track which subsection is present.

However, config ZONE_DEVICE depends on SPARSEMEM_VMEMMAP.  It means
subsection map only makes sense when SPARSEMEM_VMEMMAP enabled.  For the
classic sparse, it's meaningless.  Even worse, it may confuse people when
checking code related to the classic sparse.

About the classic sparse which doesn't support subsection hotplug, Dan
said it's more because the effort and maintenance burden outweighs the
benefit.  Besides, the current 64 bit ARCHes all enable
SPARSEMEM_VMEMMAP_ENABLE by default.

Combining the above reasons, no need to provide subsection map and the
relevant handling for the classic sparse.  Let's remove them.
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>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
Cc: Wei Yang <richard.weiyang@gmail.com>
Link: http://lkml.kernel.org/r/20200312124414.439-4-bhe@redhat.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 37bc1502
...@@ -1143,7 +1143,9 @@ static inline unsigned long section_nr_to_pfn(unsigned long sec) ...@@ -1143,7 +1143,9 @@ static inline unsigned long section_nr_to_pfn(unsigned long sec)
#define SUBSECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SUBSECTION_MASK) #define SUBSECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SUBSECTION_MASK)
struct mem_section_usage { struct mem_section_usage {
#ifdef CONFIG_SPARSEMEM_VMEMMAP
DECLARE_BITMAP(subsection_map, SUBSECTIONS_PER_SECTION); DECLARE_BITMAP(subsection_map, SUBSECTIONS_PER_SECTION);
#endif
/* See declaration of similar field in struct zone */ /* See declaration of similar field in struct zone */
unsigned long pageblock_flags[0]; unsigned long pageblock_flags[0];
}; };
......
...@@ -209,6 +209,7 @@ static inline unsigned long first_present_section_nr(void) ...@@ -209,6 +209,7 @@ static inline unsigned long first_present_section_nr(void)
return next_present_section_nr(-1); return next_present_section_nr(-1);
} }
#ifdef CONFIG_SPARSEMEM_VMEMMAP
static void subsection_mask_set(unsigned long *map, unsigned long pfn, static void subsection_mask_set(unsigned long *map, unsigned long pfn,
unsigned long nr_pages) unsigned long nr_pages)
{ {
...@@ -243,6 +244,11 @@ void __init subsection_map_init(unsigned long pfn, unsigned long nr_pages) ...@@ -243,6 +244,11 @@ void __init subsection_map_init(unsigned long pfn, unsigned long nr_pages)
nr_pages -= pfns; nr_pages -= pfns;
} }
} }
#else
void __init subsection_map_init(unsigned long pfn, unsigned long nr_pages)
{
}
#endif
/* Record a memory area against a node. */ /* Record a memory area against a node. */
void __init memory_present(int nid, unsigned long start, unsigned long end) void __init memory_present(int nid, unsigned long start, unsigned long end)
...@@ -705,6 +711,7 @@ static void free_map_bootmem(struct page *memmap) ...@@ -705,6 +711,7 @@ static void free_map_bootmem(struct page *memmap)
} }
#endif /* CONFIG_SPARSEMEM_VMEMMAP */ #endif /* CONFIG_SPARSEMEM_VMEMMAP */
#ifdef CONFIG_SPARSEMEM_VMEMMAP
static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages) static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages)
{ {
DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 }; DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 };
...@@ -731,6 +738,17 @@ static bool is_subsection_map_empty(struct mem_section *ms) ...@@ -731,6 +738,17 @@ static bool is_subsection_map_empty(struct mem_section *ms)
return bitmap_empty(&ms->usage->subsection_map[0], return bitmap_empty(&ms->usage->subsection_map[0],
SUBSECTIONS_PER_SECTION); SUBSECTIONS_PER_SECTION);
} }
#else
static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages)
{
return 0;
}
static bool is_subsection_map_empty(struct mem_section *ms)
{
return true;
}
#endif
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)
...@@ -792,6 +810,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, ...@@ -792,6 +810,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages,
ms->section_mem_map = (unsigned long)NULL; ms->section_mem_map = (unsigned long)NULL;
} }
#ifdef CONFIG_SPARSEMEM_VMEMMAP
static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages) static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
{ {
struct mem_section *ms = __pfn_to_section(pfn); struct mem_section *ms = __pfn_to_section(pfn);
...@@ -813,6 +832,12 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages) ...@@ -813,6 +832,12 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
return rc; return rc;
} }
#else
static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
{
return 0;
}
#endif
static struct page * __meminit section_activate(int nid, unsigned long pfn, static struct page * __meminit section_activate(int nid, unsigned long pfn,
unsigned long nr_pages, struct vmem_altmap *altmap) unsigned long nr_pages, struct vmem_altmap *altmap)
......
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