Instead of getting physpages, swappages, and kmemsize stats from memcg
in the arguments of mem_cgroup_fill_ub_parms, make the latter update the
corresponding user_beancounter->ub_parms directly, which greatly
simplifies the code and makes it easier to move more resource types to
memcg side (think of oomguarpages).

Signed-off-by: Vladimir Davydov <[email protected]>
---
 include/bc/beancounter.h |    5 +----
 kernel/bc/beancounter.c  |   26 +++++++++-----------------
 kernel/bc/proc.c         |   23 ++++-------------------
 kernel/bc/vm_pages.c     |   22 ++++++++++------------
 mm/memcontrol.c          |   20 ++++++++++++--------
 5 files changed, 36 insertions(+), 60 deletions(-)

diff --git a/include/bc/beancounter.h b/include/bc/beancounter.h
index 202a5f537cda..e0ef5ec195fa 100644
--- a/include/bc/beancounter.h
+++ b/include/bc/beancounter.h
@@ -319,10 +319,7 @@ extern void uncharge_warn(struct user_beancounter *ub, 
const char *resource,
 
 extern int ub_update_mem_cgroup_limits(struct user_beancounter *ub);
 
-extern void ub_get_mem_cgroup_parms(struct user_beancounter *ub,
-                                   struct ubparm *physpages,
-                                   struct ubparm *swappages,
-                                   struct ubparm *kmemsize);
+extern void ub_sync_memcg(struct user_beancounter *ub);
 extern void ub_page_stat(struct user_beancounter *ub,
                         const nodemask_t *nodemask,
                         unsigned long *pages);
diff --git a/kernel/bc/beancounter.c b/kernel/bc/beancounter.c
index 3b5a20f5a4c8..d94fb32cd22c 100644
--- a/kernel/bc/beancounter.c
+++ b/kernel/bc/beancounter.c
@@ -202,31 +202,18 @@ int ub_update_mem_cgroup_limits(struct user_beancounter 
*ub)
        return ret;
 }
 
-extern void mem_cgroup_fill_ub_parms(struct cgroup *cg,
-               struct ubparm *p, struct ubparm *s, struct ubparm *k);
+extern void mem_cgroup_sync_beancounter(struct cgroup *cg,
+                                       struct user_beancounter *ub);
 
-void ub_get_mem_cgroup_parms(struct user_beancounter *ub,
-                            struct ubparm *physpages,
-                            struct ubparm *swappages,
-                            struct ubparm *kmemsize)
+void ub_sync_memcg(struct user_beancounter *ub)
 {
        struct cgroup *cg;
-       struct ubparm parms[3];
-
-       memset(parms, 0, sizeof(parms));
 
        cg = ub_cgroup_open(mem_cgroup_root, ub);
        if (!IS_ERR_OR_NULL(cg)) {
-               mem_cgroup_fill_ub_parms(cg, &parms[0], &parms[1], &parms[2]);
+               mem_cgroup_sync_beancounter(cg, ub);
                ub_cgroup_close(mem_cgroup_root, cg);
        }
-
-       if (physpages)
-               *physpages = parms[0];
-       if (swappages)
-               *swappages = parms[1];
-       if (kmemsize)
-               *kmemsize = parms[2];
 }
 
 extern void mem_cgroup_get_nr_pages(struct cgroup *cg, int nid,
@@ -445,6 +432,11 @@ static inline int bc_verify_held(struct user_beancounter 
*ub)
        ub_stat_mod(ub, writeback_pages, __ub_percpu_sum(ub, writeback_pages));
        uncharge_beancounter_precharge(ub);
 
+       /* accounted by memcg */
+       ub->ub_parms[UB_KMEMSIZE].held = 0;
+       ub->ub_parms[UB_PHYSPAGES].held = 0;
+       ub->ub_parms[UB_SWAPPAGES].held = 0;
+
        clean = 1;
        for (i = 0; i < UB_RESOURCES; i++)
                clean &= verify_res(ub, ub_rnames[i], ub->ub_parms[i].held);
diff --git a/kernel/bc/proc.c b/kernel/bc/proc.c
index 46ea074c182a..02b5cfb0c306 100644
--- a/kernel/bc/proc.c
+++ b/kernel/bc/proc.c
@@ -45,27 +45,10 @@ static const char *res_fmt = "%10s%c %-12s %20lu %20lu 
%20lu %20lu %20lu\n";
 static void ub_show_res(struct seq_file *f, struct user_beancounter *ub,
                int r, int precharge, int show_uid)
 {
+       struct ubparm *p;
        unsigned long held;
-       struct ubparm *p, v;
-       bool precharge_valid = false;
-
-       p = &v;
-       switch (r) {
-       case UB_PHYSPAGES:
-               ub_get_mem_cgroup_parms(ub, p, NULL, NULL);
-               break;
-       case UB_SWAPPAGES:
-               ub_get_mem_cgroup_parms(ub, NULL, p, NULL);
-               break;
-       case UB_KMEMSIZE:
-               ub_get_mem_cgroup_parms(ub, NULL, NULL, p);
-               break;
-       default:
-               p = &ub->ub_parms[r];
-               precharge_valid = true;
-               break;
-       }
 
+       p = &ub->ub_parms[r];
        held = p->held;
        held = (held > precharge) ? (held - precharge) : 0;
 
@@ -85,6 +68,7 @@ static void __show_resources(struct seq_file *f, struct 
user_beancounter *ub,
 {
        int i, precharge[UB_RESOURCES];
 
+       ub_sync_memcg(ub);
        ub_precharge_snapshot(ub, precharge);
 
        for (i = 0; i < UB_RESOURCES_COMPAT; i++)
@@ -300,6 +284,7 @@ static int ub_show(struct seq_file *f, void *v)
        int i, precharge[UB_RESOURCES];
        struct user_beancounter *ub = v;
 
+       ub_sync_memcg(ub);
        ub_precharge_snapshot(ub, precharge);
 
        for (i = 0; i < UB_RESOURCES_COMPAT; i++)
diff --git a/kernel/bc/vm_pages.c b/kernel/bc/vm_pages.c
index b1eedd29e17f..e0e3c4550ceb 100644
--- a/kernel/bc/vm_pages.c
+++ b/kernel/bc/vm_pages.c
@@ -140,7 +140,6 @@ static int bc_fill_sysinfo(struct user_beancounter *ub,
 {
        unsigned long used, total;
        unsigned long totalram, totalswap;
-       struct ubparm physpages, swappages;
 
        /* No virtualization */
        if (meminfo_val == VE_MEMINFO_SYSTEM)
@@ -151,10 +150,10 @@ static int bc_fill_sysinfo(struct user_beancounter *ub,
 
        memset(si, 0, sizeof(*si));
 
-       ub_get_mem_cgroup_parms(ub, &physpages, &swappages, NULL);
+       ub_sync_memcg(ub);
 
-       total = physpages.limit;
-       used = physpages.held;
+       total = ub->ub_parms[UB_PHYSPAGES].limit;
+       used = ub->ub_parms[UB_PHYSPAGES].held;
 
        if (total == UB_MAXVALUE)
                total = totalram;
@@ -162,8 +161,8 @@ static int bc_fill_sysinfo(struct user_beancounter *ub,
        si->totalram = total;
        si->freeram = (total > used ? total - used : 0);
 
-       total = swappages.limit;
-       used = swappages.held;
+       total = ub->ub_parms[UB_SWAPPAGES].limit;
+       used = ub->ub_parms[UB_SWAPPAGES].held;
 
        if (total == UB_MAXVALUE)
                total = totalswap;
@@ -181,13 +180,12 @@ static int bc_fill_meminfo(struct user_beancounter *ub,
 {
        int cpu, ret;
        long dcache;
-       struct ubparm kmemsize;
 
        ret = bc_fill_sysinfo(ub, meminfo_val, mi->si);
        if (ret & NOTIFY_STOP_MASK)
                goto out;
 
-       ub_get_mem_cgroup_parms(ub, NULL, NULL, &kmemsize);
+       ub_sync_memcg(ub);
        ub_page_stat(ub, &node_online_map, mi->pages);
 
        mi->cached = min(mi->si->totalram - mi->si->freeram,
@@ -212,7 +210,8 @@ static int bc_fill_meminfo(struct user_beancounter *ub,
 
        mi->slab_reclaimable = DIV_ROUND_UP(max(0L, dcache), PAGE_SIZE);
        mi->slab_unreclaimable =
-               DIV_ROUND_UP(max(0L, (long)kmemsize.held - dcache), PAGE_SIZE);
+               DIV_ROUND_UP(max(0L, (long)ub->ub_parms[UB_KMEMSIZE].held -
+                                                       dcache), PAGE_SIZE);
 out:
        return ret;
 }
@@ -276,12 +275,11 @@ static int bc_vmaux_show(struct seq_file *f, void *v)
        struct user_beancounter *ub;
        struct ub_percpu_struct *ub_pcpu;
        unsigned long swapin, swapout, vswapin, vswapout;
-       struct ubparm physpages;
        int i;
 
        ub = seq_beancounter(f);
 
-       ub_get_mem_cgroup_parms(ub, &physpages, NULL, NULL);
+       ub_sync_memcg(ub);
 
        swapin = swapout = vswapin = vswapout = 0;
        for_each_possible_cpu(i) {
@@ -301,7 +299,7 @@ static int bc_vmaux_show(struct seq_file *f, void *v)
        seq_printf(f, bc_proc_lu_fmt, "vswapin", vswapin);
        seq_printf(f, bc_proc_lu_fmt, "vswapout", vswapout);
 
-       seq_printf(f, bc_proc_lu_fmt, "ram", physpages.held);
+       seq_printf(f, bc_proc_lu_fmt, "ram", ub->ub_parms[UB_PHYSPAGES].held);
 
        return 0;
 }
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 01a8e5a5cfd5..75add1495418 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -5152,11 +5152,15 @@ static int mem_cgroup_move_charge_write(struct cgroup 
*cgrp,
 
 #include <bc/beancounter.h>
 
-void mem_cgroup_fill_ub_parms(struct cgroup *cg,
-               struct ubparm *p, struct ubparm *s, struct ubparm *k)
+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;
+       unsigned long long lim, held, maxheld;
+       volatile struct ubparm *k, *p, *s;
+
+       k = &ub->ub_parms[UB_KMEMSIZE];
+       p = &ub->ub_parms[UB_PHYSPAGES];
+       s = &ub->ub_parms[UB_SWAPPAGES];
 
        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;
@@ -5174,9 +5178,9 @@ void mem_cgroup_fill_ub_parms(struct cgroup *cg,
                min_t(unsigned long long, lim, UB_MAXVALUE);
        k->barrier = k->limit = lim;
 
-       s->held = res_counter_read_u64(&memcg->memsw, RES_USAGE) >> PAGE_SHIFT;
-       s->held -= p->held;
-       s->maxheld = memcg->swap_max >> PAGE_SHIFT;
+       held = (res_counter_read_u64(&memcg->memsw, RES_USAGE) -
+               res_counter_read_u64(&memcg->res, RES_USAGE)) >> PAGE_SHIFT;
+       maxheld = memcg->swap_max >> PAGE_SHIFT;
        s->failcnt = atomic_long_read(&memcg->swap_failcnt);
        lim = res_counter_read_u64(&memcg->memsw, RES_LIMIT);
        lim = lim == RESOURCE_MAX ? UB_MAXVALUE :
@@ -5187,8 +5191,8 @@ void mem_cgroup_fill_ub_parms(struct cgroup *cg,
 
        /* Due to global reclaim, memory.memsw.usage can be greater than
         * (memory.memsw.limit - memory.limit). */
-       s->held = min(s->held, s->limit);
-       s->maxheld = min(s->maxheld, s->limit);
+       s->held = min(held, lim);
+       s->maxheld = min(maxheld, lim);
 }
 
 int mem_cgroup_apply_beancounter(struct cgroup *cg, struct user_beancounter 
*ub)
-- 
1.7.10.4

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

Reply via email to