lkml.org 
[lkml]   [2018]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 2/5] mm/sparse: use the new sparse buffer functions in non-vmemmap
    Date
    non-vmemmap sparse also allocated large contiguous chunk of memory, and if
    fails falls back to smaller allocations. Use the same functions to allocate
    buffer as the vmemmap-sparse

    Signed-off-by: Pavel Tatashin <pasha.tatashin@oracle.com>
    ---
    mm/sparse.c | 41 ++++++++++++++---------------------------
    1 file changed, 14 insertions(+), 27 deletions(-)

    diff --git a/mm/sparse.c b/mm/sparse.c
    index ac57bae476f4..976854a3af8b 100644
    --- a/mm/sparse.c
    +++ b/mm/sparse.c
    @@ -408,13 +408,20 @@ unsigned long __init section_map_size(void)
    }

    #else
    +unsigned long __init section_map_size(void)
    +{
    + return PAGE_ALIGN(sizeof(struct page) * PAGES_PER_SECTION);
    +}
    +
    struct page __init *sparse_mem_map_populate(unsigned long pnum, int nid,
    struct vmem_altmap *altmap)
    {
    - struct page *map;
    - unsigned long size;
    + unsigned long size = section_map_size();
    + struct page *map = sparse_buffer_alloc(size);
    +
    + if (map)
    + return map;

    - size = PAGE_ALIGN(sizeof(struct page) * PAGES_PER_SECTION);
    map = memblock_virt_alloc_try_nid(size,
    PAGE_SIZE, __pa(MAX_DMA_ADDRESS),
    BOOTMEM_ALLOC_ACCESSIBLE, nid);
    @@ -425,42 +432,22 @@ void __init sparse_mem_maps_populate_node(struct page **map_map,
    unsigned long pnum_end,
    unsigned long map_count, int nodeid)
    {
    - void *map;
    unsigned long pnum;
    - unsigned long size = sizeof(struct page) * PAGES_PER_SECTION;
    - int nr_consumed_maps;
    -
    - size = PAGE_ALIGN(size);
    - map = memblock_virt_alloc_try_nid_raw(size * map_count,
    - PAGE_SIZE, __pa(MAX_DMA_ADDRESS),
    - BOOTMEM_ALLOC_ACCESSIBLE, nodeid);
    - if (map) {
    - nr_consumed_maps = 0;
    - for (pnum = pnum_begin; pnum < pnum_end; pnum++) {
    - if (!present_section_nr(pnum))
    - continue;
    - map_map[nr_consumed_maps] = map;
    - map += size;
    - nr_consumed_maps++;
    - }
    - return;
    - }
    + unsigned long size = section_map_size();
    + int nr_consumed_maps = 0;

    - /* fallback */
    - nr_consumed_maps = 0;
    + sparse_buffer_init(size * map_count, nodeid);
    for (pnum = pnum_begin; pnum < pnum_end; pnum++) {
    - struct mem_section *ms;
    -
    if (!present_section_nr(pnum))
    continue;
    map_map[nr_consumed_maps] =
    sparse_mem_map_populate(pnum, nodeid, NULL);
    if (map_map[nr_consumed_maps++])
    continue;
    - ms = __nr_to_section(pnum);
    pr_err("%s: sparsemem memory map backing failed some memory will not be available\n",
    __func__);
    }
    + sparse_buffer_fini();
    }
    #endif /* !CONFIG_SPARSEMEM_VMEMMAP */

    --
    2.18.0
    \
     
     \ /
      Last update: 2018-07-15 22:06    [W:2.668 / U:0.252 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site