Skip to content
  • Qian Cai's avatar
    mm/swapfile: fix data races in try_to_unuse() · 21820948
    Qian Cai authored
    
    
    si->inuse_pages could be accessed concurrently as noticed by KCSAN,
    
     write to 0xffff98b00ebd04dc of 4 bytes by task 82262 on cpu 92:
      swap_range_free+0xbe/0x230
      swap_range_free at mm/swapfile.c:719
      swapcache_free_entries+0x1be/0x250
      free_swap_slot+0x1c8/0x220
      __swap_entry_free.constprop.19+0xa3/0xb0
      free_swap_and_cache+0x53/0xa0
      unmap_page_range+0x7e0/0x1ce0
      unmap_single_vma+0xcd/0x170
      unmap_vmas+0x18b/0x220
      exit_mmap+0xee/0x220
      mmput+0xe7/0x240
      do_exit+0x598/0xfd0
      do_group_exit+0x8b/0x180
      get_signal+0x293/0x13d0
      do_signal+0x37/0x5d0
      prepare_exit_to_usermode+0x1b7/0x2c0
      ret_from_intr+0x32/0x42
    
     read to 0xffff98b00ebd04dc of 4 bytes by task 82499 on cpu 46:
      try_to_unuse+0x86b/0xc80
      try_to_unuse at mm/swapfile.c:2185
      __x64_sys_swapoff+0x372/0xd40
      do_syscall_64+0x91/0xb05
      entry_SYSCALL_64_after_hwframe+0x49/0xbe
    
    The plain reads in try_to_unuse() are outside si->lock critical section
    which result in data races that could be dangerous to be used in a loop.
    Fix them by adding READ_ONCE().
    
    Signed-off-by: default avatarQian Cai <cai@lca.pw>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Reviewed-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Cc: Marco Elver <elver@google.com>
    Cc: Hugh Dickins <hughd@google.com>
    Link: http://lkml.kernel.org/r/1582578903-29294-1-git-send-email-cai@lca.pw
    
    
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    21820948