From patchwork Sun May 27 09:32:31 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: 10429295 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 B351D60327 for ; Sun, 27 May 2018 09:32:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A4C5428D41 for ; Sun, 27 May 2018 09:32:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 995AB28D4B; Sun, 27 May 2018 09:32:48 +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 C595428D41 for ; Sun, 27 May 2018 09:32:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 303246B0003; Sun, 27 May 2018 05:32:46 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 2B1556B0006; Sun, 27 May 2018 05:32:46 -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 1C95D6B0007; Sun, 27 May 2018 05:32:46 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf0-f197.google.com (mail-pf0-f197.google.com [209.85.192.197]) by kanga.kvack.org (Postfix) with ESMTP id CA1446B0003 for ; Sun, 27 May 2018 05:32:45 -0400 (EDT) Received: by mail-pf0-f197.google.com with SMTP id c187-v6so5580780pfa.20 for ; Sun, 27 May 2018 02:32:45 -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=rdroOpmXvorE4jRPpsCFWinwcj3m3P9w5TTPwIfCqYM=; b=MtNy98tp2pAjhN82FK54OyX6cwG5vyYwgDZ8LXqCOj0XbPhBnzB7QyIcjM0u4xAPCk puibi6rmqmgjGoykbDJogrClw0tx9p+D080j3Kd5dsFAOgnHfiewi/tUq02dvnfpVafx xPYrdLHaXfF2dgyzMx2AIbqFAEwvMzdNaHaEYhNCBFdQJZvig3yqnQcBJdEzUGP5Sr8m GEirvhrVCTrmcM4SHucFRWRgHjqnyyaL/671LequbXctmYdKpbxogyhdteGpNLlsbhRO 82B2LIUcWk/5iUAM4Ql4719TRNHeHVNL8Imh+saxp5ulwgbGPIyvrVmqVYbcbOwBrZfT u/Pg== X-Gm-Message-State: ALKqPweCfqwT0tkD/R3NBP/rT8JcG0Cl6dGn1P70irjPukA3X8Ep3mJj hD4vIxA9vkOvwLZMH05S1sTmcRVH8ebCEm88y0BbQnRbNL6+HQz5tak4VIOXlUQmW64UdOHBEj0 pzXo1Ou1JgT2sKjC+AM7GZuh5PTF4c0H7cHYlp94D+Bx1OiwKnABi/IOIvjGoiLxoGKdVPbrMbw gGjv2yf/1NRdtg0eK1nqT/U1ZCPSS2qEsDCd57cfxUAtq6YxIDyRQBtJKRM36Sbq1hxho6Za3uO 0RxHMp89KEd2fFRGbIbXNwWB7LTQQlv97a7iUnWMxfMt9nT1E+bO/rnHeIPUsqx5aV1gH7t8Rv+ VS/kAicWUSh1vueabQbiMwJaCwaeKecteOPy+uDj8PKph6dLc7RLMYpa/DE6eY9HBn/TWVZtHeR J X-Received: by 2002:a62:c6d9:: with SMTP id x86-v6mr9257847pfk.192.1527413565452; Sun, 27 May 2018 02:32:45 -0700 (PDT) X-Received: by 2002:a62:c6d9:: with SMTP id x86-v6mr9257793pfk.192.1527413564030; Sun, 27 May 2018 02:32:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527413564; cv=none; d=google.com; s=arc-20160816; b=ETePJH5Lt7IWwAFk5jzj4v+gQA3SP9zcnpBek9FfBqrFgAH/FIf4Qg1Gk93HtH9Su7 RipUzl80USJSG3MGH0B9JNlzbB5h2prsnEyUxORBvFDKo07rtTOftkaNylhy97a0WTTt 8yJhpyEu81VjsYPcIiwgtU/bvZ4/5dGfVU2xoL9h1TuJE8fcKE4YjftO8CL/pEPUIWhv CyZprNDXwHtEE0dX7s/m8AtQ99+fe9cxKzKp2l0cp81xh1QIYMYpjnt5CQXHEF/Wn7YS 9RXmCEtkh8YWA2BeHJYuiLDuyKxUkFv1C5Do0pNgZfx3m/6YgIM8RUZpqghh+WPvxO3i BlCQ== 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 :arc-authentication-results; bh=rdroOpmXvorE4jRPpsCFWinwcj3m3P9w5TTPwIfCqYM=; b=gkzuCpaq7uhkLrbAokaTObIptAeoaUPP2VD0nOdY/9FK430UGPrMmLdUAqAGtUfmd6 L+iednjBr79YZH9Iub2BOXGTRNFdW47CmCBDwjF94Lw2zKYWby6j6GdDyc4ku/fx0lso SDD41m9egOx21E7VQL4l3b9UnfBAO1R9/GZ5YLxLYSq7w7q6VnmkqD+pkwCmqFt2iZKo +izwi7WbPOIx2EYaE4ulhoxTG16GbDdKCuN5jhPmUCchIGvDWtmkODPpLFWmE9NqCYKS LHXXqEmJOKRT3CLkWYy89ViGg8WobYiy01lJ1UsBcBiTXMMXf7K06wabL7+vHBV9+GE4 nxGg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=UF19gVvJ; 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 y184-v6sor963399pgb.112.2018.05.27.02.32.43 for (Google Transport Security); Sun, 27 May 2018 02:32:43 -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=UF19gVvJ; 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=rdroOpmXvorE4jRPpsCFWinwcj3m3P9w5TTPwIfCqYM=; b=UF19gVvJlBothuICwBWu9lVFzO6yiVppoG676JOzoTlAKmrsOHMPxBfIWLDCSG9St2 qrImSN1b5Yhqs3znwmDArLwiERUX+PD1nn++SQM2ona1AzZ0ptLkw4pIrFi45M/YEXAI 2QpPthCOKgDBe47TE/3vq8qkSQ32hRNT66wqu9KZ5YDotA5QV7jPYg376G7vlspMrRF1 /2e5yTsCqE6BpApdg283yzSS7ETnDo0j/sgad21LLu5S4a4qOM3IvfQYNXVB0HM+ROS8 fnoHYi4fnV6Wv+YUV5uuDV4wYsqNJWStZPbX3kOk33Nkxr7LI1rOg2OFTqjvzLbYONFj xnOg== X-Google-Smtp-Source: AB8JxZoCjTHV0CcKKY9GR++OWErWWd4xmFQkYijrcJ0IciafNBP7jWuNsOy9/kKh5MKc4LoD3ujFQg== X-Received: by 2002:a65:5288:: with SMTP id y8-v6mr7255198pgp.69.1527413563541; Sun, 27 May 2018 02:32:43 -0700 (PDT) Received: from node5.didichuxing.com ([13.94.31.177]) by smtp.gmail.com with ESMTPSA id d72-v6sm54588894pfe.150.2018.05.27.02.32.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 27 May 2018 02:32:42 -0700 (PDT) From: ufo19890607 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, ufo19890607 Subject: [PATCH v6] Refactor part of the oom report in dump_header Date: Sun, 27 May 2018 10:32:31 +0100 Message-Id: <1527413551-5982-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 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: constrain=CONSTRAINT_NONE nodemask=(null) origin_memcg= kill_memcg=/test/test1/test2 task=panic pid= 8622 uid= 0 ... 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: ufo19890607 --- include/linux/memcontrol.h | 29 +++++++++++++++++++++--- mm/memcontrol.c | 55 ++++++++++++++++++++++++++++++++-------------- mm/oom_kill.c | 12 +++------- 3 files changed, 67 insertions(+), 29 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index d99b71bc2c66..1c7d5da1c827 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -62,6 +62,20 @@ struct mem_cgroup_reclaim_cookie { unsigned int generation; }; +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", +}; + #ifdef CONFIG_MEMCG #define MEM_CGROUP_ID_SHIFT 16 @@ -464,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) { @@ -859,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..6c05fd3291e6 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[PATH_MAX], kill_memcg_name[PATH_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, PATH_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, PATH_MAX); + + if (p) + pr_info("oom-kill: constrain=%s, nodemask=%*pbl, origin_memcg=%s, kill_memcg=%s, task=%s, pid=%5d, uid=%5d\n", + oom_constraint_text[constraint], nodemask_pr_args(nodemask), + origin_memcg_name, kill_memcg_name, p->comm, p->pid, + from_kuid(&init_user_ns, task_uid(p))); + else + pr_info("oom-kill: constrain=%s, nodemask=%*pbl, origin_memcg=%s, kill_memcg=%s\n", + oom_constraint_text[constraint], nodemask_pr_args(nodemask), + origin_memcg_name, kill_memcg_name); rcu_read_unlock(); +} + +/** + * mem_cgroup_print_oom_info: Print OOM information relevant to memory controller. + * @memcg: The memory cgroup that went over limit + * @p: Task that is going to be killed + */ +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 8ba6cb88cf58..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 @@ -237,13 +236,6 @@ 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, -}; - /* * Determine the type of allocation constraint. */ @@ -421,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, @@ -430,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())