• Hugh Dickins's avatar
    [PATCH] swap: scan_swap_map drop swap_device_lock · 52b7efdb
    Hugh Dickins authored
    get_swap_page has often shown up on latency traces, doing lengthy scans while
    holding two spinlocks.  swap_list_lock is already dropped, now scan_swap_map
    drop swap_device_lock before scanning the swap_map.
    
    While scanning for an empty cluster, don't worry that racing tasks may
    allocate what was free and free what was allocated; but when allocating an
    entry, check it's still free after retaking the lock.  Avoid dropping the lock
    in the expected common path.  No barriers beyond the locks, just let the
    cookie crumble; highest_bit limit is volatile, but benign.
    
    Guard against swapoff: must check SWP_WRITEOK before allocating, must raise
    SWP_SCANNING reference count while in scan_swap_map, swapoff wait for that to
    fall - just use schedule_timeout, we don't want to burden scan_swap_map
    itself, and it's very unlikely that anyone can really still be in
    scan_swap_map once swapoff gets this far.
    Signed-off-by: default avatarHugh Dickins <hugh@veritas.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    52b7efdb
swapfile.c 42 KB