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);
