Skip to content
  • Johannes Weiner's avatar
    mm: drop mmap_sem before calling balance_dirty_pages() in write fault · 6afe5e72
    Johannes Weiner authored
    One of our services is observing hanging ps/top/etc under heavy write IO,
    and the task states show this is an mmap_sem priority inversion:
    
    A write fault is holding the mmap_sem in read-mode and waiting for
    (heavily cgroup-limited) IO in balance_dirty_pages():
    
    [<0>] balance_dirty_pages+0x724/0x905
    [<0>] balance_dirty_pages_ratelimited+0x254/0x390
    [<0>] fault_dirty_shared_page.isra.96+0x4a/0x90
    [<0>] do_wp_page+0x33e/0x400
    [<0>] __handle_mm_fault+0x6f0/0xfa0
    [<0>] handle_mm_fault+0xe4/0x200
    [<0>] __do_page_fault+0x22b/0x4a0
    [<0>] page_fault+0x45/0x50
    [<0>] 0xffffffffffffffff
    
    Somebody tries to change the address space, contending for the mmap_sem in
    write-mode:
    
    [<0>] call_rwsem_down_write_failed_killable+0x13/0x20
    [<0>] do_mprotect_pkey+0xa8/0x330
    [<0>] SyS_mprotect+0xf/0x20
    [<0>] do_syscall_64+0x5b/0x100
    [<0>] entry_SYSCALL_64_after_hwframe+0x3d/0xa2
    [<0>] 0xffffffffffffffff
    
    The waiting writer locks out all subsequent readers to avoid lock
    starvation, and several threads can be seen hanging like this:
    
    [<0>] call_rwsem_down_read_failed+0x14/0x30
    [<0>] proc_pid_cmdline_read+0xa0/0x480
    [<0>] __vfs_read+0x23/0x140
    [<0>] vfs_read+0x87/0x130
    [<0>] SyS_read+0x42/0x90
    [<0>] do_syscall_64+0x5b/0x100
    [<0>] entry_SYSCALL_64_after_hwframe+0x3d/0xa2
    [<0>] 0xffffffffffffffff
    
    To fix this, do what we do for cache read faults already: drop the
    mmap_sem before calling into anything IO bound, in this case the
    balance_dirty_pages() function, and return VM_FAULT_RETRY.
    
    Link: http://lkml.kernel.org/r/20190924194238.GA29030@cmpxchg.org
    
    
    Signed-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Reviewed-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Josef Bacik <josef@toxicpanda.com>
    Cc: Hillf Danton <hdanton@sina.com>
    Cc: Hugh Dickins <hughd@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
    6afe5e72