• Qian Cai's avatar
    mm/swap_state: fix a data race in swapin_nr_pages · d6c1f098
    Qian Cai authored
    "prev_offset" is a static variable in swapin_nr_pages() that can be
    accessed concurrently with only mmap_sem held in read mode as noticed by
    KCSAN,
    
     BUG: KCSAN: data-race in swap_cluster_readahead / swap_cluster_readahead
    
     write to 0xffffffff92763830 of 8 bytes by task 14795 on cpu 17:
      swap_cluster_readahead+0x2a6/0x5e0
      swapin_readahead+0x92/0x8dc
      do_swap_page+0x49b/0xf20
      __handle_mm_fault+0xcfb/0xd70
      handle_mm_fault+0xfc/0x2f0
      do_page_fault+0x263/0x715
      page_fault+0x34/0x40
    
     1 lock held by (dnf)/14795:
      #0: ffff897bd2e98858 (&mm->mmap_sem#2){++++}-{3:3}, at: do_page_fault+0x143/0x715
      do_user_addr_fault at arch/x86/mm/fault.c:1405
      (inlined by) do_page_fault at arch/x86/mm/fault.c:1535
     irq event stamp: 83493
     count_memcg_event_mm+0x1a6/0x270
     count_memcg_event_mm+0x119/0x270
     __do_softirq+0x365/0x589
     irq_exit+0xa2/0xc0
    
     read to 0xffffffff92763830 of 8 bytes by task 1 on cpu 22:
      swap_cluster_readahead+0xfd/0x5e0
      swapin_readahead+0x92/0x8dc
      do_swap_page+0x49b/0xf20
      __handle_mm_fault+0xcfb/0xd70
      handle_mm_fault+0xfc/0x2f0
      do_page_fault+0x263/0x715
      page_fault+0x34/0x40
    
     1 lock held by systemd/1:
      #0: ffff897c38f14858 (&mm->mmap_sem#2){++++}-{3:3}, at: do_page_fault+0x143/0x715
     irq event stamp: 43530289
     count_memcg_event_mm+0x1a6/0x270
     count_memcg_event_mm+0x119/0x270
     __do_softirq+0x365/0x589
     irq_exit+0xa2/0xc0
    Signed-off-by: default avatarQian Cai <cai@lca.pw>
    Signed-off-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/20200402213748.2237-1-cai@lca.pwSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d6c1f098
swap_state.c 22.4 KB