• S
    vmscan: prevent get_scan_ratio() rounding errors · 76a33fc3
    Shaohua Li 提交于
    get_scan_ratio() calculates percentage and if the percentage is < 1%, it
    will round percentage down to 0% and cause we completely ignore scanning
    anon/file pages to reclaim memory even the total anon/file pages are very
    big.
    
    To avoid underflow, we don't use percentage, instead we directly calculate
    how many pages should be scaned.  In this way, we should get several
    scanned pages for < 1% percent.
    
    This has some benefits:
    
    1. increase our calculation precision
    
    2.  making our scan more smoothly.  Without this, if percent[x] is
       underflow, shrink_zone() doesn't scan any pages and suddenly it scans
       all pages when priority is zero.  With this, even priority isn't zero,
       shrink_zone() gets chance to scan some pages.
    
    Note, this patch doesn't really change logics, but just increase
    precision.  For system with a lot of memory, this might slightly changes
    behavior.  For example, in a sequential file read workload, without the
    patch, we don't swap any anon pages.  With it, if anon memory size is
    bigger than 16G, we will see one anon page swapped.  The 16G is calculated
    as PAGE_SIZE * priority(4096) * (fp/ap).  fp/ap is assumed to be 1024
    which is common in this workload.  So the impact sounds not a big deal.
    Signed-off-by: NShaohua Li <shaohua.li@intel.com>
    Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Acked-by: NRik van Riel <riel@redhat.com>
    Cc: Wu Fengguang <fengguang.wu@intel.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    76a33fc3
vmscan.c 80.3 KB