diff options
Diffstat (limited to 'drivers/xen/xen-selfballoon.c')
| -rw-r--r-- | drivers/xen/xen-selfballoon.c | 23 | 
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/xen/xen-selfballoon.c b/drivers/xen/xen-selfballoon.c index 21e18c18c7a..3b2bffde534 100644 --- a/drivers/xen/xen-selfballoon.c +++ b/drivers/xen/xen-selfballoon.c @@ -170,11 +170,13 @@ 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 */  #define MB2PAGES(mb)	((mb) << (20 - PAGE_SHIFT)) +#define PAGES2MB(pages) ((pages) >> (20 - PAGE_SHIFT))  /*   * Use current balloon size, the goal (vm_committed_as), and hysteresis @@ -525,6 +527,7 @@ EXPORT_SYMBOL(register_xen_selfballooning);  int xen_selfballoon_init(bool use_selfballooning, bool use_frontswap_selfshrink)  {  	bool enable = false; +	unsigned long reserve_pages;  	if (!xen_domain())  		return -ENODEV; @@ -549,6 +552,26 @@ int xen_selfballoon_init(bool use_selfballooning, bool use_frontswap_selfshrink)  	if (!enable)  		return -ENODEV; +	/* +	 * Give selfballoon_reserved_mb a default value(10% of total ram pages) +	 * to make selfballoon not so aggressive. +	 * +	 * There are mainly two reasons: +	 * 1) The original goal_page didn't consider some pages used by kernel +	 *    space, like slab pages and memory 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 killer may be triggered. +	 * By reserving extra 10% of total ram pages, we can keep the system +	 * much more reliably and response faster in some cases. +	 */ +	if (!selfballoon_reserved_mb) { +		reserve_pages = totalram_pages / 10; +		selfballoon_reserved_mb = PAGES2MB(reserve_pages); +	}  	schedule_delayed_work(&selfballoon_worker, selfballoon_interval * HZ);  	return 0;  | 
