lkml.org 
[lkml]   [2020]   [Feb]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 6/7] mm/sparse.c: move subsection_map related codes together
    Date
    No functional change.

    Signed-off-by: Baoquan He <bhe@redhat.com>
    ---
    mm/sparse.c | 172 +++++++++++++++++++++++++---------------------------
    1 file changed, 84 insertions(+), 88 deletions(-)

    diff --git a/mm/sparse.c b/mm/sparse.c
    index 14bff0b44e7c..053d6c2e5c1f 100644
    --- a/mm/sparse.c
    +++ b/mm/sparse.c
    @@ -244,10 +244,94 @@ void __init subsection_map_init(unsigned long pfn, unsigned long nr_pages)
    nr_pages -= pfns;
    }
    }
    +
    +/**
    + * clear_subsection_map - Clear subsection map of one memory region
    + *
    + * @pfn - start pfn of the memory range
    + * @nr_pages - number of pfns to add in the region
    + *
    + * This is only intended for hotplug, and clear the related subsection
    + * map inside one section.
    + *
    + * Return:
    + * * -EINVAL - Section already deactived.
    + * * 0 - Subsection map is emptied.
    + * * 1 - Subsection map is not empty.
    + */
    +static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages)
    +{
    + DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 };
    + DECLARE_BITMAP(tmp, SUBSECTIONS_PER_SECTION) = { 0 };
    + struct mem_section *ms = __pfn_to_section(pfn);
    + unsigned long *subsection_map = ms->usage
    + ? &ms->usage->subsection_map[0] : NULL;
    +
    + subsection_mask_set(map, pfn, nr_pages);
    + if (subsection_map)
    + bitmap_and(tmp, map, subsection_map, SUBSECTIONS_PER_SECTION);
    +
    + if (WARN(!subsection_map || !bitmap_equal(tmp, map, SUBSECTIONS_PER_SECTION),
    + "section already deactivated (%#lx + %ld)\n",
    + pfn, nr_pages))
    + return -EINVAL;
    +
    + bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION);
    +
    + if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION))
    + return 0;
    +
    + return 1;
    +}
    +
    +/**
    + * fill_subsection_map - fill subsection map of a memory region
    + * @pfn - start pfn of the memory range
    + * @nr_pages - number of pfns to add in the region
    + *
    + * This fills the related subsection map inside one section, and only
    + * intended for hotplug.
    + *
    + * Return:
    + * * 0 - On success.
    + * * -EINVAL - Invalid memory region.
    + * * -EEXIST - Subsection map has been set.
    + */
    +static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
    +{
    + struct mem_section *ms = __pfn_to_section(pfn);
    + DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 };
    + unsigned long *subsection_map;
    + int rc = 0;
    +
    + subsection_mask_set(map, pfn, nr_pages);
    +
    + subsection_map = &ms->usage->subsection_map[0];
    +
    + if (bitmap_empty(map, SUBSECTIONS_PER_SECTION))
    + rc = -EINVAL;
    + else if (bitmap_intersects(map, subsection_map, SUBSECTIONS_PER_SECTION))
    + rc = -EEXIST;
    + else
    + bitmap_or(subsection_map, map, subsection_map,
    + SUBSECTIONS_PER_SECTION);
    +
    + return rc;
    +}
    #else
    void __init subsection_map_init(unsigned long pfn, unsigned long nr_pages)
    {
    }
    +
    +static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages)
    +{
    + return 0;
    +}
    +
    +static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
    +{
    + return 0;
    +}
    #endif

    /* Record a memory area against a node. */
    @@ -732,52 +816,6 @@ static void free_map_bootmem(struct page *memmap)
    }
    #endif /* CONFIG_SPARSEMEM_VMEMMAP */

    -#ifdef CONFIG_SPARSEMEM_VMEMMAP
    -/**
    - * clear_subsection_map - Clear subsection map of one memory region
    - *
    - * @pfn - start pfn of the memory range
    - * @nr_pages - number of pfns to add in the region
    - *
    - * This is only intended for hotplug, and clear the related subsection
    - * map inside one section.
    - *
    - * Return:
    - * * -EINVAL - Section already deactived.
    - * * 0 - Subsection map is emptied.
    - * * 1 - Subsection map is not empty.
    - */
    -static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages)
    -{
    - DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 };
    - DECLARE_BITMAP(tmp, SUBSECTIONS_PER_SECTION) = { 0 };
    - struct mem_section *ms = __pfn_to_section(pfn);
    - unsigned long *subsection_map = ms->usage
    - ? &ms->usage->subsection_map[0] : NULL;
    -
    - subsection_mask_set(map, pfn, nr_pages);
    - if (subsection_map)
    - bitmap_and(tmp, map, subsection_map, SUBSECTIONS_PER_SECTION);
    -
    - if (WARN(!subsection_map || !bitmap_equal(tmp, map, SUBSECTIONS_PER_SECTION),
    - "section already deactivated (%#lx + %ld)\n",
    - pfn, nr_pages))
    - return -EINVAL;
    -
    - bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION);
    -
    - if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION))
    - return 0;
    -
    - return 1;
    -}
    -#else
    -static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages)
    -{
    - return 0;
    -}
    -#endif
    -
    /*
    * To deactivate a memory region, there are 3 cases to handle across
    * two configurations (SPARSEMEM_VMEMMAP={y,n}):
    @@ -833,48 +871,6 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages,
    ms->section_mem_map = (unsigned long)NULL;
    }

    -#ifdef CONFIG_SPARSEMEM_VMEMMAP
    -/**
    - * fill_subsection_map - fill subsection map of a memory region
    - * @pfn - start pfn of the memory range
    - * @nr_pages - number of pfns to add in the region
    - *
    - * This fills the related subsection map inside one section, and only
    - * intended for hotplug.
    - *
    - * Return:
    - * * 0 - On success.
    - * * -EINVAL - Invalid memory region.
    - * * -EEXIST - Subsection map has been set.
    - */
    -static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
    -{
    - struct mem_section *ms = __pfn_to_section(pfn);
    - DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 };
    - unsigned long *subsection_map;
    - int rc = 0;
    -
    - subsection_mask_set(map, pfn, nr_pages);
    -
    - subsection_map = &ms->usage->subsection_map[0];
    -
    - if (bitmap_empty(map, SUBSECTIONS_PER_SECTION))
    - rc = -EINVAL;
    - else if (bitmap_intersects(map, subsection_map, SUBSECTIONS_PER_SECTION))
    - rc = -EEXIST;
    - else
    - bitmap_or(subsection_map, map, subsection_map,
    - SUBSECTIONS_PER_SECTION);
    -
    - 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,
    unsigned long nr_pages, struct vmem_altmap *altmap)
    {
    --
    2.17.2
    \
     
     \ /
      Last update: 2020-02-20 05:35    [W:4.607 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site