• Ma Wupeng's avatar
    swap: stop add to avail list if swap is full · c70699e5
    Ma Wupeng authored
    Our test finds a WARN_ON in add_to_avail_list.  During add_to_avail_list,
    avail_lists is already in swap_avail_heads, while leads to this WARN_ON.
    
    Here is the simplified calltrace:
    
    ------------[ cut here ]------------
    Call trace:
     add_to_avail_list+0xb8/0xc0
     swap_range_free+0x110/0x138
     swapcache_free_entries+0x100/0x1c0
     free_swap_slot+0xbc/0xe0
     put_swap_folio+0x1f0/0x2ec
     delete_from_swap_cache+0x6c/0xd0
     folio_free_swap+0xa4/0xe4
     __try_to_reclaim_swap+0x9c/0x190
     free_swap_and_cache+0x84/0x88
     unmap_page_range+0x31c/0x934
     unmap_single_vma.isra.0+0x48/0x84
     unmap_vmas+0x98/0x10c
     exit_mmap+0xa4/0x210
     mmput+0x88/0x158
     do_exit+0x284/0x970
     do_group_exit+0x34/0x90
     post_copy_siginfo_from_user32+0x0/0x1cc
     do_notify_resume+0x15c/0x470
     el0_svc+0x74/0x84
     el0t_64_sync_handler+0xb8/0xbc
     el0t_64_sync+0x190/0x194
    
    During swapoff, try_to_unuse fails to alloc memory due to memory limit and
    this leads to the failure of swapoff and causes re-insertion of swap space
    back into swap_list.  During _enable_swap_info, this swap device is added
    to avail list even this swap device if full.  At the same time, one entry
    in this full swap device in released and we try to add this device into
    avail list and find it is already in the avail list.  This causes this
    WARN_ON.
    
    To fix this.  Don't add to avail list is swap is full.
    
    [akpm@linux-foundation.org: coding-style cleanups]
    Link: https://lkml.kernel.org/r/20230627120833.2230766-3-mawupeng1@huawei.comSigned-off-by: default avatarMa Wupeng <mawupeng1@huawei.com>
    Cc: Hugh Dickins <hughd@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    c70699e5
swapfile.c 92.2 KB