sparse_add_section()/section_activate() currently takes struct
dev_pagemap only to obtain the compound page order.

Pass the order explicitly instead of routing it through a ZONE_DEVICE
specific structure. This removes the dev_pagemap dependency from the
generic sparse memory population path and keeps the interface usable for
other callers (if possible).

Signed-off-by: Muchun Song <[email protected]>
---
 include/linux/memory_hotplug.h |  4 ++--
 mm/memory_hotplug.c            |  4 ++--
 mm/sparse-vmemmap.c            | 14 ++++++--------
 3 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
index 815e908c4135..083f0abea62d 100644
--- a/include/linux/memory_hotplug.h
+++ b/include/linux/memory_hotplug.h
@@ -304,8 +304,8 @@ extern void remove_pfn_range_from_zone(struct zone *zone,
                                       unsigned long start_pfn,
                                       unsigned long nr_pages);
 extern int sparse_add_section(int nid, unsigned long pfn,
-               unsigned long nr_pages, struct vmem_altmap *altmap,
-               struct dev_pagemap *pgmap);
+               unsigned long nr_pages, unsigned int order,
+               struct vmem_altmap *altmap);
 extern void sparse_remove_section(unsigned long pfn, unsigned long nr_pages,
                                  struct vmem_altmap *altmap);
 extern struct zone *zone_for_pfn_range(enum mmop online_type,
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 5c60533677a1..ef1595bdfd3a 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -385,6 +385,7 @@ int __add_pages(int nid, unsigned long pfn, unsigned long 
nr_pages,
        unsigned long cur_nr_pages;
        int err;
        struct vmem_altmap *altmap = params->altmap;
+       unsigned int order = params->pgmap ? params->pgmap->vmemmap_shift : 0;
 
        if (WARN_ON_ONCE(!pgprot_val(params->pgprot)))
                return -EINVAL;
@@ -412,8 +413,7 @@ int __add_pages(int nid, unsigned long pfn, unsigned long 
nr_pages,
                /* Select all remaining pages up to the next section boundary */
                cur_nr_pages = min(end_pfn - pfn,
                                   SECTION_ALIGN_UP(pfn + 1) - pfn);
-               err = sparse_add_section(nid, pfn, cur_nr_pages, altmap,
-                                        params->pgmap);
+               err = sparse_add_section(nid, pfn, cur_nr_pages, order, altmap);
                if (err)
                        break;
                cond_resched();
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
index a807210fe9e1..667424aadd6b 100644
--- a/mm/sparse-vmemmap.c
+++ b/mm/sparse-vmemmap.c
@@ -613,16 +613,14 @@ static void section_deactivate(unsigned long pfn, 
unsigned long nr_pages,
 }
 
 static struct page * __meminit section_activate(int nid, unsigned long pfn,
-               unsigned long nr_pages, struct vmem_altmap *altmap,
-               struct dev_pagemap *pgmap)
+               unsigned long nr_pages, unsigned int order,
+               struct vmem_altmap *altmap)
 {
        struct mem_section *ms = __pfn_to_section(pfn);
        struct mem_section_usage *usage = NULL;
        struct page *memmap;
-       unsigned int order;
        int rc;
 
-       order = pgmap ? pgmap->vmemmap_shift : 0;
        /* All sub-sections within a section must share the same order. */
        if (nr_pages < PAGES_PER_SECTION && section_order(ms) && 
section_order(ms) != order)
                return ERR_PTR(-ENOTSUPP);
@@ -667,8 +665,8 @@ static struct page * __meminit section_activate(int nid, 
unsigned long pfn,
  * @nid: The node to add section on
  * @start_pfn: start pfn of the memory range
  * @nr_pages: number of pfns to add in the section
+ * @order: section order
  * @altmap: alternate pfns to allocate the memmap backing store
- * @pgmap: alternate compound page geometry for devmap mappings
  *
  * This is only intended for hotplug.
  *
@@ -682,8 +680,8 @@ static struct page * __meminit section_activate(int nid, 
unsigned long pfn,
  * * -ENOMEM   - Out of memory.
  */
 int __meminit sparse_add_section(int nid, unsigned long start_pfn,
-               unsigned long nr_pages, struct vmem_altmap *altmap,
-               struct dev_pagemap *pgmap)
+               unsigned long nr_pages, unsigned int order,
+               struct vmem_altmap *altmap)
 {
        unsigned long section_nr = pfn_to_section_nr(start_pfn);
        struct mem_section *ms;
@@ -694,7 +692,7 @@ int __meminit sparse_add_section(int nid, unsigned long 
start_pfn,
        if (ret < 0)
                return ret;
 
-       memmap = section_activate(nid, start_pfn, nr_pages, altmap, pgmap);
+       memmap = section_activate(nid, start_pfn, nr_pages, order, altmap);
        if (IS_ERR(memmap))
                return PTR_ERR(memmap);
 
-- 
2.54.0


Reply via email to