Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp659135pxb; Tue, 1 Feb 2022 07:53:39 -0800 (PST) X-Google-Smtp-Source: ABdhPJwqX0duO4ypF17EEI4dZ+KF2QnZzLjNPjyYwQ9C0g9FV/z6aaJ3cYfBdFGBjtix7b6oOQ2X X-Received: by 2002:a17:90b:1646:: with SMTP id il6mr2986147pjb.240.1643730819391; Tue, 01 Feb 2022 07:53:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643730819; cv=none; d=google.com; s=arc-20160816; b=KzhYWULijMBiL0/kl+X7F/QZBXX+hluF730vRp43CpkSdBkKfexvwSusvy1ZsUA4cz s3z/48r5QxTMihRLPsTC1KAL39roxi5HxHrWppWRWLurlmpZPsKyEaAXeJO4MgXrXgC+ kywycfZpn9rrkins2YuYXsth8Gp0oG5EXW1N2bI9fQEE1LMoR/PYBGhmhbAKmFWTIwE6 OeB5tGkxqypV4SOcCbsBwXdEZohAawLoHisXhtQpy78QhKlliOev5a5nBV1N8TJ3H3Cx L8r9Knf9cHIGMMR2yl1ikhE6NW7TysdvWRj9MkBuxxMc2xnTfH1ezo9yZ9VQKhMeYgQg T4wQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=gFfYneuXxxyIxBAM26QGb5mPJgkTqy82COvXmXoG2U4=; b=E3aHHFs03aB8sT4/Ym/yZiBxyWoKxVrYdSToiTwJuDPRMVb31C1YLczSLMReDw3des DPIkuLLnDf9Gf0kStgkG6YPGX6HVo9np6JusvSjLehoE7VpwqyOJA6wPC1+zWCso5WO4 zD8KuuyVfLVQOI0ohrP5+Xnlvbay33Fevgwl9yXK2IcDIWowZKM5rX9g+HCKzILKEmVX o4cZGN5wIPda6ngccrFvyvloCbt1zpABM2RFk9mSsbB6VdbBaLMYOKq+23dT4VtwCSa0 oJHHxGae7pZCwwBfd+uikpX5/JH1KUhW1iUK+tBXPfoYpCvOjKa2jIonfVVNr0cfwKeG 7cQg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@suse.com header.s=susede1 header.b=GMBKwIRj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=suse.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id mq10si3226611pjb.175.2022.02.01.07.53.27; Tue, 01 Feb 2022 07:53:39 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.com header.s=susede1 header.b=GMBKwIRj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=suse.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240711AbiAaJiy (ORCPT + 99 others); Mon, 31 Jan 2022 04:38:54 -0500 Received: from smtp-out2.suse.de ([195.135.220.29]:36172 "EHLO smtp-out2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238819AbiAaJix (ORCPT ); Mon, 31 Jan 2022 04:38:53 -0500 Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 82D841F381; Mon, 31 Jan 2022 09:38:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1643621932; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=gFfYneuXxxyIxBAM26QGb5mPJgkTqy82COvXmXoG2U4=; b=GMBKwIRjiio5uHYtjsHX5SKOBDrnxWSy8DukbeDOPJQleviNEbItB3o3m1N/LZjjEGZVAr rZJm32G3ziPltbFmd7NNMW1esOGj+61VxPiAimMbWMU0g9EkStqQpAYsPEgLmzCHMaECD1 h7SFZ8qG3T157yf1RvTbA0Qh25FCw8M= Received: from suse.cz (unknown [10.100.201.86]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by relay2.suse.de (Postfix) with ESMTPS id 802F1A3B84; Mon, 31 Jan 2022 09:38:51 +0000 (UTC) Date: Mon, 31 Jan 2022 10:38:51 +0100 From: Michal Hocko To: Waiman Long Cc: Johannes Weiner , Vladimir Davydov , Andrew Morton , Petr Mladek , Steven Rostedt , Sergey Senozhatsky , Andy Shevchenko , Rasmus Villemoes , linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, linux-mm@kvack.org, Ira Weiny , Rafael Aquini Subject: Re: [PATCH v2 3/3] mm/page_owner: Dump memcg information Message-ID: References: <20220129205315.478628-1-longman@redhat.com> <20220129205315.478628-4-longman@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220129205315.478628-4-longman@redhat.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat 29-01-22 15:53:15, Waiman Long wrote: > It was found that a number of offlined memcgs were not freed because > they were pinned by some charged pages that were present. Even "echo > 1 > /proc/sys/vm/drop_caches" wasn't able to free those pages. These > offlined but not freed memcgs tend to increase in number over time with > the side effect that percpu memory consumption as shown in /proc/meminfo > also increases over time. > > In order to find out more information about those pages that pin > offlined memcgs, the page_owner feature is extended to dump memory > cgroup information especially whether the cgroup is offlined or not. It is not really clear to me how this is supposed to be used. Are you really dumping all the pages in the system to find out offline memcgs? That looks rather clumsy to me. I am not against adding memcg information to the page owner output. That can be useful in other contexts. > Signed-off-by: Waiman Long > --- > mm/page_owner.c | 31 +++++++++++++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/mm/page_owner.c b/mm/page_owner.c > index 28dac73e0542..8dc5cd0fa227 100644 > --- a/mm/page_owner.c > +++ b/mm/page_owner.c > @@ -10,6 +10,7 @@ > #include > #include > #include > +#include > #include > > #include "internal.h" > @@ -331,6 +332,7 @@ print_page_owner(char __user *buf, size_t count, unsigned long pfn, > depot_stack_handle_t handle) > { > int ret, pageblock_mt, page_mt; > + unsigned long __maybe_unused memcg_data; > char *kbuf; > > count = min_t(size_t, count, PAGE_SIZE); > @@ -365,6 +367,35 @@ print_page_owner(char __user *buf, size_t count, unsigned long pfn, > migrate_reason_names[page_owner->last_migrate_reason]); > } > > +#ifdef CONFIG_MEMCG This really begs to be in a dedicated function. page_owner_print_memcg or something like that. > + /* > + * Look for memcg information and print it out > + */ > + memcg_data = READ_ONCE(page->memcg_data); > + if (memcg_data) { > + struct mem_cgroup *memcg = page_memcg_check(page); > + bool onlined; > + char name[80]; What does prevent memcg to go away and being reused for a different purpose? > + > + if (memcg_data & MEMCG_DATA_OBJCGS) > + ret += scnprintf(kbuf + ret, count - ret, > + "Slab cache page\n"); > + > + if (!memcg) > + goto copy_out; > + > + onlined = (memcg->css.flags & CSS_ONLINE); > + cgroup_name(memcg->css.cgroup, name, sizeof(name)); > + ret += scnprintf(kbuf + ret, count - ret, > + "Charged %sto %smemcg %s\n", > + PageMemcgKmem(page) ? "(via objcg) " : "", > + onlined ? "" : "offlined ", > + name); > + } > + > +copy_out: > +#endif -- Michal Hocko SUSE Labs