Whenever a task is OOM-killed, increment OOM kill counter in the memory cgroup it belongs to and all its ascendants.
Required by UBC API (UB_OOMGUARPAGES.failcnt). Signed-off-by: Vladimir Davydov <[email protected]> --- include/linux/memcontrol.h | 7 +++++++ mm/memcontrol.c | 23 +++++++++++++++++++++++ mm/oom_kill.c | 1 + 3 files changed, 31 insertions(+) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 1bab6f0e2b38..5393f5f3b7d5 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -121,6 +121,8 @@ int mem_cgroup_select_victim_node(struct mem_cgroup *memcg); unsigned long mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list); void mem_cgroup_update_lru_size(struct lruvec *, enum lru_list, int); extern bool mem_cgroup_below_oom_guarantee(struct task_struct *p); +extern void mem_cgroup_note_oom_kill(struct mem_cgroup *memcg, + struct mm_struct *mm); extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p); extern void mem_cgroup_replace_page_cache(struct page *oldpage, @@ -349,6 +351,11 @@ static inline bool mem_cgroup_below_oom_guarantee(struct task_struct *p) } static inline void +mem_cgroup_note_oom_kill(struct mem_cgroup *memcg, struct mm_struct *mm) +{ +} + +static inline void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) { } diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 8e4331340571..70dd91ab37df 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -283,6 +283,7 @@ struct mem_cgroup { unsigned long long swap_max; atomic_long_t mem_failcnt; atomic_long_t swap_failcnt; + atomic_long_t oom_kill_cnt; unsigned long long oom_guarantee; @@ -1597,6 +1598,28 @@ bool mem_cgroup_below_oom_guarantee(struct task_struct *p) return ret; } +void mem_cgroup_note_oom_kill(struct mem_cgroup *root_memcg, + struct mm_struct *mm) +{ + struct mem_cgroup *memcg, *memcg_to_put; + + if (!root_memcg) + root_memcg = root_mem_cgroup; + + memcg_to_put = memcg = try_get_mem_cgroup_from_mm(mm); + if (!memcg || !mem_cgroup_same_or_subtree(root_memcg, memcg)) + memcg = root_memcg; + + for (; memcg; memcg = parent_mem_cgroup(memcg)) { + atomic_long_inc(&memcg->oom_kill_cnt); + if (memcg == root_memcg) + break; + } + + if (memcg_to_put) + css_put(&memcg_to_put->css); +} + #define mem_cgroup_from_res_counter(counter, member) \ container_of(counter, struct mem_cgroup, member) diff --git a/mm/oom_kill.c b/mm/oom_kill.c index a6928b4939cc..7201f7c39e3e 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -488,6 +488,7 @@ void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, /* mm cannot safely be dereferenced after task_unlock(victim) */ mm = victim->mm; + mem_cgroup_note_oom_kill(memcg, mm); pr_err("Killed process %d (%s) total-vm:%lukB, anon-rss:%lukB, file-rss:%lukB\n", task_pid_nr(victim), victim->comm, K(victim->mm->total_vm), K(get_mm_counter(victim->mm, MM_ANONPAGES)), -- 1.7.10.4 _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
