From 468c17180d01b83f5b2758152347f25bbd6d84d4 Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Thu, 15 Nov 2012 14:34:42 -0800 Subject: [PATCH] --- yaml --- r: 336969 b: refs/heads/master c: 997071bcb34005f42e0fe5bc7930e895b070f251 h: refs/heads/master i: 336967: fd0ee5b9a59255bde003830f8124cc3a59536735 v: v3 --- [refs] | 2 +- trunk/drivers/xen/xen-selfballoon.c | 2 +- trunk/include/linux/mman.h | 2 ++ trunk/mm/mmap.c | 14 ++++++++++++++ trunk/mm/nommu.c | 15 +++++++++++++++ 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index f62c0a0faf32..ed560aa256b3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d892de8d3fb1e807de561289cfb1fed42950440a +refs/heads/master: 997071bcb34005f42e0fe5bc7930e895b070f251 diff --git a/trunk/drivers/xen/xen-selfballoon.c b/trunk/drivers/xen/xen-selfballoon.c index 7d041cb6da26..2552d3e0a70f 100644 --- a/trunk/drivers/xen/xen-selfballoon.c +++ b/trunk/drivers/xen/xen-selfballoon.c @@ -222,7 +222,7 @@ static void selfballoon_process(struct work_struct *work) if (xen_selfballooning_enabled) { cur_pages = totalram_pages; tgt_pages = cur_pages; /* default is no change */ - goal_pages = percpu_counter_read_positive(&vm_committed_as) + + goal_pages = vm_memory_committed() + totalreserve_pages + MB2PAGES(selfballoon_reserved_mb); #ifdef CONFIG_FRONTSWAP diff --git a/trunk/include/linux/mman.h b/trunk/include/linux/mman.h index d09dde1e57fb..9aa863da287f 100644 --- a/trunk/include/linux/mman.h +++ b/trunk/include/linux/mman.h @@ -11,6 +11,8 @@ extern int sysctl_overcommit_memory; extern int sysctl_overcommit_ratio; extern struct percpu_counter vm_committed_as; +unsigned long vm_memory_committed(void); + static inline void vm_acct_memory(long pages) { percpu_counter_add(&vm_committed_as, pages); diff --git a/trunk/mm/mmap.c b/trunk/mm/mmap.c index 2d942353d681..b064822be82e 100644 --- a/trunk/mm/mmap.c +++ b/trunk/mm/mmap.c @@ -88,6 +88,20 @@ int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT; */ struct percpu_counter vm_committed_as ____cacheline_aligned_in_smp; +/* + * The global memory commitment made in the system can be a metric + * that can be used to drive ballooning decisions when Linux is hosted + * as a guest. On Hyper-V, the host implements a policy engine for dynamically + * balancing memory across competing virtual machines that are hosted. + * Several metrics drive this policy engine including the guest reported + * memory commitment. + */ +unsigned long vm_memory_committed(void) +{ + return percpu_counter_read_positive(&vm_committed_as); +} +EXPORT_SYMBOL_GPL(vm_memory_committed); + /* * Check that a process has enough memory to allocate a new virtual * mapping. 0 means there is enough memory for the allocation to diff --git a/trunk/mm/nommu.c b/trunk/mm/nommu.c index 45131b41bcdb..79c3cac87afa 100644 --- a/trunk/mm/nommu.c +++ b/trunk/mm/nommu.c @@ -66,6 +66,21 @@ int heap_stack_gap = 0; atomic_long_t mmap_pages_allocated; +/* + * The global memory commitment made in the system can be a metric + * that can be used to drive ballooning decisions when Linux is hosted + * as a guest. On Hyper-V, the host implements a policy engine for dynamically + * balancing memory across competing virtual machines that are hosted. + * Several metrics drive this policy engine including the guest reported + * memory commitment. + */ +unsigned long vm_memory_committed(void) +{ + return percpu_counter_read_positive(&vm_committed_as); +} + +EXPORT_SYMBOL_GPL(vm_memory_committed); + EXPORT_SYMBOL(mem_map); EXPORT_SYMBOL(num_physpages);