Helper to get memory or mem+swap usage of the cgroup.

Signed-off-by: Kirill A. Shutemov <[email protected]>
Acked-by: Balbir Singh <[email protected]>
Acked-by: KAMEZAWA Hiroyuki <[email protected]>
---
 mm/memcontrol.c |   54 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 488b644..1d71cb4 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -2722,40 +2722,50 @@ mem_cgroup_get_recursive_idx_stat(struct mem_cgroup 
*mem,
        *val = d.val;
 }
 
+static inline u64 mem_cgroup_usage(struct mem_cgroup *mem, bool swap)
+{
+       u64 idx_val, val;
+
+       if (!mem_cgroup_is_root(mem)) {
+               if (!swap)
+                       return res_counter_read_u64(&mem->res, RES_USAGE);
+               else
+                       return res_counter_read_u64(&mem->memsw, RES_USAGE);
+       }
+
+       mem_cgroup_get_recursive_idx_stat(mem, MEM_CGROUP_STAT_CACHE, &idx_val);
+       val = idx_val;
+       mem_cgroup_get_recursive_idx_stat(mem, MEM_CGROUP_STAT_RSS, &idx_val);
+       val += idx_val;
+
+       if (swap) {
+               mem_cgroup_get_recursive_idx_stat(mem,
+                               MEM_CGROUP_STAT_SWAPOUT, &idx_val);
+               val += idx_val;
+       }
+
+       return val << PAGE_SHIFT;
+}
+
 static u64 mem_cgroup_read(struct cgroup *cont, struct cftype *cft)
 {
        struct mem_cgroup *mem = mem_cgroup_from_cont(cont);
-       u64 idx_val, val;
+       u64 val;
        int type, name;
 
        type = MEMFILE_TYPE(cft->private);
        name = MEMFILE_ATTR(cft->private);
        switch (type) {
        case _MEM:
-               if (name == RES_USAGE && mem_cgroup_is_root(mem)) {
-                       mem_cgroup_get_recursive_idx_stat(mem,
-                               MEM_CGROUP_STAT_CACHE, &idx_val);
-                       val = idx_val;
-                       mem_cgroup_get_recursive_idx_stat(mem,
-                               MEM_CGROUP_STAT_RSS, &idx_val);
-                       val += idx_val;
-                       val <<= PAGE_SHIFT;
-               } else
+               if (name == RES_USAGE)
+                       val = mem_cgroup_usage(mem, false);
+               else
                        val = res_counter_read_u64(&mem->res, name);
                break;
        case _MEMSWAP:
-               if (name == RES_USAGE && mem_cgroup_is_root(mem)) {
-                       mem_cgroup_get_recursive_idx_stat(mem,
-                               MEM_CGROUP_STAT_CACHE, &idx_val);
-                       val = idx_val;
-                       mem_cgroup_get_recursive_idx_stat(mem,
-                               MEM_CGROUP_STAT_RSS, &idx_val);
-                       val += idx_val;
-                       mem_cgroup_get_recursive_idx_stat(mem,
-                               MEM_CGROUP_STAT_SWAPOUT, &idx_val);
-                       val += idx_val;
-                       val <<= PAGE_SHIFT;
-               } else
+               if (name == RES_USAGE)
+                       val = mem_cgroup_usage(mem, true);
+               else
                        val = res_counter_read_u64(&mem->memsw, name);
                break;
        default:
-- 
1.6.5.7

_______________________________________________
Containers mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/containers

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

Reply via email to