From patchwork Fri Apr 28 13:24:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yosry Ahmed X-Patchwork-Id: 13226460 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id EC0EAC77B60 for ; Fri, 28 Apr 2023 13:24:16 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 606AB6B007B; Fri, 28 Apr 2023 09:24:16 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 58E416B007D; Fri, 28 Apr 2023 09:24:16 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 408B66B007E; Fri, 28 Apr 2023 09:24:16 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 2CCBC6B007B for ; Fri, 28 Apr 2023 09:24:16 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id DD211140120 for ; Fri, 28 Apr 2023 13:24:15 +0000 (UTC) X-FDA: 80730868470.02.DFCA2BB Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf16.hostedemail.com (Postfix) with ESMTP id 20DE518001E for ; Fri, 28 Apr 2023 13:24:12 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=ahJ5tf1z; spf=pass (imf16.hostedemail.com: domain of 3_MhLZAoKCOUfVZYfHOTLKNVVNSL.JVTSPUbe-TTRcHJR.VYN@flex--yosryahmed.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3_MhLZAoKCOUfVZYfHOTLKNVVNSL.JVTSPUbe-TTRcHJR.VYN@flex--yosryahmed.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1682688253; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Y+FzrFpmnoCmeFQ217D+x4Ju8+C0DQecKfFykJdZXOk=; b=Fso3dByAkejy/UYmUaABxDHNxAeMUW4GrZ/nGSAiK02Qxdqcxn9FmEbm313LFHoU1TXwAu /QSrjCqZrYapXTgVa+DZo8uMQ22JwBui3VQ86/GpUQ7Uh0AvdFRl8+4nE77u15iuCRAyoP o/XAPM6Y9CENnDzWV29QJH8yhAihCq4= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=ahJ5tf1z; spf=pass (imf16.hostedemail.com: domain of 3_MhLZAoKCOUfVZYfHOTLKNVVNSL.JVTSPUbe-TTRcHJR.VYN@flex--yosryahmed.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3_MhLZAoKCOUfVZYfHOTLKNVVNSL.JVTSPUbe-TTRcHJR.VYN@flex--yosryahmed.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1682688253; a=rsa-sha256; cv=none; b=3lfLj5CCbG1O1BMCzk+6kxVzWw+SODnf6WqBpTZalqaMz4T5Lh2ncAnS/2LQyXDnSmR5SD U9CeH1cEib8bxdKBDdTgg7HV9+Bu+bZDYisEVV37WB5nIbQKJsMx5GX5MvY5WRw05M5AC5 1LTFcFKYR9m8IDUeUhpETiun4JYwE0g= Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-54f9af249edso165485837b3.1 for ; Fri, 28 Apr 2023 06:24:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1682688252; x=1685280252; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Y+FzrFpmnoCmeFQ217D+x4Ju8+C0DQecKfFykJdZXOk=; b=ahJ5tf1zjA7jhOV/9LiwCRyuWOWHRwEdLk7R0d3XMmILa09rKnfx5nny2uPly2tetM yQe3PTogi+hkDTWAyAo3/jS9Bq4LZKPSzrbVPycPHL0j37hx58O3J7vo7Edyyivmccmm 18Pb9GBVLPvYnxrvGeLG3aEwVfIhh0fflwdlhi4SSOB7+PY4t+ZYcJNyWcYRam9KFuAA PmhzEKiIFCk0EIXEsZHJ8Nv/iwsB92yyqpsd4da+lc/aDt5ZKzGH3eSQwh3kWSWXQgsr XAdD201Y1DEr8SPDG9gavkbwwkpUB/LVYwXboCYPhs7zxuzM6GotdmSf09vq72UBrtAr SZ2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682688252; x=1685280252; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Y+FzrFpmnoCmeFQ217D+x4Ju8+C0DQecKfFykJdZXOk=; b=UIRqKJAXenRAASxx2Xi+exlo2pAR7R95lqQYjYWdLqbEbJP2fXXS0AykozKUBFz+Oa 0y6vn9qeP0jfiUpCdF0ZjE4ixx3yQmVH8zWbfaLY5SJkfyxv8Qz4eDW/2l1wdw8dpvcg hkv0rdcjW8FNL15mTqR8cuKIcwV9U1jmegIssjpc3EqraDndAy84kjMfLva9vF/Y26be /Y9rWNDKqSo8QgLniM6Wq1l3Lr28ENtjG1pYVVdabNT5ipc5zfgsgJul6yKXfd7GQtau JXG+fBPmgfA6K8ff5UnNi7rnXwav/Js25KF29K9CInIW4SfQNEHfh0xgUldAdT4zGgwQ KfFw== X-Gm-Message-State: AC+VfDx85Yp8pbgQtL+S9I6kuClCx6yYeSH+dgM4220RlmOZzBpM4B/v llBF3omT7FfaMriMqJ6pbNmLqWPAJp3Z3jZ4 X-Google-Smtp-Source: ACHHUZ6GoDmbt3beV9QlXSTxOyplLo7KKBwAqbwxaQGER72TavmJAupPAyv7ANVUtRJ7bxflY5Y1p3fIF8lhgUMf X-Received: from yosry.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2327]) (user=yosryahmed job=sendgmr) by 2002:a81:431e:0:b0:54c:fd7:476e with SMTP id q30-20020a81431e000000b0054c0fd7476emr3309474ywa.3.1682688252124; Fri, 28 Apr 2023 06:24:12 -0700 (PDT) Date: Fri, 28 Apr 2023 13:24:05 +0000 In-Reply-To: <20230428132406.2540811-1-yosryahmed@google.com> Mime-Version: 1.0 References: <20230428132406.2540811-1-yosryahmed@google.com> X-Mailer: git-send-email 2.40.1.495.gc816e09b53d-goog Message-ID: <20230428132406.2540811-2-yosryahmed@google.com> Subject: [PATCH v2 1/2] memcg: use seq_buf_do_printk() with mem_cgroup_print_oom_meminfo() From: Yosry Ahmed To: Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Andrew Morton Cc: Muchun Song , Sergey Senozhatsky , Steven Rostedt , Petr Mladek , Chris Li , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Yosry Ahmed , Michal Hocko X-Rspam-User: X-Rspamd-Server: rspam03 X-Stat-Signature: rx5qt1hxoxoxjz56smyip1qgrffttr4z X-Rspamd-Queue-Id: 20DE518001E X-HE-Tag: 1682688252-515665 X-HE-Meta: U2FsdGVkX1+AjOsjX3vCPzZ+kR3feP8aI0QSh9RzOUVS7+nUVHMWoFMAjtfctbyUgQvDvH4hQR2F0LNU2dNpVn9us7eo6hTc8YzRaO0AmeVCldLv7yI8AVDASmmTrfP2p2gP+iO2paDQfnhmOMmWBtuSGJQl66juz6T5vQNcrjd4OocJ//eVKwANZVc61Bx4zTw/Gqt2dHBBYdciwfceKRcdVTSI0XpbrQTxhxBAPKjj3qwTwRcAILYMuI4Upbf1DTFe57HVYJbOj5eDljshXtdLJoVPeiO4XL0WTx11CIFqKRYPlCykS1B3wN4VlmgmHyTG1qhJhNmdZ9eVeVGs9HdQFyb5PZvcTYFanHKgClH9ELeiKXsASJqotlsx6x20U2dJiiF5WxXptYsdwCTyDBPpEvYiPqqwW0spRkSBD99/xRm5lEk/zZGQ6kRCPHd9tqc5nduFk/EmXpmffgKadyygpSBJ3AGTXgp7QqQItRRElno+IhhkEvcBXIhrfaKLCvqO7n2MX+ryJDZZR+odHnQ8b80kFRjCZLz//mdftCRAanUWuZfSH8JN5EANzA+KLvJ0TVoGNdPQLJlvl4GP3vHEi87C8zJ0Sqbhy9V1GDdH+HQFcGQa5vR1eCPhDlTvqn/S8uNopm2KALc7OSbYCpnwIzlJQRDolbs9iLAnza/o69Fq4uS/my5nsczR2vJRU9RfeZp5Pj8VQNDAHHyanGHVpE5ZY7wThLWiZDGcHm5mNFzmELvzFDAjVBzioOse0PBHGEnorGt/i0dkCTGTOcfXhSvUR7395xDbqG2WuFIMirvkYAV6IZ4Loi998iY8tsTpycswGch/EBG2GfjIy5hlS+7nSunudNnpXvEjJmDNPuSk+A2C0y+8G+0NkqK0RcD8cXCqXYiuEN7np0zb1AoBLBy+1c0Sis90cQudwtKRrtojsu37DHGFw/+TZa/zJyW5fEanQ2qyFVnbB29 PPE3xgOa DifNstsmOJmrYJiWEI2/Sr7fVi/OMV2FAw3WawzoRYHc2Gw5Y0VSyKFbpxJFvmv7H2RsLiXQ+y+I5rYO0leuZ03ooCyo4porGRb9ajV719SqPF3EkiqJEDXTaS8xssFhjR4v2R+/9gl+3zivBFcADOqQScDI4tBkGO/J4c5Ump/ezLGJB3sOaSocITgRoi0rr/ZU0yfhw/LwW76NJDeUvc9K0sA5OzJzTN8Oc3MPEf8LnJ4Fh+HELlw6nKMe3LK6oQEaV8EgAjF6yZDSpT7t0n4UISsfYTUQMwlJGdU/L3SeGARzA24QQcxsB34VTVddogsmdK8BUFRpOpaRxrOPlhIIC6pJDtN+8Iu9BXFoSooCYGA12Ywlnr1QpNbb1CgahjdYwydO9F6ZrpLTWi/ohxITfaqok16IH+SJCyj5ZroTuS9M6Q7Ahu1on84hIUgpn+CY85lVCzg/Fk4C4vh/7VJXM8u4oG3eN/Gy98EJ8nWk0fmIMpYsURbRdW3SpjEhqynjSFA5EBQf57zGIVYofMsgA4mxoeti4LVEmRH4wTTtN5O+YXhJ1mbObwTupiaSDXC9V42YagUGVFn2bcATbCvb3eZJpncSHZMmTNnSXEmZK61XgOMqgbY74KfEeY9UNFQyR7kPeGc+JYn8r2oCvakZaUrgDtrxd9T2zUymKiFuC5mRBR9u9rN2ux8On6ym02+J6vsFsaf9JJkgtalHkg/fQrHHfYXpR1fSCNOJW0iLJCVsKcobU7IdzI2l1QlCmMuk+tBt1ziZTo3xUMfF/wpYFVeQy0epUGqqwtn9tPbwa3BzZCryEV/EBFQ== 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: Currently, we format all the memcg stats into a buffer in mem_cgroup_print_oom_meminfo() and use pr_info() to dump it to the logs. However, this buffer is large in size. Although it is currently working as intended, ther is a dependency between the memcg stats buffer and the printk record size limit. If we add more stats in the future and the buffer becomes larger than the printk record size limit, or if the prink record size limit is reduced, the logs may be truncated. It is safer to use seq_buf_do_printk(), which will automatically break up the buffer at line breaks and issue small printk() calls. Refactor the code to move the seq_buf from memory_stat_format() to its callers, and use seq_buf_do_printk() to print the seq_buf in mem_cgroup_print_oom_meminfo(). Signed-off-by: Yosry Ahmed Acked-by: Michal Hocko Reviewed-by: Sergey Senozhatsky Acked-by: Shakeel Butt Reviewed-by: Muchun Song --- mm/memcontrol.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 5abffe6f8389..5922940f92c9 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1551,13 +1551,10 @@ static inline unsigned long memcg_page_state_output(struct mem_cgroup *memcg, return memcg_page_state(memcg, item) * memcg_page_state_unit(item); } -static void memory_stat_format(struct mem_cgroup *memcg, char *buf, int bufsize) +static void memory_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) { - struct seq_buf s; int i; - seq_buf_init(&s, buf, bufsize); - /* * Provide statistics on the state of the memory subsystem as * well as cumulative event counters that show past behavior. @@ -1574,21 +1571,21 @@ static void memory_stat_format(struct mem_cgroup *memcg, char *buf, int bufsize) u64 size; size = memcg_page_state_output(memcg, memory_stats[i].idx); - seq_buf_printf(&s, "%s %llu\n", memory_stats[i].name, size); + seq_buf_printf(s, "%s %llu\n", memory_stats[i].name, size); if (unlikely(memory_stats[i].idx == NR_SLAB_UNRECLAIMABLE_B)) { size += memcg_page_state_output(memcg, NR_SLAB_RECLAIMABLE_B); - seq_buf_printf(&s, "slab %llu\n", size); + seq_buf_printf(s, "slab %llu\n", size); } } /* Accumulated memory events */ - seq_buf_printf(&s, "pgscan %lu\n", + seq_buf_printf(s, "pgscan %lu\n", memcg_events(memcg, PGSCAN_KSWAPD) + memcg_events(memcg, PGSCAN_DIRECT) + memcg_events(memcg, PGSCAN_KHUGEPAGED)); - seq_buf_printf(&s, "pgsteal %lu\n", + seq_buf_printf(s, "pgsteal %lu\n", memcg_events(memcg, PGSTEAL_KSWAPD) + memcg_events(memcg, PGSTEAL_DIRECT) + memcg_events(memcg, PGSTEAL_KHUGEPAGED)); @@ -1598,13 +1595,13 @@ static void memory_stat_format(struct mem_cgroup *memcg, char *buf, int bufsize) memcg_vm_event_stat[i] == PGPGOUT) continue; - seq_buf_printf(&s, "%s %lu\n", + seq_buf_printf(s, "%s %lu\n", vm_event_name(memcg_vm_event_stat[i]), memcg_events(memcg, memcg_vm_event_stat[i])); } /* The above should easily fit into one page */ - WARN_ON_ONCE(seq_buf_has_overflowed(&s)); + WARN_ON_ONCE(seq_buf_has_overflowed(s)); } #define K(x) ((x) << (PAGE_SHIFT-10)) @@ -1642,6 +1639,7 @@ void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg) { /* Use static buffer, for the caller is holding oom_lock. */ static char buf[PAGE_SIZE]; + struct seq_buf s; lockdep_assert_held(&oom_lock); @@ -1664,8 +1662,9 @@ void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg) pr_info("Memory cgroup stats for "); pr_cont_cgroup_path(memcg->css.cgroup); pr_cont(":"); - memory_stat_format(memcg, buf, sizeof(buf)); - pr_info("%s", buf); + seq_buf_init(&s, buf, sizeof(buf)); + memory_stat_format(memcg, &s); + seq_buf_do_printk(&s, KERN_INFO); } /* @@ -6573,10 +6572,12 @@ static int memory_stat_show(struct seq_file *m, void *v) { struct mem_cgroup *memcg = mem_cgroup_from_seq(m); char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL); + struct seq_buf s; if (!buf) return -ENOMEM; - memory_stat_format(memcg, buf, PAGE_SIZE); + seq_buf_init(&s, buf, PAGE_SIZE); + memory_stat_format(memcg, &s); seq_puts(m, buf); kfree(buf); return 0; From patchwork Fri Apr 28 13:24:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yosry Ahmed X-Patchwork-Id: 13226461 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id DC02CC77B7C for ; Fri, 28 Apr 2023 13:24:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 605276B007D; Fri, 28 Apr 2023 09:24:18 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 58EF96B007E; Fri, 28 Apr 2023 09:24:18 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3B9F56B0080; Fri, 28 Apr 2023 09:24:18 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 276656B007D for ; Fri, 28 Apr 2023 09:24:18 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id F27CE120148 for ; Fri, 28 Apr 2023 13:24:17 +0000 (UTC) X-FDA: 80730868554.11.B08B8A0 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) by imf25.hostedemail.com (Postfix) with ESMTP id F361EA0017 for ; Fri, 28 Apr 2023 13:24:14 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=jcuVTOAp; spf=pass (imf25.hostedemail.com: domain of 3_chLZAoKCOYgWaZgIPUMLOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--yosryahmed.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=3_chLZAoKCOYgWaZgIPUMLOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--yosryahmed.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1682688255; a=rsa-sha256; cv=none; b=BvZIhQeiC09MvOouZNgmjOqAAx4EoioLkOYd1ouoTOhJTYMo8UCtdvNeV09YbmQcVfZV6/ yMZh4Cq4/0MmpezvEM+8UE76bPVMHGAzaA15+xxQxBJY2GkrwEecsVZY+E7BegfInuQ0jB YC37O55j9CeVgN7q+CNkgCkf2dvPDHM= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=jcuVTOAp; spf=pass (imf25.hostedemail.com: domain of 3_chLZAoKCOYgWaZgIPUMLOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--yosryahmed.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=3_chLZAoKCOYgWaZgIPUMLOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--yosryahmed.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1682688255; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=gCrHQjiS2fwiby7dz0V9ThMkUe63uEws1Bin2T2dpU8=; b=l0F2DelgH1nHxBIMGerOxJRtM9qBuNsObnqdMJ/g7+qb9heKrpY8ndnWHBfE6TRx4LxhRX JSSuVyFtY+KKP31UdpoNYQSESIk30fhXVprSrVuJo1RboEKOAbkDFueMsyKoupbeZ5m2Qv Wfjrc+SEeerneLGr23X0VbzQWGbuFsI= Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-5212ed3b16eso5914868a12.0 for ; Fri, 28 Apr 2023 06:24:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1682688254; x=1685280254; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=gCrHQjiS2fwiby7dz0V9ThMkUe63uEws1Bin2T2dpU8=; b=jcuVTOAp1c8K+ch7YCMLi+8POwhTwb1WrUalORmat2684E/X82MLP/H/sTNZiGTSzw ILJbHonyleAOPNozrhCp7XJpKzpTbzSV2WanXyhxQyxv5lSFZW8pMKziOeeK25UM/lM3 JtO2LiFUAPtV+zJkr/lmiV+hDnMAOdwrsD7W9rNnMigwvNIYtIDxnNjAK3lyudpZp5yI 5vpaP0vtG6m4sW2kgSy3vvkx/O8FeePG6gnTT8455Z1wkWEJFKZg0VnC7g7BQBECbTSk 07ULhu3kIczPuOMcJkwFO/y0wcnsFUVJfVg87WLuR8H+9rMQZ0u8212WdRLWh+a/t1bT beJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682688254; x=1685280254; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=gCrHQjiS2fwiby7dz0V9ThMkUe63uEws1Bin2T2dpU8=; b=Cwwn+XXDrG01QE5vmHAsmsdKHyCxm2t7yLzJnCzeL6AOpbAk/ZhDjWZWS1HQCvy8D3 gB1TMdOh/TwnZfMHFiFAKpEUeUBXEGPGkrUg3ROpWxn04+c4HxLi6B5+s38pXdBxcPTQ pveDkPKO7X1yHa+0hF6evEKdyjKxv7UBSg6mDSC9Rgya2tcNwp4c0JPxNFSFW8Itgj0X quxX0DZfS3ecjcS64abA7LEnTHT5u+/sh2hxC+4JWG2Q2yA2wMHvIa35EdZ6a9f0hrc6 T8RG487nplDowtyEcsLI8HdGQpx1dWW/WEi23ZHyvTbrDQCE8fBjvwVN+qHk3N7FVWKt 2aQA== X-Gm-Message-State: AC+VfDydxHU/suosUt86Z6miJqu0Z/qR2Aee7d2nDJd44Xqo1NQC1yo/ dr5quCSYzH+3JbV5t6VYuCg3gYGqACy/4GQY X-Google-Smtp-Source: ACHHUZ6Q1iaeTMc7znbuRU46RBkgJ3r/GzmuoUGlNK1hEg/1kqgAXN7zKR88/FXgEDBYkLlt9aTGSyL2pZdAjcsz X-Received: from yosry.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2327]) (user=yosryahmed job=sendgmr) by 2002:a17:902:b289:b0:19f:1d62:4393 with SMTP id u9-20020a170902b28900b0019f1d624393mr1511380plr.7.1682688253988; Fri, 28 Apr 2023 06:24:13 -0700 (PDT) Date: Fri, 28 Apr 2023 13:24:06 +0000 In-Reply-To: <20230428132406.2540811-1-yosryahmed@google.com> Mime-Version: 1.0 References: <20230428132406.2540811-1-yosryahmed@google.com> X-Mailer: git-send-email 2.40.1.495.gc816e09b53d-goog Message-ID: <20230428132406.2540811-3-yosryahmed@google.com> Subject: [PATCH v2 2/2] memcg: dump memory.stat during cgroup OOM for v1 From: Yosry Ahmed To: Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Andrew Morton Cc: Muchun Song , Sergey Senozhatsky , Steven Rostedt , Petr Mladek , Chris Li , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Yosry Ahmed X-Rspam-User: X-Rspamd-Queue-Id: F361EA0017 X-Rspamd-Server: rspam01 X-Stat-Signature: 89td7w8q3xbw3mdnnr3ti4w11zb5y5dt X-HE-Tag: 1682688254-310316 X-HE-Meta: U2FsdGVkX1++RsCKuc4JBy13LJv08JEKt62PFFeCqX06CRBkEAdxvrjdd/5AqDwugh9EwP7qMlUnNN2sJco7mZ0oq2RINsrCZv75VmMAh6Jyag6zn6QPU5QG4nJk1YPqs6yK7d7+LQgH3X/B9wXRlahhrjjEvj2vfl/DvtdZ1uvqq/vQkKsYG5c8+UiPOvwn/09ZLwge/+JBV/As4vI2l8xvkjjLUs9zzH+MIQRtVulUI7SQRjv5/yO5m+jz2GQta7NOcLqLO1brIySmYuSbjKA/fQ0h/jWbhwRujo5aeHtZaHDqJx8jZPRxFPB/5SjjmxHKVuHrAhzW85r++zBAbYams4keEFtPDLj1G7bAc03jaz81xioRWKCE54FfHOgjLIV9bXpbkMAxIy6A9qrdCQ0jFuW6YMLNpyssFqXEQl+8nZHwUoLIS76KBsmpFM86rPBiJNSvTz5DiLivmyZnse6N45nk1iOK1/pYJd4JAmvO58/bxy8uNOHTGg4GJvPPIDz5tQkJ6lo1Q9KP3zST5IAWxOAxcFahh1sY3h/8dfcnFL905mfPzRXEICankDXkfMu2hORw8up2eo2mR8CP49vnf8L/DhYlVlCmZeVHw+C62dcnOQsn8wXYTPpNWzcGuKI04ls9Ww6+kNajvjYQIJMpp9rWDaQN2Oqx2dX0ZQfdxt9bLHZZXj1rZGk+hkI6EDX0l6gu/MDY7BZvQ8gh4nMzmBomrjmDjMNHr80teeQ9PDA28bNrBkuSXSoQBjSfmE8qPI6b6wkDwRxW+nGYNk4KNNsbHlesBy5UJnJeWRh9pKybp3anicAVCFDLckuZ+n50RjBmAWSeuM2zZGPy5vF8+IJ7lb4CI00PnZ3nQvK2MFhmBNAlsyhAOagKnZzSZ9z652IKB11aB2UPWhXo6cnvnkswxef64YTlWzc/s2hgvgGIYFFu9VJSFmfmENNJF4A7CU1qAC655TTPd0G OLFSCG4n 2sBxjyjeu18X7WJPhot+X2qPKoqYWEe0LL31UQoCNa8/RvLODjaPMX5Vdxnd/7hWp18lLje8GjXJbbkT6vDbFEICnR46v3pIgU3GTCA4yLKZZdRnc4hSxw45vz0qArw+Pd/WV40Nn4fDx+PfLme+xQTS1fojxqDspdEwSKkXxi8XZpNxrY29AP9S6WklXqzwFVci9esLkAdLwhjn0KAZNvA28dc1TVBKdrITZbz3SvA5mdvjj7g8N65d2WoyspVXubEhzKmdnJUvLKkLYwQrHqHPl2Vgd/02SHaGJE0oAgZG7lXaHTNcLaJZzr4FnbCn7EG5qCfnMmBIHxE9t4yH2M+fSzxGZyXq944179E3IuJERanOA5AcJdW7UieTucB/+aP5i/pHzlJMdzvm53E6g83kSM9QtNgw/AeUuewOhuJ/J8GZIekyMGDbAsqUDKWJpEXJPI1WsVPMJDGwmPRITKeVdoQOoDJO1MLRfnW26k00SzrV7Zb5ikO/ibWvDUKyqtbEFHIbM0s8cyg/y/RT+Vgr75JimbL8PGQ/XNZUuVRZhKFyxHz/Se9NW+ZWdAnk+XJFmiCng8yNaLNANhxtUxKqK3zjJUu5dKg4FikYfhm+utRkyTHhadwn870vV90IwIqho4Qj7kre89U8= 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: Commit c8713d0b2312 ("mm: memcontrol: dump memory.stat during cgroup OOM") made sure we dump all the stats in memory.stat during a cgroup OOM, but it also introduced a slight behavioral change. The code used to print the non-hierarchical v1 cgroup stats for the entire cgroup subtree, now it only prints the v2 cgroup stats for the cgroup under OOM. For cgroup v1 users, this introduces a few problems: (a) The non-hierarchical stats of the memcg under OOM are no longer shown. (b) A couple of v1-only stats (e.g. pgpgin, pgpgout) are no longer shown. (c) We show the list of cgroup v2 stats, even in cgroup v1. This list of stats is not tracked with v1 in mind. While most of the stats seem to be working on v1, there may be some stats that are not fully or correctly tracked. Although OOM log is not set in stone, we should not change it for no reason. When upgrading the kernel version to a version including commit c8713d0b2312 ("mm: memcontrol: dump memory.stat during cgroup OOM"), these behavioral changes are noticed in cgroup v1. The fix is simple. Commit c8713d0b2312 ("mm: memcontrol: dump memory.stat during cgroup OOM") separated stats formatting from stats display for v2, to reuse the stats formatting in the OOM logs. Do the same for v1. Move the v2 specific formatting from memory_stat_format() to memcg_stat_format(), add memcg1_stat_format() for v1, and make memory_stat_format() select between them based on cgroup version. Since memory_stat_show() now works for both v1 & v2, drop memcg_stat_show(). Signed-off-by: Yosry Ahmed Acked-by: Michal Hocko Acked-by: Shakeel Butt --- mm/memcontrol.c | 60 ++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 5922940f92c9..2b492f8d540c 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1551,7 +1551,7 @@ static inline unsigned long memcg_page_state_output(struct mem_cgroup *memcg, return memcg_page_state(memcg, item) * memcg_page_state_unit(item); } -static void memory_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) +static void memcg_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) { int i; @@ -1604,6 +1604,17 @@ static void memory_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) WARN_ON_ONCE(seq_buf_has_overflowed(s)); } +static void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s); + +static void memory_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) +{ + if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) + memcg_stat_format(memcg, s); + else + memcg1_stat_format(memcg, s); + WARN_ON_ONCE(seq_buf_has_overflowed(s)); +} + #define K(x) ((x) << (PAGE_SHIFT-10)) /** * mem_cgroup_print_oom_context: Print OOM information relevant to @@ -4078,9 +4089,8 @@ static const unsigned int memcg1_events[] = { PGMAJFAULT, }; -static int memcg_stat_show(struct seq_file *m, void *v) +static void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) { - struct mem_cgroup *memcg = mem_cgroup_from_seq(m); unsigned long memory, memsw; struct mem_cgroup *mi; unsigned int i; @@ -4095,18 +4105,18 @@ static int memcg_stat_show(struct seq_file *m, void *v) if (memcg1_stats[i] == MEMCG_SWAP && !do_memsw_account()) continue; nr = memcg_page_state_local(memcg, memcg1_stats[i]); - seq_printf(m, "%s %lu\n", memcg1_stat_names[i], + seq_buf_printf(s, "%s %lu\n", memcg1_stat_names[i], nr * memcg_page_state_unit(memcg1_stats[i])); } for (i = 0; i < ARRAY_SIZE(memcg1_events); i++) - seq_printf(m, "%s %lu\n", vm_event_name(memcg1_events[i]), - memcg_events_local(memcg, memcg1_events[i])); + seq_buf_printf(s, "%s %lu\n", vm_event_name(memcg1_events[i]), + memcg_events_local(memcg, memcg1_events[i])); for (i = 0; i < NR_LRU_LISTS; i++) - seq_printf(m, "%s %lu\n", lru_list_name(i), - memcg_page_state_local(memcg, NR_LRU_BASE + i) * - PAGE_SIZE); + seq_buf_printf(s, "%s %lu\n", lru_list_name(i), + memcg_page_state_local(memcg, NR_LRU_BASE + i) * + PAGE_SIZE); /* Hierarchical information */ memory = memsw = PAGE_COUNTER_MAX; @@ -4114,11 +4124,11 @@ static int memcg_stat_show(struct seq_file *m, void *v) memory = min(memory, READ_ONCE(mi->memory.max)); memsw = min(memsw, READ_ONCE(mi->memsw.max)); } - seq_printf(m, "hierarchical_memory_limit %llu\n", - (u64)memory * PAGE_SIZE); + seq_buf_printf(s, "hierarchical_memory_limit %llu\n", + (u64)memory * PAGE_SIZE); if (do_memsw_account()) - seq_printf(m, "hierarchical_memsw_limit %llu\n", - (u64)memsw * PAGE_SIZE); + seq_buf_printf(s, "hierarchical_memsw_limit %llu\n", + (u64)memsw * PAGE_SIZE); for (i = 0; i < ARRAY_SIZE(memcg1_stats); i++) { unsigned long nr; @@ -4126,19 +4136,19 @@ static int memcg_stat_show(struct seq_file *m, void *v) if (memcg1_stats[i] == MEMCG_SWAP && !do_memsw_account()) continue; nr = memcg_page_state(memcg, memcg1_stats[i]); - seq_printf(m, "total_%s %llu\n", memcg1_stat_names[i], + seq_buf_printf(s, "total_%s %llu\n", memcg1_stat_names[i], (u64)nr * memcg_page_state_unit(memcg1_stats[i])); } for (i = 0; i < ARRAY_SIZE(memcg1_events); i++) - seq_printf(m, "total_%s %llu\n", - vm_event_name(memcg1_events[i]), - (u64)memcg_events(memcg, memcg1_events[i])); + seq_buf_printf(s, "total_%s %llu\n", + vm_event_name(memcg1_events[i]), + (u64)memcg_events(memcg, memcg1_events[i])); for (i = 0; i < NR_LRU_LISTS; i++) - seq_printf(m, "total_%s %llu\n", lru_list_name(i), - (u64)memcg_page_state(memcg, NR_LRU_BASE + i) * - PAGE_SIZE); + seq_buf_printf(s, "total_%s %llu\n", lru_list_name(i), + (u64)memcg_page_state(memcg, NR_LRU_BASE + i) * + PAGE_SIZE); #ifdef CONFIG_DEBUG_VM { @@ -4153,12 +4163,10 @@ static int memcg_stat_show(struct seq_file *m, void *v) anon_cost += mz->lruvec.anon_cost; file_cost += mz->lruvec.file_cost; } - seq_printf(m, "anon_cost %lu\n", anon_cost); - seq_printf(m, "file_cost %lu\n", file_cost); + seq_buf_printf(s, "anon_cost %lu\n", anon_cost); + seq_buf_printf(s, "file_cost %lu\n", file_cost); } #endif - - return 0; } static u64 mem_cgroup_swappiness_read(struct cgroup_subsys_state *css, @@ -4998,6 +5006,8 @@ static int mem_cgroup_slab_show(struct seq_file *m, void *p) } #endif +static int memory_stat_show(struct seq_file *m, void *v); + static struct cftype mem_cgroup_legacy_files[] = { { .name = "usage_in_bytes", @@ -5030,7 +5040,7 @@ static struct cftype mem_cgroup_legacy_files[] = { }, { .name = "stat", - .seq_show = memcg_stat_show, + .seq_show = memory_stat_show, }, { .name = "force_empty",