From patchwork Sat Jun 2 11:58:52 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: 10444779 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 7288260375 for ; Sat, 2 Jun 2018 11:59:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 61D1128A67 for ; Sat, 2 Jun 2018 11:59:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5649D28A6A; Sat, 2 Jun 2018 11:59:37 +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 7AC1E28A67 for ; Sat, 2 Jun 2018 11:59:36 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 77B8F6B0006; Sat, 2 Jun 2018 07:59:35 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 729C26B0007; Sat, 2 Jun 2018 07:59:35 -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 5F2276B0008; Sat, 2 Jun 2018 07:59:35 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl0-f69.google.com (mail-pl0-f69.google.com [209.85.160.69]) by kanga.kvack.org (Postfix) with ESMTP id 19C106B0006 for ; Sat, 2 Jun 2018 07:59:35 -0400 (EDT) Received: by mail-pl0-f69.google.com with SMTP id f10-v6so16939004pln.21 for ; Sat, 02 Jun 2018 04:59:35 -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:in-reply-to:references; bh=B3mr7q7JlMWx6b65/X/ihdrj8dCcIGeQt/tFTgp6uag=; b=ncLsXErithpT+BK9QPlwBdlq3Ib4uNdrgbiKxYXKmYzGb+oUxzld9xpec1uVAY6vJU 91ji/EqTn8/z7sQkkYKtgcqFvWNugEjtlTQ1cDuzhC8tni/Oqp4JCv9C20xJzj7X555z loMGw7Ir+UPwGpbYBUGfPW3uLirIr7j/pcWB8K+8nXl7tZ3SOdW2wh++G984v/9qnTTn J67AEjVZeDPgRNVWYx1hj8K9lPmMR7IRudDkn+EpdLTXIvpNA6sdBojQs38odCQsaHgP jW2hos2NWkf2+4WDY1GCT3ZnShrAQtlVbfdrPjLFwKRsqnEqsAUhC+dEBksLg0kvF81m XWRw== X-Gm-Message-State: ALKqPwcICt4RzYROxHa4xzw1CD/Cmm5as3kyfC0rH9XNIjxGSJyOTIrl 3OLieH6BNb+tCvOYflduPkLZcxcI90dM3/6uWD0MMdiD97KKbldyNzlYs4h/UYjXNGztbVQBCrZ vPdb+5Vkh2CTgkJgmJUhWD2NmJvtgrxSW3QMnuJ4qb+Z2xgb6GmbYGd0vrSs4bamhmXGGzZ2IvM lNDp06lfNh8rRR81aBdDXSPKP+Us4inW1lRQ8M8VHvePCMZdcgJ3uWhwZsI+0PMcRiCec8EYhNl NZRnrb75+SWtfxZaI2QdrcORDbP3uxbbFacn95UQvs/rWDJIa5Rf5mQ6HIGOXGHLI3wluDFPsZ/ DsLbvJO2r3qA438x9R0AYf6+L2WG9EsTlUfT5XNp765opekqnXGbgra18uxPsJdmxvbmwS9vuyK 1 X-Received: by 2002:a17:902:850a:: with SMTP id bj10-v6mr14491705plb.239.1527940774763; Sat, 02 Jun 2018 04:59:34 -0700 (PDT) X-Received: by 2002:a17:902:850a:: with SMTP id bj10-v6mr14491653plb.239.1527940773409; Sat, 02 Jun 2018 04:59:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527940773; cv=none; d=google.com; s=arc-20160816; b=ItIa1/QbgpXh9U4RKYypuHuNWjjRU0+3Unhy9pEP3VO6mzHzXfc+jbu+PwKsabYuFP lU2ufFArfJSY73BRngeOlfdFJFA+clQhQRkBL7CKT++fErSOft/q01VdFNxZ1fkGrHXK qcHdfzVHrWGH5cKuWIJt063zHVXDEXzdxF4GkXhWl2BpPHk8jMihQccHA6gWSGj6UDt2 14GHfG38LmieGigOiFoZzY/DQ7SOehrViPJ/0tx2oIFEDZVFP8+YBms9z/QteQJ009iQ 2O6Q2DHJxhE+aQ4U96YPUDyxzuKkS2IPrlBG83DnNCHRHr+wuhdV5gJOm+RqmpQJS5e1 XlGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=B3mr7q7JlMWx6b65/X/ihdrj8dCcIGeQt/tFTgp6uag=; b=s6j/G05DKkMCvfl0DZsOPvWInaVfTELYjBKnnt3eIftzkZqQZ27ozcgqNCDuSmkVIh wdd4rY7jYSpACqSOE7XkBch670Tf3wGCGPhALlbvzLhg6CsV7bJK+iJ6LSBi5GM1lLNI RrAsYbJwMo10yOWHf+zbezOhnyNQ3OQ0i5yEN5OWdPyH+z5zFDflDH0qcaUX7NzOHugE iF4HoJD2Dq+Ps/+esbaXB88WUARSy/pc24P4z3lC97IDG490EL54BLVW3/8i0DMfi+Ch 4c0OPONgy9yF17PUMF9dYXw83AcfDT9xzn+GZb3Z9wRwS57NTDWM794pxuGJFrftY34x NmOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=BmThaAKK; 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 m16-v6sor744999pfg.53.2018.06.02.04.59.33 for (Google Transport Security); Sat, 02 Jun 2018 04:59:33 -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=BmThaAKK; 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:in-reply-to:references; bh=B3mr7q7JlMWx6b65/X/ihdrj8dCcIGeQt/tFTgp6uag=; b=BmThaAKKpfWYR264/++sWQgnxYZS/HqbtIs86z/+FxkMFdkFQlgNwXls26vRSaTcgf vcM24EVAW2C0k/p9v0z1RDQyjynvcGidMyaE3ixlg9CIABeNT7AMJL8I1B38Fmgfbspv rvToL7YAGwNqrAQqjEolxqFhM6mZOGoVsJvJiqMcjWgclWSEEf4V9kJHfihb+ITv7IS4 SB8OZZaWR6i1sXzqz6oD7536k2x8p3vLzDPOSHdkSgPUv1oHA/SrRON3A1EBCp3obdzD imw6h3lhxGFRn73dePqh9IMmSE0voZppk3Srjc/iEJEvRB0oubTzaNZJq1uKZ1GeaCFX w6dg== X-Google-Smtp-Source: ADUXVKL1vm+vCaCgBivxgqTVpOWOzIKm/rgsdJDqtnL0Twm3hE5GwfMB2EUPFU/0beJq8FxsyEidwg== X-Received: by 2002:a62:581:: with SMTP id 123-v6mr14515532pff.38.1527940773053; Sat, 02 Jun 2018 04:59:33 -0700 (PDT) Received: from dest.didichuxing.com ([52.229.160.192]) by smtp.gmail.com with ESMTPSA id c83-v6sm84723543pfc.111.2018.06.02.04.59.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 02 Jun 2018 04:59:32 -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 Subject: [PATCH v7 2/2] Refactor part of the oom report in dump_header Date: Sat, 2 Jun 2018 19:58:52 +0800 Message-Id: <1527940734-35161-2-git-send-email-ufo19890607@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1527940734-35161-1-git-send-email-ufo19890607@gmail.com> References: <1527940734-35161-1-git-send-email-ufo19890607@gmail.com> 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 The dump_header does not print the memcg's name when the system oom happened, so users cannot locate the certain container which contains the task that has been killed by the oom killer. I follow the advices of David Rientjes and Michal Hocko, and refactor part of the oom report in a backwards compatible way. After this patch, users can get the memcg's path from the oom report and check the certain container more quickly. Below is the part of the oom report in the dmesg ... [ 142.158316] panic cpuset=/ mems_allowed=0-1 [ 142.158983] CPU: 15 PID: 8682 Comm: panic Not tainted 4.17.0-rc6+ #13 [ 142.159659] Hardware name: Inspur SA5212M4/YZMB-00370-107, BIOS 4.1.10 11/14/2016 [ 142.160342] Call Trace: [ 142.161037] dump_stack+0x78/0xb3 [ 142.161734] dump_header+0x7d/0x334 [ 142.162433] oom_kill_process+0x228/0x490 [ 142.163126] ? oom_badness+0x2a/0x130 [ 142.163821] out_of_memory+0xf0/0x280 [ 142.164532] __alloc_pages_slowpath+0x711/0xa07 [ 142.165241] __alloc_pages_nodemask+0x23f/0x260 [ 142.165947] alloc_pages_vma+0x73/0x180 [ 142.166665] do_anonymous_page+0xed/0x4e0 [ 142.167388] __handle_mm_fault+0xbd2/0xe00 [ 142.168114] handle_mm_fault+0x116/0x250 [ 142.168841] __do_page_fault+0x233/0x4d0 [ 142.169567] do_page_fault+0x32/0x130 [ 142.170303] ? page_fault+0x8/0x30 [ 142.171036] page_fault+0x1e/0x30 [ 142.171764] RIP: 0033:0x7f403000a860 [ 142.172517] RSP: 002b:00007ffc9f745c28 EFLAGS: 00010206 [ 142.173268] RAX: 00007f3f6fd7d000 RBX: 0000000000000000 RCX: 00007f3f7f5cd000 [ 142.174040] RDX: 00007f3fafd7d000 RSI: 0000000000000000 RDI: 00007f3f6fd7d000 [ 142.174806] RBP: 00007ffc9f745c50 R08: ffffffffffffffff R09: 0000000000000000 [ 142.175623] R10: 0000000000000022 R11: 0000000000000246 R12: 0000000000400490 [ 142.176542] R13: 00007ffc9f745d30 R14: 0000000000000000 R15: 0000000000000000 [ 142.177709] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),origin_memcg=(null),kill_memcg=/test/test1/test2,task=panic,pid= 8622,uid= 0 ... 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 is will refactor 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. Signed-off-by: yuzhoujian --- include/linux/memcontrol.h | 15 ++++++++++--- mm/memcontrol.c | 55 ++++++++++++++++++++++++++++++++-------------- mm/oom_kill.c | 5 +++-- 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 57311b6c4d67..1c7d5da1c827 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -478,8 +478,11 @@ void mem_cgroup_handle_over_high(void); unsigned long mem_cgroup_get_limit(struct mem_cgroup *memcg); -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, enum oom_constraint constraint, + nodemask_t *nodemask); + +void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg); static inline void mem_cgroup_oom_enable(void) { @@ -873,7 +876,13 @@ static inline unsigned long mem_cgroup_get_limit(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, + enum oom_constraint constraint, nodemask_t *nodemask) +{ +} + +static inline void +mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg) { } diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 2bd3df3d101a..fd1172938c8e 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1118,33 +1118,54 @@ 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. - * @memcg: The memory cgroup that went over limit +/* + * mem_cgroup_print_oom_context: Print OOM context information relevant to + * memory controller, which includes allocation constraint, nodemask, origin + * memcg that has reached its limit, kill memcg that contains the killed + * process, killed process's command, pid and uid. + * @memcg: The origin memory cgroup that went over limit * @p: Task that is going to be killed + * @constraint: The allocation constraint + * @nodemask: The allocation nodemask * * 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, + enum oom_constraint constraint, nodemask_t *nodemask) { - struct mem_cgroup *iter; - unsigned int i; + static char origin_memcg_name[NAME_MAX], kill_memcg_name[NAME_MAX]; + struct cgroup *origin_cgrp, *kill_cgrp; rcu_read_lock(); - - if (p) { - pr_info("Task in "); - 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 "); + if (memcg) { + origin_cgrp = memcg->css.cgroup; + cgroup_path(origin_cgrp, origin_memcg_name, NAME_MAX); } - - pr_cont_cgroup_path(memcg->css.cgroup); - pr_cont("\n"); - + kill_cgrp = task_cgroup(p, memory_cgrp_id); + cgroup_path(kill_cgrp, kill_memcg_name, NAME_MAX); + + if (p) + pr_info("oom-kill:constraint=%s,nodemask=%*pbl,origin_memcg=%s,kill_memcg=%s,task=%s,pid=%5d,uid=%5d\n", + oom_constraint_text[constraint], nodemask_pr_args(nodemask), + strlen(origin_memcg_name) ? origin_memcg_name : "(null)", + kill_memcg_name, p->comm, p->pid, + from_kuid(&init_user_ns, task_uid(p))); + else + pr_info("oom-kill:constraint=%s,nodemask=%*pbl,origin_memcg=%s,kill_memcg=%s\n", + oom_constraint_text[constraint], nodemask_pr_args(nodemask), + strlen(origin_memcg_name) ? origin_memcg_name : "(null)", kill_memcg_name); rcu_read_unlock(); +} + +/** + * mem_cgroup_print_oom_info: 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)), diff --git a/mm/oom_kill.c b/mm/oom_kill.c index c806cd656af6..af0efab8a9e5 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -16,7 +16,6 @@ * for newbie kernel hackers. It features several pointers to major * kernel subsystems and hints as to where to find out what things do. */ - #include #include #include @@ -414,6 +413,7 @@ static void dump_tasks(struct mem_cgroup *memcg, const nodemask_t *nodemask) static void dump_header(struct oom_control *oc, struct task_struct *p) { + enum oom_constraint constraint = constrained_alloc(oc); 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, @@ -423,8 +423,9 @@ static void dump_header(struct oom_control *oc, struct task_struct *p) cpuset_print_current_mems_allowed(); dump_stack(); + mem_cgroup_print_oom_context(oc->memcg, p, constraint, oc->nodemask); 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())