Message ID | 20200312124414.439-2-bhe@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mm/hotplug: Only use subsection map for VMEMMAP | expand |
> > Factor out the code that fills the subsection map from section_activate() > into fill_subsection_map(), this makes section_activate() cleaner and > easier to follow. > > Signed-off-by: Baoquan He <bhe@redhat.com> > Reviewed-by: Wei Yang <richard.weiyang@gmail.com> > Reviewed-by: David Hildenbrand <david@redhat.com> > --- > mm/sparse.c | 32 +++++++++++++++++++++----------- > 1 file changed, 21 insertions(+), 11 deletions(-) > > diff --git a/mm/sparse.c b/mm/sparse.c > index cf28505e82c5..5919bc5b1547 100644 > --- a/mm/sparse.c > +++ b/mm/sparse.c > @@ -792,24 +792,15 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > ms->section_mem_map = (unsigned long)NULL; > } > > -static struct page * __meminit section_activate(int nid, unsigned long pfn, > - unsigned long nr_pages, struct vmem_altmap *altmap) > +static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages) > { > - DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 }; > struct mem_section *ms = __pfn_to_section(pfn); > - struct mem_section_usage *usage = NULL; > + DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 }; > unsigned long *subsection_map; > - struct page *memmap; > int rc = 0; > > subsection_mask_set(map, pfn, nr_pages); > > - if (!ms->usage) { > - usage = kzalloc(mem_section_usage_size(), GFP_KERNEL); > - if (!usage) > - return ERR_PTR(-ENOMEM); > - ms->usage = usage; > - } > subsection_map = &ms->usage->subsection_map[0]; > > if (bitmap_empty(map, SUBSECTIONS_PER_SECTION)) > @@ -820,6 +811,25 @@ static struct page * __meminit section_activate(int nid, unsigned long pfn, > bitmap_or(subsection_map, map, subsection_map, > SUBSECTIONS_PER_SECTION); > > + return rc; > +} > + > +static struct page * __meminit section_activate(int nid, unsigned long pfn, > + unsigned long nr_pages, struct vmem_altmap *altmap) > +{ > + struct mem_section *ms = __pfn_to_section(pfn); > + struct mem_section_usage *usage = NULL; > + struct page *memmap; > + int rc = 0; > + > + if (!ms->usage) { > + usage = kzalloc(mem_section_usage_size(), GFP_KERNEL); > + if (!usage) > + return ERR_PTR(-ENOMEM); > + ms->usage = usage; > + } > + > + rc = fill_subsection_map(pfn, nr_pages); > if (rc) { > if (usage) > ms->usage = NULL; > -- Acked-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com> > 2.17.2 > >
diff --git a/mm/sparse.c b/mm/sparse.c index cf28505e82c5..5919bc5b1547 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -792,24 +792,15 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, ms->section_mem_map = (unsigned long)NULL; } -static struct page * __meminit section_activate(int nid, unsigned long pfn, - unsigned long nr_pages, struct vmem_altmap *altmap) +static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages) { - DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 }; struct mem_section *ms = __pfn_to_section(pfn); - struct mem_section_usage *usage = NULL; + DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 }; unsigned long *subsection_map; - struct page *memmap; int rc = 0; subsection_mask_set(map, pfn, nr_pages); - if (!ms->usage) { - usage = kzalloc(mem_section_usage_size(), GFP_KERNEL); - if (!usage) - return ERR_PTR(-ENOMEM); - ms->usage = usage; - } subsection_map = &ms->usage->subsection_map[0]; if (bitmap_empty(map, SUBSECTIONS_PER_SECTION)) @@ -820,6 +811,25 @@ static struct page * __meminit section_activate(int nid, unsigned long pfn, bitmap_or(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); + return rc; +} + +static struct page * __meminit section_activate(int nid, unsigned long pfn, + unsigned long nr_pages, struct vmem_altmap *altmap) +{ + struct mem_section *ms = __pfn_to_section(pfn); + struct mem_section_usage *usage = NULL; + struct page *memmap; + int rc = 0; + + if (!ms->usage) { + usage = kzalloc(mem_section_usage_size(), GFP_KERNEL); + if (!usage) + return ERR_PTR(-ENOMEM); + ms->usage = usage; + } + + rc = fill_subsection_map(pfn, nr_pages); if (rc) { if (usage) ms->usage = NULL;