From patchwork Sat Sep 29 13:06:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?56a56Iif6ZSu?= X-Patchwork-Id: 10620803 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 498B2A6A for ; Sat, 29 Sep 2018 13:06:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3397A29E90 for ; Sat, 29 Sep 2018 13:06:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 251B52A706; Sat, 29 Sep 2018 13:06:53 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EE50929E90 for ; Sat, 29 Sep 2018 13:06:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AF0AA8E0002; Sat, 29 Sep 2018 09:06:50 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id A9FB88E0001; Sat, 29 Sep 2018 09:06:50 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 98E7F8E0002; Sat, 29 Sep 2018 09:06:50 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by kanga.kvack.org (Postfix) with ESMTP id 586E08E0001 for ; Sat, 29 Sep 2018 09:06:50 -0400 (EDT) Received: by mail-pg1-f198.google.com with SMTP id k66-v6so8269999pga.21 for ; Sat, 29 Sep 2018 06:06:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:from:to:cc:subject:date :message-id; bh=iHbSHXWXS+E0Z3AAD+JsGbvMrWtu+9UhdiUzoBeW10U=; b=o+kw7/sVxeI8lw/ezMK+TqpAZDXahm3yfKrnhx2TEdWwFJpMitwSnPs7Xu17kK+WUe ZqLZolREAZqJx64zBhuIgHAkS82hghX8SLVcGEASj1PQNuprs4gwoH8+B+9YaaMNjHpM 38+r3lJwmcItfaKH1GYtM95tVh+5YpFL7nWPF/Wl4u4t8OqnJfyMykpv+E+KhMJRXD9v Hl2fsY6AmWnvcmUhHQ3EDM1n+zcdrTIyWYohr5a711uj8Lgpt5Giv+2Zef9K5h5PMZL2 vlbD4L+UsUvF3TwLRMitWpP4oSMqBz2TDpbkv4ogUrioqKpmSUaq97C0vTa7cWxRKj7Q j3KA== X-Gm-Message-State: ABuFfohTtTUYoSPgp6gdnkx38fNSnTheZ0XTg2LeojbWY1h3s1On85VM yOWl1+5tcWPG6h/OaCVgxaVEWckd6DHRSAukSRp9RbXCZw2HOXQTYrBMraES1gNbRHBb1Wtd+TF ijvueHTHDBSY7xRaWYOEGCfC4CmZuITBYaC1XEG95RBhWDctIBerUbfg3IPsroPXGnt3qV9XUKu 2mrk0xGZjf0Etb/Fzl+w3IX5brpna7t62OCEaVh4bkzxilnGVFIjYeshza65v9yA9ZwRlTiVrjk VXNK4bwYwrIRaLMPiAZbqh+fdPTRRRIKqjlfWDITIOlLBvMx+EQm6qqbWqv9GNZSlMVyC3/no/6 ZgI1EwrNKoaXzZimN3EGYnHixs7VoEecMk0mYmh/TC4ojJR08GHLLgGHUU7tWeX+dzIgTCRHzuL Q X-Received: by 2002:a17:902:710e:: with SMTP id a14-v6mr3215887pll.179.1538226409979; Sat, 29 Sep 2018 06:06:49 -0700 (PDT) X-Received: by 2002:a17:902:710e:: with SMTP id a14-v6mr3215775pll.179.1538226408603; Sat, 29 Sep 2018 06:06:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538226408; cv=none; d=google.com; s=arc-20160816; b=mQinS6iMWIyikmfO+/Lc6hhzpgcmwLFQRn5gzT/IApUifxit6uAc5spPCjY3L8HX+a vQfLS+qhA63fhakMtbCfZrlQ0fQSZqXM+6p/i3ZWosunrqQOujz1CICg/MC9kTA/rSL7 o630CybyGgc9NwTpJ9CngQVKWyRdYPTNV78hpxrmn/7aQe0Cvy6lVKq/xcaFEUNOdr3U HFJeB+mRCPHMT1CD6gfUsvSlIBdwFzXI6MY/qc9cWy1vMnQkrr71o1tPYQx5FF0Zpn4J laDO8ea2sPU85nlRxAybZ9V2aGNXQPjZ1A3cCNn1tvxpsXE70fb5seZDkpKUV/mZEebq AE5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:cc:to:from:dkim-signature; bh=iHbSHXWXS+E0Z3AAD+JsGbvMrWtu+9UhdiUzoBeW10U=; b=V2Q2DpFKEVKqBevKFF/+JtZO6uAJgksjgjYeCkvwY3OuX4FGPY2NooNZ/dfaBJn+Nx PCEiVj+AbOi8bNfJVIV8v5ZwlYFSv/2sx0jgAcK4rbmX6j7ucX/Ixzy0HIwzUcNg+EQh 2YQx3+1PGjFMilprD7x/79SgNydpXBHBN6B6WTHII20QMJlrE1PhUIwl7NST59ESaQnX sCwd3PLKWfm0MPpJrTA8i/oCEwZtXxWKnyjAoALG3M6a3TZPkTtFKALHLkx8TPn7mshX b0q+kTfliot9SO4GfFCOEQyAmt8MS0JB9tGQRVnZdHZy//diOJPuz883S2gWmKa9CaBc Vn1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=roLehWvR; spf=pass (google.com: domain of ufo19890607@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=ufo19890607@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id t66-v6sor2014194pfa.4.2018.09.29.06.06.48 for (Google Transport Security); Sat, 29 Sep 2018 06:06:48 -0700 (PDT) Received-SPF: pass (google.com: domain of ufo19890607@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=roLehWvR; spf=pass (google.com: domain of ufo19890607@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=ufo19890607@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=iHbSHXWXS+E0Z3AAD+JsGbvMrWtu+9UhdiUzoBeW10U=; b=roLehWvR9Gvqg9SU62JgWXAAffmGBpV7plBQ4YHvyDb5TdNIVqNJZKq63fEx84vLbR GuyfFrIoFaZMeipUXHAahd3tFw8bADh9efhTwcc5H2SNsElDHM1Kyu5hfnNT+MrzHXHb 1wxCKM+5MEAW74xYSyDtSbCq2sugG5lIBBNxeTfAjNz5394i0d12k73La7836J/3+At6 iTHIQU9v9AEeZoAZZpOHLs/EJaFD/OdBmzE9dqk7+5islSh1DXBzcZ0EciKj1Vuj2C7R fDQZrbgqxbPzbYOBEBEHqJZO7TTWkHJ5GwBmzygnriVzenWQZDF/CSFc7uXOUpTv4veM DNjg== X-Google-Smtp-Source: ACcGV62aly+A8ql0KDWC2peyzePdmUNCUyqRc+GUdwpKj6dkv8F1E8J/IV6SQ2+mcwLngysbyVeM1Q== X-Received: by 2002:a62:1c06:: with SMTP id c6-v6mr3132003pfc.41.1538226407919; Sat, 29 Sep 2018 06:06:47 -0700 (PDT) Received: from dest.didichuxing.com ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id p4-v6sm13828267pgs.75.2018.09.29.06.06.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 06:06:46 -0700 (PDT) From: ufo19890607@gmail.com To: akpm@linux-foundation.org, mhocko@suse.com, rientjes@google.com, kirill.shutemov@linux.intel.com, aarcange@redhat.com, penguin-kernel@i-love.sakura.ne.jp, guro@fb.com, yang.s@alibaba-inc.com Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, yuzhoujian@didichuxing.com Subject: [PATCH v15 1/2] Reorganize the oom report in dump_header Date: Sat, 29 Sep 2018 21:06:26 +0800 Message-Id: <1538226387-16600-1-git-send-email-ufo19890607@gmail.com> X-Mailer: git-send-email 1.8.3.1 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: yuzhoujian OOM report contains several sections. The first one is the allocation context that has triggered the OOM. Then we have cpuset context followed by the stack trace of the OOM path. The tird one is the OOM memory information. Followed by the current memory state of all system tasks. At last, we will show oom eligible tasks and the information about the chosen oom victim. One thing that makes parsing more awkward than necessary is that we do not have a single and easily parsable line about the oom context. This patch is reorganizing the oom report to 1) who invoked oom and what was the allocation request [ 515.902945] tuned invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0 2) OOM stack trace [ 515.904273] CPU: 24 PID: 1809 Comm: tuned Not tainted 4.19.0-rc5+ #3 [ 515.905518] Hardware name: Inspur SA5212M4/YZMB-00370-107, BIOS 4.1.10 11/14/2016 [ 515.906821] Call Trace: [ 515.908062] dump_stack+0x5a/0x73 [ 515.909311] dump_header+0x55/0x28c [ 515.914260] oom_kill_process+0x2d8/0x300 [ 515.916708] out_of_memory+0x145/0x4a0 [ 515.917932] __alloc_pages_slowpath+0x7d2/0xa16 [ 515.919157] __alloc_pages_nodemask+0x277/0x290 [ 515.920367] filemap_fault+0x3d0/0x6c0 [ 515.921529] ? filemap_map_pages+0x2b8/0x420 [ 515.922709] ext4_filemap_fault+0x2c/0x40 [ext4] [ 515.923884] __do_fault+0x20/0x80 [ 515.925032] __handle_mm_fault+0xbc0/0xe80 [ 515.926195] handle_mm_fault+0xfa/0x210 [ 515.927357] __do_page_fault+0x233/0x4c0 [ 515.928506] do_page_fault+0x32/0x140 [ 515.929646] ? page_fault+0x8/0x30 [ 515.930770] page_fault+0x1e/0x30 3) OOM memory information [ 515.958093] Mem-Info: [ 515.959647] active_anon:26501758 inactive_anon:1179809 isolated_anon:0 active_file:4402672 inactive_file:483963 isolated_file:1344 unevictable:0 dirty:4886753 writeback:0 unstable:0 slab_reclaimable:148442 slab_unreclaimable:18741 mapped:1347 shmem:1347 pagetables:58669 bounce:0 free:88663 free_pcp:0 free_cma:0 ... 4) current memory state of all system tasks [ 516.079544] [ 744] 0 744 9211 1345 114688 82 0 systemd-journal [ 516.082034] [ 787] 0 787 31764 0 143360 92 0 lvmetad [ 516.084465] [ 792] 0 792 10930 1 110592 208 -1000 systemd-udevd [ 516.086865] [ 1199] 0 1199 13866 0 131072 112 -1000 auditd [ 516.089190] [ 1222] 0 1222 31990 1 110592 157 0 smartd [ 516.091477] [ 1225] 0 1225 4864 85 81920 43 0 irqbalance [ 516.093712] [ 1226] 0 1226 52612 0 258048 426 0 abrtd [ 516.112128] [ 1280] 0 1280 109774 55 299008 400 0 NetworkManager [ 516.113998] [ 1295] 0 1295 28817 37 69632 24 0 ksmtuned [ 516.144596] [ 10718] 0 10718 2622484 1721372 15998976 267219 0 panic [ 516.145792] [ 10719] 0 10719 2622484 1164767 9818112 53576 0 panic [ 516.146977] [ 10720] 0 10720 2622484 1174361 9904128 53709 0 panic [ 516.148163] [ 10721] 0 10721 2622484 1209070 10194944 54824 0 panic [ 516.149329] [ 10722] 0 10722 2622484 1745799 14774272 91138 0 panic 5) oom context (contrains and the chosen victim). oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0-1,task=panic,pid=10737,uid=0 An admin can easily get the full oom context at a single line which makes parsing much easier. Signed-off-by: yuzhoujian --- Changes since v14: - add the dump_oom_summary for the single line output of oom context. - fix the null pointer in the dump_header. Changes since v13: - remove the spaces for printing pid and uid. Changes since v12: - print the cpuset and memory allocation information after oom victim comm, pid. Changes since v11: - move the array of const char oom_constraint_text to oom_kill.c - add the cpuset information in the one line output. Changes since v10: - divide the patch v8 into two parts. One part is to add the array of const char and put enum oom_constaint into oom.h; the other adds a new func to print the missing information for the system- wide oom report. Changes since v9: - divide the patch v8 into two parts. One part is to move enum oom_constraint into memcontrol.h; the other refactors the output info in the dump_header. - replace orgin_memcg and kill_memcg with oom_memcg and task_memcg resptively. Changes since v8: - add the constraint in the oom_control structure. - put enum oom_constraint and constraint array into the oom.h file. - simplify the description for mem_cgroup_print_oom_context. Changes since v7: - add the constraint parameter to dump_header and oom_kill_process. - remove the static char array in the mem_cgroup_print_oom_context, and invoke pr_cont_cgroup_path to print memcg' name. - combine the patchset v6 into one. Changes since v6: - divide the patch v5 into two parts. One part is to add an array of const char and put enum oom_constraint into the memcontrol.h; the other refactors the output in the dump_header. - limit the memory usage for the static char array by using NAME_MAX in the mem_cgroup_print_oom_context. - eliminate the spurious spaces in the oom's output and fix the spelling of "constrain". Changes since v5: - add an array of const char for each constraint. - replace all of the pr_cont with a single line print of the pr_info. - put enum oom_constraint into the memcontrol.c file for printing oom constraint. Changes since v4: - rename the helper's name to mem_cgroup_print_oom_context. - rename the mem_cgroup_print_oom_info to mem_cgroup_print_oom_meminfo. - add the constrain info in the dump_header. Changes since v3: - rename the helper's name to mem_cgroup_print_oom_memcg_name. - add the rcu lock held to the helper. - remove the print info of memcg's name in mem_cgroup_print_oom_info. Changes since v2: - add the mem_cgroup_print_memcg_name helper to print the memcg's name which contains the task that will be killed by the oom-killer. Changes since v1: - replace adding mem_cgroup_print_oom_info with printing the memcg's name only. include/linux/oom.h | 10 ++++++++++ kernel/cgroup/cpuset.c | 4 ++-- mm/oom_kill.c | 29 ++++++++++++++++++++--------- mm/page_alloc.c | 4 ++-- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/include/linux/oom.h b/include/linux/oom.h index 69864a5..d079920 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h @@ -15,6 +15,13 @@ struct mem_cgroup; struct task_struct; +enum oom_constraint { + CONSTRAINT_NONE, + CONSTRAINT_CPUSET, + CONSTRAINT_MEMORY_POLICY, + CONSTRAINT_MEMCG, +}; + /* * Details of the page allocation that triggered the oom killer that are used to * determine what should be killed. @@ -42,6 +49,9 @@ struct oom_control { unsigned long totalpages; struct task_struct *chosen; unsigned long chosen_points; + + /* Used to print the constraint info. */ + enum oom_constraint constraint; }; extern struct mutex oom_lock; diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 266f10c..9510a5b 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -2666,9 +2666,9 @@ void cpuset_print_current_mems_allowed(void) rcu_read_lock(); cgrp = task_cs(current)->css.cgroup; - pr_info("%s cpuset=", current->comm); + pr_cont(",cpuset="); pr_cont_cgroup_name(cgrp); - pr_cont(" mems_allowed=%*pbl\n", + pr_cont(",mems_allowed=%*pbl", nodemask_pr_args(¤t->mems_allowed)); rcu_read_unlock(); diff --git a/mm/oom_kill.c b/mm/oom_kill.c index f10aa53..0935fca 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -245,11 +245,11 @@ unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg, return points > 0 ? points : 1; } -enum oom_constraint { - CONSTRAINT_NONE, - CONSTRAINT_CPUSET, - CONSTRAINT_MEMORY_POLICY, - CONSTRAINT_MEMCG, +static const char * const oom_constraint_text[] = { + [CONSTRAINT_NONE] = "CONSTRAINT_NONE", + [CONSTRAINT_CPUSET] = "CONSTRAINT_CPUSET", + [CONSTRAINT_MEMORY_POLICY] = "CONSTRAINT_MEMORY_POLICY", + [CONSTRAINT_MEMCG] = "CONSTRAINT_MEMCG", }; /* @@ -430,14 +430,12 @@ static void dump_tasks(struct mem_cgroup *memcg, const nodemask_t *nodemask) static void dump_header(struct oom_control *oc, struct task_struct *p) { - pr_warn("%s invoked oom-killer: gfp_mask=%#x(%pGg), nodemask=%*pbl, order=%d, oom_score_adj=%hd\n", - current->comm, oc->gfp_mask, &oc->gfp_mask, - nodemask_pr_args(oc->nodemask), oc->order, + pr_warn("%s invoked oom-killer: gfp_mask=%#x(%pGg), order=%d, oom_score_adj=%hd\n", + current->comm, oc->gfp_mask, &oc->gfp_mask, oc->order, current->signal->oom_score_adj); if (!IS_ENABLED(CONFIG_COMPACTION) && oc->order) pr_warn("COMPACTION is disabled!!!\n"); - cpuset_print_current_mems_allowed(); dump_stack(); if (is_memcg_oom(oc)) mem_cgroup_print_oom_info(oc->memcg, p); @@ -450,6 +448,17 @@ static void dump_header(struct oom_control *oc, struct task_struct *p) dump_tasks(oc->memcg, oc->nodemask); } +static void dump_oom_summary(struct oom_control *oc, struct task_struct *victim) +{ + /* one line summary of the oom killer context. */ + pr_info("oom-kill:constraint=%s,nodemask=%*pbl", + oom_constraint_text[oc->constraint], + nodemask_pr_args(oc->nodemask)); + cpuset_print_current_mems_allowed(); + pr_cont(",task=%s,pid=%d,uid=%d\n", victim->comm, victim->pid, + from_kuid(&init_user_ns, task_uid(victim))); +} + /* * Number of OOM victims in flight */ @@ -951,6 +960,8 @@ static void oom_kill_process(struct oom_control *oc, const char *message) if (__ratelimit(&oom_rs)) dump_header(oc, p); + if (oc) + dump_oom_summary(oc, victim); pr_err("%s: Kill process %d (%s) score %u or sacrifice child\n", message, task_pid_nr(p), p->comm, points); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 89d2a2a..ff18663 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3416,13 +3416,13 @@ void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...) va_start(args, fmt); vaf.fmt = fmt; vaf.va = &args; - pr_warn("%s: %pV, mode:%#x(%pGg), nodemask=%*pbl\n", + pr_warn("%s: %pV, mode:%#x(%pGg), nodemask=%*pbl", current->comm, &vaf, gfp_mask, &gfp_mask, nodemask_pr_args(nodemask)); va_end(args); cpuset_print_current_mems_allowed(); - + pr_cont("\n"); dump_stack(); warn_alloc_show_mem(gfp_mask, nodemask); }