Skip to content
  • Mark Nelson's avatar
    powerpc/mm: Track backing pages allocated by vmemmap_populate() · 91eea67c
    Mark Nelson authored
    
    
    We need to keep track of the backing pages that get allocated by
    vmemmap_populate() so that when we use kdump, the dump-capture kernel knows
    where these pages are.
    
    We use a simple linked list of structures that contain the physical address
    of the backing page and corresponding virtual address to track the backing
    pages.
    To save space, we just use a pointer to the next struct vmemmap_backing. We
    can also do this because we never remove nodes.  We call the pointer "list"
    to be compatible with changes made to the crash utility.
    
    vmemmap_populate() is called either at boot-time or on a memory hotplug
    operation. We don't have to worry about the boot-time calls because they
    will be inherently single-threaded, and for a memory hotplug operation
    vmemmap_populate() is called through:
    sparse_add_one_section()
                |
                V
    kmalloc_section_memmap()
                |
                V
    sparse_mem_map_populate()
                |
                V
    vmemmap_populate()
    and in sparse_add_one_section() we're protected by pgdat_resize_lock().
    So, we don't need a spinlock to protect the vmemmap_list.
    
    We allocate space for the vmemmap_backing structs by allocating whole pages
    in vmemmap_list_alloc() and then handing out chunks of this to
    vmemmap_list_populate().
    
    This means that we waste at most just under one page, but this keeps the code
    is simple.
    
    Signed-off-by: default avatarMark Nelson <markn@au1.ibm.com>
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    91eea67c