• Bob Liu's avatar
    drivers:xen-selfballoon:reset 'frontswap_inertia_counter' after frontswap_shrink · d4c7abdf
    Bob Liu authored
    When I looked at this issue https://lkml.org/lkml/2013/11/21/158, I found that
    frontswap_selfshrink() doesn't work as expected sometimes.
    Pages are continuously added to frontswap and gotten back soon. It's a waste of
    cpu time and increases the memory pressue of Guest OS.
    
    Take an example.
    First time in frontswap_selfshrink():
    1. last_frontswap_pages = cur_frontswap_pages = 0
    2. cur_frontswap_pages  = frontswap_curr_pages() = 100
    
    When 'frontswap_inertia_counter' decreased to 0:
    1. last_frontswap_pages = cur_frontswap_pages = 100
    2. cur_frontswap_pages = frontswap_curr_pages() = 100
    3. call frontswap_shrink() and let's assumption that 10 pages are gotten back
       from frontswap.
    4. now frontswap_curr_pages() is 90.
    
    If then memory is not enough in Guest OS and 9 more pages(smaller than gotten
    back) added to frontswap.
    Now frontswap_curr_pages() is 99 and we don't expect to get back more pages from
    frontswap because geust os is under memory pressure.
    
    But next time in frontswap_selfshrink():
    1. last_frontswap_pages is set to the old value of cur_frontswap_pages(still
       100)
    2. cur_frontswap_pages(99) is still smaller than last_frontswap_pages.
    3. call frontswap_shrink() and continue to get back pages from frontswap!!
    Signed-off-by: default avatarBob Liu <bob.liu@oracle.com>
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    d4c7abdf
xen-selfballoon.c 17.8 KB