]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mm, oom: add oom victim's memcg to the oom context information
authoryuzhoujian <yuzhoujian@didichuxing.com>
Fri, 28 Dec 2018 08:36:10 +0000 (00:36 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 28 Dec 2018 20:11:48 +0000 (12:11 -0800)
The current oom report doesn't display victim's memcg context during the
global OOM situation.  While this information is not strictly needed, it
can be really helpful for containerized environments to locate which
container has lost a process.  Now that we have a single line for the oom
context, we can trivially add both the oom memcg (this can be either
global_oom or a specific memcg which hits its hard limits) and task_memcg
which is the victim's memcg.

Below is the single line output in the oom report after this patch.

- global oom context information:

oom-kill:constraint=<constraint>,nodemask=<nodemask>,cpuset=<cpuset>,mems_allowed=<mems_allowed>,global_oom,task_memcg=<memcg>,task=<comm>,pid=<pid>,uid=<uid>

- memcg oom context information:

oom-kill:constraint=<constraint>,nodemask=<nodemask>,cpuset=<cpuset>,mems_allowed=<mems_allowed>,oom_memcg=<memcg>,task_memcg=<memcg>,task=<comm>,pid=<pid>,uid=<uid>

[penguin-kernel@I-love.SAKURA.ne.jp: use pr_cont() in mem_cgroup_print_oom_context()]
Link: http://lkml.kernel.org/r/201812190723.wBJ7NdkN032628@www262.sakura.ne.jp
Link: http://lkml.kernel.org/r/1542799799-36184-2-git-send-email-ufo19890607@gmail.com
Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com>
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: David Rientjes <rientjes@google.com>
Cc: "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Cc: Roman Gushchin <guro@fb.com>
Cc: Yang Shi <yang.s@alibaba-inc.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/memcontrol.h
mm/memcontrol.c
mm/oom_kill.c

index 7ab2120155a43d05c9cdfae28cb3d498798595d7..83ae11cbd12c6d0dea58af06f7b71560eec57278 100644 (file)
@@ -526,9 +526,11 @@ void mem_cgroup_handle_over_high(void);
 
 unsigned long mem_cgroup_get_max(struct mem_cgroup *memcg);
 
-void mem_cgroup_print_oom_info(struct mem_cgroup *memcg,
+void mem_cgroup_print_oom_context(struct mem_cgroup *memcg,
                                struct task_struct *p);
 
+void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg);
+
 static inline void mem_cgroup_enter_user_fault(void)
 {
        WARN_ON(current->in_user_fault);
@@ -970,7 +972,12 @@ static inline unsigned long mem_cgroup_get_max(struct mem_cgroup *memcg)
 }
 
 static inline void
-mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
+mem_cgroup_print_oom_context(struct mem_cgroup *memcg, struct task_struct *p)
+{
+}
+
+static inline void
+mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg)
 {
 }
 
index 6e1469b80cb7d57d3cdf01ef9c917a21ece0b7fa..4afd5971f2d420f1c5b3099637dd4006bf193206 100644 (file)
@@ -1293,32 +1293,39 @@ static const char *const memcg1_stat_names[] = {
 
 #define K(x) ((x) << (PAGE_SHIFT-10))
 /**
- * mem_cgroup_print_oom_info: Print OOM information relevant to memory controller.
+ * mem_cgroup_print_oom_context: Print OOM information relevant to
+ * memory controller.
  * @memcg: The memory cgroup that went over limit
  * @p: Task that is going to be killed
  *
  * NOTE: @memcg and @p's mem_cgroup can be different when hierarchy is
  * enabled
  */
-void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
+void mem_cgroup_print_oom_context(struct mem_cgroup *memcg, struct task_struct *p)
 {
-       struct mem_cgroup *iter;
-       unsigned int i;
-
        rcu_read_lock();
 
+       if (memcg) {
+               pr_cont(",oom_memcg=");
+               pr_cont_cgroup_path(memcg->css.cgroup);
+       } else
+               pr_cont(",global_oom");
        if (p) {
-               pr_info("Task in ");
+               pr_cont(",task_memcg=");
                pr_cont_cgroup_path(task_cgroup(p, memory_cgrp_id));
-               pr_cont(" killed as a result of limit of ");
-       } else {
-               pr_info("Memory limit reached of cgroup ");
        }
-
-       pr_cont_cgroup_path(memcg->css.cgroup);
-       pr_cont("\n");
-
        rcu_read_unlock();
+}
+
+/**
+ * mem_cgroup_print_oom_meminfo: Print OOM memory information relevant to
+ * memory controller.
+ * @memcg: The memory cgroup that went over limit
+ */
+void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg)
+{
+       struct mem_cgroup *iter;
+       unsigned int i;
 
        pr_info("memory: usage %llukB, limit %llukB, failcnt %lu\n",
                K((u64)page_counter_read(&memcg->memory)),
index d90253f1ff93c14a6349a21daf5759d78a664ad6..5442cb12e4ed29fc5af17c7a084abdfd5b2e54b9 100644 (file)
@@ -435,6 +435,7 @@ static void dump_oom_summary(struct oom_control *oc, struct task_struct *victim)
                        oom_constraint_text[oc->constraint],
                        nodemask_pr_args(oc->nodemask));
        cpuset_print_current_mems_allowed();
+       mem_cgroup_print_oom_context(oc->memcg, victim);
        pr_cont(",task=%s,pid=%d,uid=%d\n", victim->comm, victim->pid,
                from_kuid(&init_user_ns, task_uid(victim)));
 }
@@ -449,7 +450,7 @@ static void dump_header(struct oom_control *oc, struct task_struct *p)
 
        dump_stack();
        if (is_memcg_oom(oc))
-               mem_cgroup_print_oom_info(oc->memcg, p);
+               mem_cgroup_print_oom_meminfo(oc->memcg);
        else {
                show_mem(SHOW_MEM_FILTER_NODES, oc->nodemask);
                if (is_dump_unreclaim_slabs())