• Bharata B Rao's avatar
    powerpc/mm/radix: Remove split_kernel_mapping() · d6d6ebfc
    Bharata B Rao authored
    We split the page table mapping on memory unplug if the
    linear range was mapped with huge page mapping (for ex: 1G)
    The page table splitting code has a few issues:
    
    1. Recursive locking
    --------------------
    Memory unplug path takes cpu_hotplug_lock and calls stop_machine()
    for splitting the mappings. However stop_machine() takes
    cpu_hotplug_lock again causing deadlock.
    
    2. BUG: sleeping function called from in_atomic() context
    ---------------------------------------------------------
    Memory unplug path (remove_pagetable) takes init_mm.page_table_lock
    spinlock and later calls stop_machine() which does wait_for_completion()
    
    3. Bad unlock unbalance
    -----------------------
    Memory unplug path takes init_mm.page_table_lock spinlock and calls
    stop_machine(). The stop_machine thread function runs in a different
    thread context (migration thread) which tries to release and reaquire
    ptl. Releasing ptl from a different thread than which acquired it
    causes bad unlock unbalance.
    
    These problems can be avoided if we avoid mapping hot-plugged memory
    with 1G mapping, thereby removing the need for splitting them during
    unplug. The kernel always make sure the minimum unplug request is
    SUBSECTION_SIZE for device memory and SECTION_SIZE for regular memory.
    
    In preparation for such a change remove page table splitting support.
    
    This essentially is a revert of
    commit 4dd5f8a9 ("powerpc/mm/radix: Split linear mapping on hot-unplug")
    Signed-off-by: default avatarBharata B Rao <bharata@linux.ibm.com>
    Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20200709131925.922266-4-aneesh.kumar@linux.ibm.com
    d6d6ebfc
radix_pgtable.c 26.8 KB