UB_OOMGUARPAGES.held = memory.memsw.usage_in_bytes
UB_OOMGUARPAGES.maxheld = memory.memsw.max_usage_in_bytes
UB_OOMGUARPAGES.barrier = limit = memory.oom_guarantee
UB_OOMGUARPAGES.failcnt = mem_cgroup->oom_kill_cnt

Signed-off-by: Vladimir Davydov <[email protected]>
---
 mm/memcontrol.c |   21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 70dd91ab37df..6ef83fbd1a58 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -5267,11 +5267,12 @@ void mem_cgroup_sync_beancounter(struct cgroup *cg, 
struct user_beancounter *ub)
 {
        struct mem_cgroup *memcg = mem_cgroup_from_cont(cg);
        unsigned long long lim, held, maxheld;
-       volatile struct ubparm *k, *p, *s;
+       volatile struct ubparm *k, *p, *s, *o;
 
        k = &ub->ub_parms[UB_KMEMSIZE];
        p = &ub->ub_parms[UB_PHYSPAGES];
        s = &ub->ub_parms[UB_SWAPPAGES];
+       o = &ub->ub_parms[UB_OOMGUARPAGES];
 
        p->held = res_counter_read_u64(&memcg->res, RES_USAGE) >> PAGE_SHIFT;
        p->maxheld = res_counter_read_u64(&memcg->res, RES_MAX_USAGE) >> 
PAGE_SHIFT;
@@ -5304,12 +5305,20 @@ void mem_cgroup_sync_beancounter(struct cgroup *cg, 
struct user_beancounter *ub)
         * (memory.memsw.limit - memory.limit). */
        s->held = min(held, lim);
        s->maxheld = min(maxheld, lim);
+
+       o->held = res_counter_read_u64(&memcg->memsw, RES_USAGE) >> PAGE_SHIFT;
+       o->maxheld = res_counter_read_u64(&memcg->memsw, RES_MAX_USAGE) >> 
PAGE_SHIFT;
+       o->failcnt = atomic_long_read(&memcg->oom_kill_cnt);
+       lim = memcg->oom_guarantee;
+       lim = lim == RESOURCE_MAX ? UB_MAXVALUE :
+               min_t(unsigned long long, lim >> PAGE_SHIFT, UB_MAXVALUE);
+       o->barrier = o->limit = lim;
 }
 
 int mem_cgroup_apply_beancounter(struct cgroup *cg, struct user_beancounter 
*ub)
 {
        struct mem_cgroup *memcg = mem_cgroup_from_cont(cg);
-       unsigned long long mem, memsw, mem_old, memsw_old;
+       unsigned long long mem, memsw, mem_old, memsw_old, oomguar;
        int ret = 0;
 
        mem = ub->ub_parms[UB_PHYSPAGES].limit;
@@ -5328,6 +5337,12 @@ int mem_cgroup_apply_beancounter(struct cgroup *cg, 
struct user_beancounter *ub)
        else
                memsw = RESOURCE_MAX;
 
+       oomguar = ub->ub_parms[UB_OOMGUARPAGES].barrier;
+       if (oomguar < RESOURCE_MAX >> PAGE_SHIFT)
+               oomguar <<= PAGE_SHIFT;
+       else
+               oomguar = RESOURCE_MAX;
+
        if (ub->ub_parms[UB_KMEMSIZE].limit != UB_MAXVALUE)
                pr_warn_once("ub: kmemsize limit is deprecated\n");
 
@@ -5367,6 +5382,8 @@ int mem_cgroup_apply_beancounter(struct cgroup *cg, 
struct user_beancounter *ub)
                if (ret)
                        goto out;
        }
+
+       memcg->oom_guarantee = oomguar;
 out:
        return ret;
 }
-- 
1.7.10.4

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to