• Rick Edgecombe's avatar
    thp: add thp_get_unmapped_area_vmflags() · ed48e87c
    Rick Edgecombe authored
    When memory is being placed, mmap() will take care to respect the guard
    gaps of certain types of memory (VM_SHADOWSTACK, VM_GROWSUP and
    VM_GROWSDOWN).  In order to ensure guard gaps between mappings, mmap()
    needs to consider two things:
    
     1. That the new mapping isn't placed in an any existing mappings guard
        gaps.
     2. That the new mapping isn't placed such that any existing mappings
        are not in *its* guard gaps.
    
    The longstanding behavior of mmap() is to ensure 1, but not take any care
    around 2.  So for example, if there is a PAGE_SIZE free area, and a mmap()
    with a PAGE_SIZE size, and a type that has a guard gap is being placed,
    mmap() may place the shadow stack in the PAGE_SIZE free area.  Then the
    mapping that is supposed to have a guard gap will not have a gap to the
    adjacent VMA.
    
    Add a THP implementations of the vm_flags variant of get_unmapped_area(). 
    Future changes will call this from mmap.c in the do_mmap() path to allow
    shadow stacks to be placed with consideration taken for the start guard
    gap.  Shadow stack memory is always private and anonymous and so special
    guard gap logic is not needed in a lot of caseis, but it can be mapped by
    THP, so needs to be handled.
    
    Link: https://lkml.kernel.org/r/20240326021656.202649-7-rick.p.edgecombe@intel.comSigned-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
    Reviewed-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Aneesh Kumar K.V <aneesh.kumar@kernel.org>
    Cc: Borislav Petkov (AMD) <bp@alien8.de>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Deepak Gupta <debug@rivosinc.com>
    Cc: Guo Ren <guoren@kernel.org>
    Cc: Helge Deller <deller@gmx.de>
    Cc: H. Peter Anvin (Intel) <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    ed48e87c
mmap.c 107 KB