summaryrefslogtreecommitdiffstats
path: root/drivers/xen/xen-selfballoon.c
diff options
context:
space:
mode:
authorBob Liu <lliubbo@gmail.com>2014-01-22 01:57:44 -0500
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2014-01-31 09:48:43 -0500
commitbc1b0df59e3fc4573f92bc1aab9652047a0aeaa7 (patch)
tree53cc9ed64066763826df51f914556c9f88a2a864 /drivers/xen/xen-selfballoon.c
parent08ece5bb2312b4510b161a6ef6682f37f4eac8a1 (diff)
drivers: xen: deaggressive selfballoon driver
Current xen-selfballoon driver is too aggressive which may cause OOM be triggered more often. Eg. this bug reported by James: https://lkml.org/lkml/2013/11/21/158 There are two mainly reasons: 1) The original goal_page didn't consider some pages used by kernel space, like slab pages and pages used by device drivers. 2) The balloon driver may not give back memory to guest OS fast enough when the workload suddenly aquries a lot of physical memory. In both cases, the guest OS will suffer from memory pressure and OOM may be triggered. The fix is make xen-selfballoon driver not that aggressive by adding extra 10% of total ram pages to goal_page. It's more valuable to keep the guest system reliable and response faster than balloon out these 10% pages to XEN. Signed-off-by: Bob Liu <bob.liu@oracle.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'drivers/xen/xen-selfballoon.c')
-rw-r--r--drivers/xen/xen-selfballoon.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/xen/xen-selfballoon.c b/drivers/xen/xen-selfballoon.c
index 21e18c18c7a1..745ad79c1d8e 100644
--- a/drivers/xen/xen-selfballoon.c
+++ b/drivers/xen/xen-selfballoon.c
@@ -175,6 +175,7 @@ static void frontswap_selfshrink(void)
175#endif /* CONFIG_FRONTSWAP */ 175#endif /* CONFIG_FRONTSWAP */
176 176
177#define MB2PAGES(mb) ((mb) << (20 - PAGE_SHIFT)) 177#define MB2PAGES(mb) ((mb) << (20 - PAGE_SHIFT))
178#define PAGES2MB(pages) ((pages) >> (20 - PAGE_SHIFT))
178 179
179/* 180/*
180 * Use current balloon size, the goal (vm_committed_as), and hysteresis 181 * Use current balloon size, the goal (vm_committed_as), and hysteresis
@@ -525,6 +526,7 @@ EXPORT_SYMBOL(register_xen_selfballooning);
525int xen_selfballoon_init(bool use_selfballooning, bool use_frontswap_selfshrink) 526int xen_selfballoon_init(bool use_selfballooning, bool use_frontswap_selfshrink)
526{ 527{
527 bool enable = false; 528 bool enable = false;
529 unsigned long reserve_pages;
528 530
529 if (!xen_domain()) 531 if (!xen_domain())
530 return -ENODEV; 532 return -ENODEV;
@@ -549,6 +551,26 @@ int xen_selfballoon_init(bool use_selfballooning, bool use_frontswap_selfshrink)
549 if (!enable) 551 if (!enable)
550 return -ENODEV; 552 return -ENODEV;
551 553
554 /*
555 * Give selfballoon_reserved_mb a default value(10% of total ram pages)
556 * to make selfballoon not so aggressive.
557 *
558 * There are mainly two reasons:
559 * 1) The original goal_page didn't consider some pages used by kernel
560 * space, like slab pages and memory used by device drivers.
561 *
562 * 2) The balloon driver may not give back memory to guest OS fast
563 * enough when the workload suddenly aquries a lot of physical memory.
564 *
565 * In both cases, the guest OS will suffer from memory pressure and
566 * OOM killer may be triggered.
567 * By reserving extra 10% of total ram pages, we can keep the system
568 * much more reliably and response faster in some cases.
569 */
570 if (!selfballoon_reserved_mb) {
571 reserve_pages = totalram_pages / 10;
572 selfballoon_reserved_mb = PAGES2MB(reserve_pages);
573 }
552 schedule_delayed_work(&selfballoon_worker, selfballoon_interval * HZ); 574 schedule_delayed_work(&selfballoon_worker, selfballoon_interval * HZ);
553 575
554 return 0; 576 return 0;