diff -NurpP --minimal linux-3.5.2-vs2.3.4.1/include/linux/memcontrol.h linux-3.5.2-vs2.3.4.1.1/include/linux/memcontrol.h --- linux-3.5.2-vs2.3.4.1/include/linux/memcontrol.h 2012-07-23 01:45:55.000000000 +0200 +++ linux-3.5.2-vs2.3.4.1.1/include/linux/memcontrol.h 2012-08-19 20:04:29.000000000 +0200 @@ -130,6 +130,8 @@ extern void mem_cgroup_print_oom_info(st struct task_struct *p); extern void mem_cgroup_replace_page_cache(struct page *oldpage, struct page *newpage); +extern void mem_cgroup_oom_cnt(struct mem_cgroup *memcg); +extern void mem_cgroup_oom_kill(struct mem_cgroup *memcg); #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP extern int do_swap_account; @@ -355,6 +357,16 @@ static inline void mem_cgroup_end_update { } +static inline void +mem_cgroup_oom_cnt(struct mem_cgroup *memcg) +{ +} + +static inline void +mem_cgroup_oom_kill(struct mem_cgroup *memcg) +{ +} + static inline void mem_cgroup_inc_page_stat(struct page *page, enum mem_cgroup_page_stat_item idx) { diff -NurpP --minimal linux-3.5.2-vs2.3.4.1/mm/memcontrol.c linux-3.5.2-vs2.3.4.1.1/mm/memcontrol.c --- linux-3.5.2-vs2.3.4.1/mm/memcontrol.c 2012-07-23 01:45:55.000000000 +0200 +++ linux-3.5.2-vs2.3.4.1.1/mm/memcontrol.c 2012-08-19 20:07:11.000000000 +0200 @@ -289,6 +289,10 @@ struct mem_cgroup { /* OOM-Killer disable */ int oom_kill_disable; + /* number of OOM kill events */ + unsigned long long oom_cnt; + unsigned long long oom_kill; + /* set when res.limit == memsw.limit */ bool memsw_is_minimum; @@ -4579,6 +4583,52 @@ static void kmem_cgroup_destroy(struct m } #endif +void mem_cgroup_oom_cnt(struct mem_cgroup *memcg) +{ + memcg->oom_cnt++; +} + +static u64 mem_cgroup_oom_cnt_read(struct cgroup *cont, struct cftype *cft) +{ + struct mem_cgroup *mem = mem_cgroup_from_cont(cont); + u64 val; + + val = mem->oom_cnt; + return val; +} + +static int mem_cgroup_oom_cnt_reset(struct cgroup *cont, unsigned int event) +{ + struct mem_cgroup *mem; + + mem = mem_cgroup_from_cont(cont); + mem->oom_cnt = 0; + return 0; +} + +void mem_cgroup_oom_kill(struct mem_cgroup *memcg) +{ + memcg->oom_kill++; +} + +static u64 mem_cgroup_oom_kill_read(struct cgroup *cont, struct cftype *cft) +{ + struct mem_cgroup *mem = mem_cgroup_from_cont(cont); + u64 val; + + val = mem->oom_kill; + return val; +} + +static int mem_cgroup_oom_kill_reset(struct cgroup *cont, unsigned int event) +{ + struct mem_cgroup *mem; + + mem = mem_cgroup_from_cont(cont); + mem->oom_kill = 0; + return 0; +} + static struct cftype mem_cgroup_files[] = { { .name = "usage_in_bytes", @@ -4642,6 +4692,16 @@ static struct cftype mem_cgroup_files[] .unregister_event = mem_cgroup_oom_unregister_event, .private = MEMFILE_PRIVATE(_OOM_TYPE, OOM_CONTROL), }, + { + .name = "oom_cnt", + .read_u64 = mem_cgroup_oom_cnt_read, + .trigger = mem_cgroup_oom_cnt_reset, + }, + { + .name = "oom_kill", + .read_u64 = mem_cgroup_oom_kill_read, + .trigger = mem_cgroup_oom_kill_reset, + }, #ifdef CONFIG_NUMA { .name = "numa_stat", @@ -4915,6 +4975,7 @@ mem_cgroup_create(struct cgroup *cont) parent = mem_cgroup_from_cont(cont->parent); memcg->use_hierarchy = parent->use_hierarchy; memcg->oom_kill_disable = parent->oom_kill_disable; + memcg->oom_cnt = 0; } if (parent && parent->use_hierarchy) { diff -NurpP --minimal linux-3.5.2-vs2.3.4.1/mm/oom_kill.c linux-3.5.2-vs2.3.4.1.1/mm/oom_kill.c --- linux-3.5.2-vs2.3.4.1/mm/oom_kill.c 2012-07-23 01:45:55.000000000 +0200 +++ linux-3.5.2-vs2.3.4.1.1/mm/oom_kill.c 2012-08-19 20:12:44.000000000 +0200 @@ -567,6 +567,9 @@ void mem_cgroup_out_of_memory(struct mem return; } + /* increment oom stats */ + mem_cgroup_oom_cnt(memcg); + check_panic_on_oom(CONSTRAINT_MEMCG, gfp_mask, order, NULL); limit = mem_cgroup_get_limit(memcg) >> PAGE_SHIFT ? : 1; read_lock(&tasklist_lock);