• Linus Torvalds's avatar
    mm: introduce new 'lock_mm_and_find_vma()' page fault helper · c2508ec5
    Linus Torvalds authored
    .. and make x86 use it.
    
    This basically extracts the existing x86 "find and expand faulting vma"
    code, but extends it to also take the mmap lock for writing in case we
    actually do need to expand the vma.
    
    We've historically short-circuited that case, and have some rather ugly
    special logic to serialize the stack segment expansion (since we only
    hold the mmap lock for reading) that doesn't match the normal VM
    locking.
    
    That slight violation of locking worked well, right up until it didn't:
    the maple tree code really does want proper locking even for simple
    extension of an existing vma.
    
    So extract the code for "look up the vma of the fault" from x86, fix it
    up to do the necessary write locking, and make it available as a helper
    function for other architectures that can use the common helper.
    
    Note: I say "common helper", but it really only handles the normal
    stack-grows-down case.  Which is all architectures except for PA-RISC
    and IA64.  So some rare architectures can't use the helper, but if they
    care they'll just need to open-code this logic.
    
    It's also worth pointing out that this code really would like to have an
    optimistic "mmap_upgrade_trylock()" to make it quicker to go from a
    read-lock (for the common case) to taking the write lock (for having to
    extend the vma) in the normal single-threaded situation where there is
    no other locking activity.
    
    But that _is_ all the very uncommon special case, so while it would be
    nice to have such an operation, it probably doesn't matter in reality.
    I did put in the skeleton code for such a possible future expansion,
    even if it only acts as pseudo-documentation for what we're doing.
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    c2508ec5
fault.c 41.6 KB