[Devel] [PATCH RHEL7 COMMIT] ve/memcg: do not ignore oom_guarantee for unlimited cgroups

Konstantin Khorenko khorenko at virtuozzo.com
Fri Mar 18 04:20:04 PDT 2016


The commit is pushed to "branch-rh7-3.10.0-327.10.1.vz7.12.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-327.10.1.vz7.12.3
------>
commit 30723e4b1ec7eddefd0451f90d8f432cbeca7140
Author: Vladimir Davydov <vdavydov at virtuozzo.com>
Date:   Fri Mar 18 15:20:04 2016 +0400

    ve/memcg: do not ignore oom_guarantee for unlimited cgroups
    
    We should take into account memory.oom_guarantee even for unlimited
    cgroups in order to handle system slices and VM cgroups properly. Since
    we have no idea of what VM's limit is actually equal to, let's rework
    the formula behind the worst cgroup selection. Instead of using
    
      (usage - guarantee) / (limit - guarantee)
    
    let's just take
    
      usage / guarantee
    
    This looks reasonable - the more cgroup exceeds its guarantee the sooner
    it will be selected by OOM killer. Note, after this change containers
    w/o guarantee configured will be primary OOM victims, but that looks
    fair enough. Among such containers, the one with the greatest memory
    consumption value will be selected, which is also fine.
    
    https://jira.sw.ru/browse/PSBM-44683
    
    Signed-off-by: Vladimir Davydov <vdavydov at virtuozzo.com>
    Reviewed-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 mm/memcontrol.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 6009ff5..af39f25 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1702,18 +1702,14 @@ struct oom_context *mem_cgroup_oom_context(struct mem_cgroup *memcg)
 
 unsigned long mem_cgroup_overdraft(struct mem_cgroup *memcg)
 {
-	unsigned long long guarantee, limit, usage;
-	unsigned long score;
+	unsigned long long guarantee, usage;
 
-	guarantee = ACCESS_ONCE(memcg->oom_guarantee);
-	limit = res_counter_read_u64(&memcg->memsw, RES_LIMIT);
-	usage = res_counter_read_u64(&memcg->memsw, RES_USAGE);
-
-	if (limit >= RESOURCE_MAX || guarantee >= limit || usage <= guarantee)
+	if (mem_cgroup_is_root(memcg))
 		return 0;
 
-	score = div64_u64(1000 * (usage - guarantee), limit - guarantee);
-	return score > 0 ? score : 1;
+	guarantee = ACCESS_ONCE(memcg->oom_guarantee);
+	usage = res_counter_read_u64(&memcg->memsw, RES_USAGE);
+	return div64_u64(1000 * usage, guarantee + 1);
 }
 
 unsigned long mem_cgroup_total_pages(struct mem_cgroup *memcg, bool swap)


More information about the Devel mailing list