diff -NurpP --minimal linux-2.6.32.6-vs2.3.0.36.28/include/linux/memcontrol.h linux-2.6.32.6-vs2.3.0.36.28.2/include/linux/memcontrol.h --- linux-2.6.32.6-vs2.3.0.36.28/include/linux/memcontrol.h 2009-12-03 20:02:55.000000000 +0100 +++ linux-2.6.32.6-vs2.3.0.36.28.2/include/linux/memcontrol.h 2010-01-27 21:44:15.000000000 +0100 @@ -69,6 +69,8 @@ extern void mem_cgroup_out_of_memory(str int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); +extern u64 mem_cgroup_res_read_u64(struct mem_cgroup *mem, int member); +extern u64 mem_cgroup_memsw_read_u64(struct mem_cgroup *mem, int member); static inline int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *cgroup) diff -NurpP --minimal linux-2.6.32.6-vs2.3.0.36.28/kernel/vserver/limit.c linux-2.6.32.6-vs2.3.0.36.28.2/kernel/vserver/limit.c --- linux-2.6.32.6-vs2.3.0.36.28/kernel/vserver/limit.c 2009-12-03 20:04:56.000000000 +0100 +++ linux-2.6.32.6-vs2.3.0.36.28.2/kernel/vserver/limit.c 2010-01-27 23:14:29.000000000 +0100 @@ -12,6 +12,8 @@ #include #include +#include +#include #include #include #include @@ -264,6 +266,7 @@ int vc_rlimit_stat(struct vx_info *vxi, void vx_vsi_meminfo(struct sysinfo *val) { +#if 0 struct vx_info *vxi = current_vx_info(); unsigned long totalram, freeram; rlim_t v; @@ -278,6 +281,20 @@ void vx_vsi_meminfo(struct sysinfo *val) val->totalram = totalram; val->freeram = freeram; +#else + struct mem_cgroup *mcg = mem_cgroup_from_task(current); + u64 res_limit, res_usage; + + if (!mcg) + return; + + res_limit = mem_cgroup_res_read_u64(mcg, RES_LIMIT); + res_usage = mem_cgroup_res_read_u64(mcg, RES_USAGE); + + if (res_limit != RESOURCE_MAX) + val->totalram = (res_limit >> 10); + val->freeram = val->totalram - (res_usage >> 10); +#endif val->bufferram = 0; val->totalhigh = 0; val->freehigh = 0; @@ -286,6 +303,7 @@ void vx_vsi_meminfo(struct sysinfo *val) void vx_vsi_swapinfo(struct sysinfo *val) { +#if 0 struct vx_info *vxi = current_vx_info(); unsigned long totalswap, freeswap; rlim_t v, w; @@ -309,6 +327,24 @@ void vx_vsi_swapinfo(struct sysinfo *val val->totalswap = totalswap; val->freeswap = freeswap; +#else + struct mem_cgroup *mcg = mem_cgroup_from_task(current); + u64 res_limit, res_usage, memsw_limit, memsw_usage; + + if (!mcg) + return; + + res_limit = mem_cgroup_res_read_u64(mcg, RES_LIMIT); + res_usage = mem_cgroup_res_read_u64(mcg, RES_USAGE); + memsw_limit = mem_cgroup_memsw_read_u64(mcg, RES_LIMIT); + memsw_usage = mem_cgroup_memsw_read_u64(mcg, RES_USAGE); + + if (res_limit == RESOURCE_MAX) + return; + if (memsw_limit != RESOURCE_MAX) + val->totalswap = (memsw_limit - res_limit) >> 10; + val->freeswap = val->totalswap - ((memsw_usage - res_usage) >> 10); +#endif return; } diff -NurpP --minimal linux-2.6.32.6-vs2.3.0.36.28/mm/memcontrol.c linux-2.6.32.6-vs2.3.0.36.28.2/mm/memcontrol.c --- linux-2.6.32.6-vs2.3.0.36.28/mm/memcontrol.c 2010-01-26 20:35:35.000000000 +0100 +++ linux-2.6.32.6-vs2.3.0.36.28.2/mm/memcontrol.c 2010-01-27 21:43:58.000000000 +0100 @@ -549,6 +549,16 @@ struct mem_cgroup *mem_cgroup_from_task( struct mem_cgroup, css); } +u64 mem_cgroup_res_read_u64(struct mem_cgroup *mem, int member) +{ + return res_counter_read_u64(&mem->res, member); +} + +u64 mem_cgroup_memsw_read_u64(struct mem_cgroup *mem, int member) +{ + return res_counter_read_u64(&mem->memsw, member); +} + static struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm) { struct mem_cgroup *mem = NULL;