• Hugh Dickins's avatar
    arm: allow pte_offset_map[_lock]() to fail · 766b59e8
    Hugh Dickins authored
    Patch series "arch: allow pte_offset_map[_lock]() to fail", v2.
    
    What is it all about?  Some mmap_lock avoidance i.e.  latency reduction. 
    Initially just for the case of collapsing shmem or file pages to THPs; but
    likely to be relied upon later in other contexts e.g.  freeing of empty
    page tables (but that's not work I'm doing).  mmap_write_lock avoidance
    when collapsing to anon THPs?  Perhaps, but again that's not work I've
    done: a quick attempt was not as easy as the shmem/file case.
    
    I would much prefer not to have to make these small but wide-ranging
    changes for such a niche case; but failed to find another way, and have
    heard that shmem MADV_COLLAPSE's usefulness is being limited by that
    mmap_write_lock it currently requires.
    
    These changes (though of course not these exact patches, and not all of
    these architectures!) have been in Google's data centre kernel for three
    years now: we do rely upon them.
    
    What are the per-arch changes about?  Generally, two things.
    
    One: the current mmap locking may not be enough to guard against that
    tricky transition between pmd entry pointing to page table, and empty pmd
    entry, and pmd entry pointing to huge page: pte_offset_map() will have to
    validate the pmd entry for itself, returning NULL if no page table is
    there.  What to do about that varies: often the nearby error handling
    indicates just to skip it; but in some cases a "goto again" looks
    appropriate (and if that risks an infinite loop, then there must have been
    an oops, or pfn 0 mistaken for page table, before).
    
    Deeper study of each site might show that 90% of them here in arch code
    could only fail if there's corruption e.g.  a transition to THP would be
    surprising on an arch without HAVE_ARCH_TRANSPARENT_HUGEPAGE.  But given
    the likely extension to freeing empty page tables, I have not limited this
    set of changes to THP; and it has been easier, and sets a better example,
    if each site is given appropriate handling.
    
    Two: pte_offset_map() will need to do an rcu_read_lock(), with the
    corresponding rcu_read_unlock() in pte_unmap().  But most architectures
    never supported CONFIG_HIGHPTE, so some don't always call pte_unmap()
    after pte_offset_map(), or have used userspace pte_offset_map() where
    pte_offset_kernel() is more correct.  No problem in the current tree, but
    a problem once an rcu_read_unlock() will be needed to keep balance.
    
    A common special case of that comes in arch/*/mm/hugetlbpage.c, if the
    architecture supports hugetlb pages down at the lowest PTE level. 
    huge_pte_alloc() uses pte_alloc_map(), but generic hugetlb code does no
    corresponding pte_unmap(); similarly for huge_pte_offset().
    
    In rare transient cases, not yet made possible, pte_offset_map() and
    pte_offset_map_lock() may not find a page table: handle appropriately.
    
    Link: https://lkml.kernel.org/r/a4963be9-7aa6-350-66d0-2ba843e1af44@google.com
    Link: https://lkml.kernel.org/r/813429a1-204a-1844-eeae-7fd72826c28@google.comSigned-off-by: default avatarHugh Dickins <hughd@google.com>
    Cc: Alexander Gordeev <agordeev@linux.ibm.com>
    Cc: Alexandre Ghiti <alexghiti@rivosinc.com>
    Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
    Cc: Chris Zankel <chris@zankel.net>
    Cc: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Greg Ungerer <gerg@linux-m68k.org>
    Cc: Heiko Carstens <hca@linux.ibm.com>
    Cc: Helge Deller <deller@gmx.de>
    Cc: John David Anglin <dave.anglin@bell.net>
    Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
    Cc: Max Filippov <jcmvbkbc@gmail.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Michal Simek <monstr@monstr.eu>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Mike Rapoport (IBM) <rppt@kernel.org>
    Cc: Palmer Dabbelt <palmer@dabbelt.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Qi Zheng <zhengqi.arch@bytedance.com>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Will Deacon <will@kernel.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    766b59e8
fault-armv.c 6.64 KB