• Miaohe Lin's avatar
    swap: fix do_swap_page() race with swapoff · 2799e775
    Miaohe Lin authored
    When I was investigating the swap code, I found the below possible race
    window:
    
    CPU 1                                   	CPU 2
    -----                                   	-----
    do_swap_page
      if (data_race(si->flags & SWP_SYNCHRONOUS_IO)
      swap_readpage
        if (data_race(sis->flags & SWP_FS_OPS)) {
                                            	swapoff
    					  	  ..
    					  	  p->swap_file = NULL;
    					  	  ..
        struct file *swap_file = sis->swap_file;
        struct address_space *mapping = swap_file->f_mapping;[oops!]
    
    Note that for the pages that are swapped in through swap cache, this isn't
    an issue. Because the page is locked, and the swap entry will be marked
    with SWAP_HAS_CACHE, so swapoff() can not proceed until the page has been
    unlocked.
    
    Fix this race by using get/put_swap_device() to guard against concurrent
    swapoff.
    
    Link: https://lkml.kernel.org/r/20210426123316.806267-3-linmiaohe@huawei.com
    Fixes: 0bcac06f ("mm,swap: skip swapcache for swapin of synchronous device")
    Signed-off-by: default avatarMiaohe Lin <linmiaohe@huawei.com>
    Reviewed-by: default avatar"Huang, Ying" <ying.huang@intel.com>
    Cc: Alex Shi <alexs@kernel.org>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Dennis Zhou <dennis@kernel.org>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Tim Chen <tim.c.chen@linux.intel.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Yu Zhao <yuzhao@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    2799e775
swap.h 22.6 KB