Skip to content
  • Hugh Dickins's avatar
    mm: swapoff: shmem_unuse() stop eviction without igrab() · af53d3e9
    Hugh Dickins authored
    The igrab() in shmem_unuse() looks good, but we forgot that it gives no
    protection against concurrent unmounting: a point made by Konstantin
    Khlebnikov eight years ago, and then fixed in 2.6.39 by 778dd893
    ("tmpfs: fix race between umount and swapoff").  The current 5.1-rc
    swapoff is liable to hit "VFS: Busy inodes after unmount of tmpfs.
    Self-destruct in 5 seconds.  Have a nice day..." followed by GPF.
    
    Once again, give up on using igrab(); but don't go back to making such
    heavy-handed use of shmem_swaplist_mutex as last time: that would spoil
    the new design, and I expect could deadlock inside shmem_swapin_page().
    
    Instead, shmem_unuse() just raise a "stop_eviction" count in the shmem-
    specific inode, and shmem_evict_inode() wait for that to go down to 0.
    Call it "stop_eviction" rather than "swapoff_busy" because it can be put
    to use for others later (huge tmpfs patches expect to use it).
    
    That simplifies shmem_unuse(), protecting it from both unlink and
    unmount; and in practice lets it locate all the swap in its first try.
    But do not rely on that: there's still a theoretical case, when
    shmem_writepage() might have been preempted after its get_swap_page(),
    before making the swap entry visible to swapoff.
    
    [hughd@google.com: remove incorrect list_del()]
      Link: http://lkml.kernel.org/r/alpine.LSU.2.11.1904091133570.1898@eggly.anvils
    Link: http://lkml.kernel.org/r/alpine.LSU.2.11.1904081259400.1523@eggly.anvils
    Fixes: b56a2d8a
    
     ("mm: rid swapoff of quadratic complexity")
    Signed-off-by: default avatarHugh Dickins <hughd@google.com>
    Cc: "Alex Xu (Hello71)" <alex_y_xu@yahoo.ca>
    Cc: Huang Ying <ying.huang@intel.com>
    Cc: Kelley Nielsen <kelleynnn@gmail.com>
    Cc: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
    Cc: Rik van Riel <riel@surriel.com>
    Cc: Vineeth Pillai <vpillai@digitalocean.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    af53d3e9