• Yang Shi's avatar
    mm: brk: downgrade mmap_sem to read when shrinking · 9bc8039e
    Yang Shi authored
    brk might be used to shrink memory mapping too other than munmap().  So,
    it may hold write mmap_sem for long time when shrinking large mapping, as
    what commit ("mm: mmap: zap pages with read mmap_sem in munmap")
    described.
    
    The brk() will not manipulate vmas anymore after __do_munmap() call for
    the mapping shrink use case.  But, it may set mm->brk after __do_munmap(),
    which needs hold write mmap_sem.
    
    However, a simple trick can workaround this by setting mm->brk before
    __do_munmap().  Then restore the original value if __do_munmap() fails.
    With this trick, it is safe to downgrade to read mmap_sem.
    
    So, the same optimization, which downgrades mmap_sem to read for zapping
    pages, is also feasible and reasonable to this case.
    
    The period of holding exclusive mmap_sem for shrinking large mapping would
    be reduced significantly with this optimization.
    
    [akpm@linux-foundation.org: tweak comment]
    [yang.shi@linux.alibaba.com: fix unsigned compare against 0 issue]
    ...
    9bc8039e
mmap.c 100 KB