From patchwork Tue Feb 8 00:05:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Waiman Long X-Patchwork-Id: 12737957 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 C957BC433F5 for ; Tue, 8 Feb 2022 00:06:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 148CF6B007D; Mon, 7 Feb 2022 19:06:45 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 0F5C36B007E; Mon, 7 Feb 2022 19:06:45 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E63BF8D0001; Mon, 7 Feb 2022 19:06:44 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0031.hostedemail.com [216.40.44.31]) by kanga.kvack.org (Postfix) with ESMTP id D7CAD6B007D for ; Mon, 7 Feb 2022 19:06:44 -0500 (EST) Received: from smtpin17.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 8A71891ACD for ; Tue, 8 Feb 2022 00:06:44 +0000 (UTC) X-FDA: 79117671528.17.EA04F49 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf05.hostedemail.com (Postfix) with ESMTP id 40B5F100005 for ; Tue, 8 Feb 2022 00:06:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1644278803; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PV5Mmr2VlS4HwOkDqkagpZEdfNnA+PNHZfxNlSNeOwY=; b=GPr0mWglKhEWXyJH8IbNkaBSVzYxZJQrTAns5la+23WYkjY0NMUkZ9s3n7y6oaWva13q5e SWbGh1Sh33VF1cs+8gh8hIrMuW+GPY0+afykd9q+QLLb5DkDST1c4sCL5XjOqNp27xb82c 2zX4UFyeLEDTtXrF/IcW86wWKCMHA1Y= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-211-_M34AWNBMSe7Z7hE3yHh8Q-1; Mon, 07 Feb 2022 19:06:38 -0500 X-MC-Unique: _M34AWNBMSe7Z7hE3yHh8Q-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id ECB0018397A7; Tue, 8 Feb 2022 00:06:35 +0000 (UTC) Received: from llong.com (unknown [10.22.32.15]) by smtp.corp.redhat.com (Postfix) with ESMTP id C63395C2F1; Tue, 8 Feb 2022 00:06:01 +0000 (UTC) From: Waiman Long To: Johannes Weiner , Michal Hocko , Vladimir Davydov , Andrew Morton , Petr Mladek , Steven Rostedt , Sergey Senozhatsky , Andy Shevchenko , Rasmus Villemoes Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, linux-mm@kvack.org, Ira Weiny , Mike Rapoport , David Rientjes , Roman Gushchin , Rafael Aquini , Waiman Long , Mike Rapoport Subject: [PATCH v5 3/4] mm/page_owner: Print memcg information Date: Mon, 7 Feb 2022 19:05:31 -0500 Message-Id: <20220208000532.1054311-4-longman@redhat.com> In-Reply-To: <20220208000532.1054311-1-longman@redhat.com> References: <20220208000532.1054311-1-longman@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=GPr0mWgl; spf=none (imf05.hostedemail.com: domain of longman@redhat.com has no SPF policy when checking 170.10.129.124) smtp.mailfrom=longman@redhat.com; dmarc=pass (policy=none) header.from=redhat.com X-Stat-Signature: gm5yagab3gabgwy9i1mxd3nwjmzn1s8o X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 40B5F100005 X-Rspam-User: X-HE-Tag: 1644278804-395316 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: It was found that a number of dying 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 dying 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 dying memcgs, the page_owner feature is extended to print memory cgroup information especially whether the cgroup is dying or not. RCU read lock is taken when memcg is being accessed to make sure that it won't be freed. Signed-off-by: Waiman Long Acked-by: David Rientjes Acked-by: Roman Gushchin Acked-by: Mike Rapoport --- mm/page_owner.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/mm/page_owner.c b/mm/page_owner.c index 28dac73e0542..d4c311455753 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include "internal.h" @@ -325,6 +326,47 @@ void pagetypeinfo_showmixedcount_print(struct seq_file *m, seq_putc(m, '\n'); } +/* + * Looking for memcg information and print it out + */ +static inline int print_page_owner_memcg(char *kbuf, size_t count, int ret, + struct page *page) +{ +#ifdef CONFIG_MEMCG + unsigned long memcg_data; + struct mem_cgroup *memcg; + bool dying; + + rcu_read_lock(); + memcg_data = READ_ONCE(page->memcg_data); + if (!memcg_data) + goto out_unlock; + + if (memcg_data & MEMCG_DATA_OBJCGS) + ret += scnprintf(kbuf + ret, count - ret, + "Slab cache page\n"); + + memcg = page_memcg_check(page); + if (!memcg) + goto out_unlock; + + dying = (memcg->css.flags & CSS_DYING); + ret += scnprintf(kbuf + ret, count - ret, + "Charged %sto %smemcg ", + PageMemcgKmem(page) ? "(via objcg) " : "", + dying ? "dying " : ""); + + /* Write cgroup name directly into kbuf */ + cgroup_name(memcg->css.cgroup, kbuf + ret, count - ret); + ret += strlen(kbuf + ret); + ret += scnprintf(kbuf + ret, count - ret, "\n"); +out_unlock: + rcu_read_unlock(); +#endif /* CONFIG_MEMCG */ + + return ret; +} + static ssize_t print_page_owner(char __user *buf, size_t count, unsigned long pfn, struct page *page, struct page_owner *page_owner, @@ -365,6 +407,8 @@ print_page_owner(char __user *buf, size_t count, unsigned long pfn, migrate_reason_names[page_owner->last_migrate_reason]); } + ret = print_page_owner_memcg(kbuf, count, ret, page); + ret += snprintf(kbuf + ret, count - ret, "\n"); if (ret >= count) goto err;