• Pavel Tatashin's avatar
    mm/sparse: abstract sparse buffer allocations · 35fd1eb1
    Pavel Tatashin authored
    Patch series "sparse_init rewrite", v6.
    
    In sparse_init() we allocate two large buffers to temporary hold usemap
    and memmap for the whole machine.  However, we can avoid doing that if
    we changed sparse_init() to operated on per-node bases instead of doing
    it on the whole machine beforehand.
    
    As shown by Baoquan
      http://lkml.kernel.org/r/20180628062857.29658-1-bhe@redhat.com
    
    The buffers are large enough to cause machine stop to boot on small
    memory systems.
    
    Another benefit of these changes is that they also obsolete
    CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER.
    
    This patch (of 5):
    
    When struct pages are allocated for sparse-vmemmap VA layout, we first try
    to allocate one large buffer, and than if that fails allocate struct pages
    for each section as we go.
    
    The code that allocates buffer is uses global variables and is spread
    across several call sites.
    
    Cleanup the code by introducing three functions to handle the global
    buffer:
    
    sparse_buffer_init()	initialize the buffer
    sparse_buffer_fini()	free the remaining part of the buffer
    sparse_buffer_alloc()	alloc from the buffer, and if buffer is empty
    return NULL
    
    Define these functions in sparse.c instead of sparse-vmemmap.c because
    later we will use them for non-vmemmap sparse allocations as well.
    
    [akpm@linux-foundation.org: use PTR_ALIGN()]
    [akpm@linux-foundation.org: s/BUG_ON/WARN_ON/]
    Link: http://lkml.kernel.org/r/20180712203730.8703-2-pasha.tatashin@oracle.comSigned-off-by: default avatarPavel Tatashin <pasha.tatashin@oracle.com>
    Tested-by: Michael Ellerman <mpe@ellerman.id.au>	[powerpc]
    Reviewed-by: default avatarOscar Salvador <osalvador@suse.de>
    Tested-by: default avatarOscar Salvador <osalvador@suse.de>
    Cc: Pasha Tatashin <Pavel.Tatashin@microsoft.com>
    Cc: Steven Sistare <steven.sistare@oracle.com>
    Cc: Daniel Jordan <daniel.m.jordan@oracle.com>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jérôme Glisse <jglisse@redhat.com>
    Cc: Souptick Joarder <jrdr.linux@gmail.com>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Abdul Haleem <abdhalee@linux.vnet.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    35fd1eb1
sparse.c 24.9 KB