OSDN Git Service

drivers:xen-selfballoon:reset 'frontswap_inertia_counter' after frontswap_shrink
authorBob Liu <lliubbo@gmail.com>
Mon, 17 Feb 2014 11:11:39 +0000 (19:11 +0800)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 28 Feb 2014 20:26:12 +0000 (15:26 -0500)
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: Bob Liu <bob.liu@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
drivers/xen/xen-selfballoon.c

index 745ad79..3b2bffd 100644 (file)
@@ -170,6 +170,7 @@ static void frontswap_selfshrink(void)
                tgt_frontswap_pages = cur_frontswap_pages -
                        (cur_frontswap_pages / frontswap_hysteresis);
        frontswap_shrink(tgt_frontswap_pages);
+       frontswap_inertia_counter = frontswap_inertia;
 }
 
 #endif /* CONFIG_FRONTSWAP */