|
@@ -2857,40 +2857,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:
|