Skip to content
  • Shaohua Li's avatar
    swap: change block allocation algorithm for SSD · 2a8f9449
    Shaohua Li authored
    
    
    I'm using a fast SSD to do swap.  scan_swap_map() sometimes uses up to
    20~30% CPU time (when cluster is hard to find, the CPU time can be up to
    80%), which becomes a bottleneck.  scan_swap_map() scans a byte array to
    search a 256 page cluster, which is very slow.
    
    Here I introduced a simple algorithm to search cluster.  Since we only
    care about 256 pages cluster, we can just use a counter to track if a
    cluster is free.  Every 256 pages use one int to store the counter.  If
    the counter of a cluster is 0, the cluster is free.  All free clusters
    will be added to a list, so searching cluster is very efficient.  With
    this, scap_swap_map() overhead disappears.
    
    This might help low end SD card swap too.  Because if the cluster is
    aligned, SD firmware can do flash erase more efficiently.
    
    We only enable the algorithm for SSD.  Hard disk swap isn't fast enough
    and has downside with the algorithm which might introduce regression (see
    below).
    
    The patch slightly changes which cluster is choosen.  It always adds free
    cluster to list tail.  This can help wear leveling for low end SSD too.
    And if no cluster found, the scan_swap_map() will do search from the end
    of last cluster.  So if no cluster found, the scan_swap_map() will do
    search from the end of last free cluster, which is random.  For SSD, this
    isn't a problem at all.
    
    Another downside is the cluster must be aligned to 256 pages, which will
    reduce the chance to find a cluster.  I would expect this isn't a big
    problem for SSD because of the non-seek penality.  (And this is the reason
    I only enable the algorithm for SSD).
    
    Signed-off-by: default avatarShaohua Li <shli@fusionio.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Kyungmin Park <kmpark@infradead.org>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Rafael Aquini <aquini@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    2a8f9449