The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh7-3.10.0-123.1.2.vz7.5.7 ------> commit 1e6252a0fb0ce20b668cf7c5a6529b05fa7895cf Author: Vladimir Davydov <vdavy...@parallels.com> Date: Thu May 28 20:03:41 2015 +0400
memcg: count oom kills Patchset description: This patch set adds memory.oom_guarantee file to memory cgroup which allows to protect a memory cgroup from OOM killer. It works as follows: OOM killer first selects from processes in cgroups that are above their OOM guarantee, and only if there is no such it switches to scanning processes from all cgroups. This behavior is similar to UB_OOMGUARPAGES. It also adds OOM kills counter to each memory cgroup and synchronizes beancounters' UB_OOMGUARPAGES resource with oom_guarantee/oom_kill_cnt obtained from mem_cgroup. Related to https://jira.sw.ru/browse/PSBM-20089 Vladimir Davydov (3): memcg: add oom_guarantee memcg: count oom kills memcg: sync UB_OOMGUARPAGES This patch description: 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 <vdavy...@parallels.com> --- 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 98bd35f..661e60c 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 1849b48..4dad5bd 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -291,6 +291,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; @@ -1605,6 +1606,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 a6928b4..7201f7c 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)), _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel