From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 941B6C4361B for ; Wed, 9 Dec 2020 16:38:31 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 233B322210 for ; Wed, 9 Dec 2020 16:38:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 233B322210 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 5A6346B00F2; Wed, 9 Dec 2020 11:38:30 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 5584F8D0028; Wed, 9 Dec 2020 11:38:30 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 46D398D001E; Wed, 9 Dec 2020 11:38:30 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0166.hostedemail.com [216.40.44.166]) by kanga.kvack.org (Postfix) with ESMTP id 315926B00F2 for ; Wed, 9 Dec 2020 11:38:30 -0500 (EST) Received: from smtpin05.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id DFFB9362C for ; Wed, 9 Dec 2020 16:38:29 +0000 (UTC) X-FDA: 77574301938.05.humor56_1d05678273f1 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin05.hostedemail.com (Postfix) with ESMTP id C20DF1801277A for ; Wed, 9 Dec 2020 16:38:29 +0000 (UTC) X-HE-Tag: humor56_1d05678273f1 X-Filterd-Recvd-Size: 6509 Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by imf34.hostedemail.com (Postfix) with ESMTP for ; Wed, 9 Dec 2020 16:38:29 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id C964EAB63; Wed, 9 Dec 2020 16:38:27 +0000 (UTC) Subject: Re: [PATCH v2] mm/page_owner: Record timestamp and pid To: Georgi Djakov , akpm@linux-foundation.org, linux-mm@kvack.org Cc: corbet@lwn.net, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, lmark@codeaurora.org References: <20201209125153.10533-1-georgi.djakov@linaro.org> From: Vlastimil Babka Message-ID: <20f7fb50-5e21-3ad8-50cd-81b56c9e45b1@suse.cz> Date: Wed, 9 Dec 2020 17:38:27 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 In-Reply-To: <20201209125153.10533-1-georgi.djakov@linaro.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit 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: On 12/9/20 1:51 PM, Georgi Djakov wrote: > From: Liam Mark > > Collect the time for each allocation recorded in page owner so that > allocation "surges" can be measured. > > Record the pid for each allocation recorded in page owner so that > the source of allocation "surges" can be better identified. > > The above is very useful when doing memory analysis. On a crash for > example, we can get this information from kdump (or ramdump) and parse > it to figure out memory allocation problems. Yes, I can imagine this to be useful. > Please note that on x86_64 this increases the size of struct page_owner > from 16 bytes to 32. That's the tradeoff, but it's not a functionality intended for production, so unless somebody says they need to enable page_owner for debugging and this increase prevents them from fitting into available memory, let's not complicate things with making this optional. > Signed-off-by: Liam Mark > Signed-off-by: Georgi Djakov Acked-by: Vlastimil Babka > --- > > v2: > - Improve the commit message (Andrew and Vlastimil) > - Update page_owner.rst with more recent object size information (Andrew) > - Use pid_t for the pid (Andrew) > - Print the info also in __dump_page_owner() (Vlastimil) > > v1: https://lore.kernel.org/r/20201112184106.733-1-georgi.djakov@linaro.org/ > > > Documentation/vm/page_owner.rst | 12 ++++++------ > mm/page_owner.c | 17 +++++++++++++---- > 2 files changed, 19 insertions(+), 10 deletions(-) > > diff --git a/Documentation/vm/page_owner.rst b/Documentation/vm/page_owner.rst > index 02deac76673f..cf7c0c361621 100644 > --- a/Documentation/vm/page_owner.rst > +++ b/Documentation/vm/page_owner.rst > @@ -41,17 +41,17 @@ size change due to this facility. > - Without page owner:: > > text data bss dec hex filename > - 40662 1493 644 42799 a72f mm/page_alloc.o > + 48392 2333 644 51369 c8a9 mm/page_alloc.o > > - With page owner:: > > text data bss dec hex filename > - 40892 1493 644 43029 a815 mm/page_alloc.o > - 1427 24 8 1459 5b3 mm/page_ext.o > - 2722 50 0 2772 ad4 mm/page_owner.o > + 48800 2445 644 51889 cab1 mm/page_alloc.o > + 6574 108 29 6711 1a37 mm/page_owner.o > + 1025 8 8 1041 411 mm/page_ext.o > > -Although, roughly, 4 KB code is added in total, page_alloc.o increase by > -230 bytes and only half of it is in hotpath. Building the kernel with > +Although, roughly, 8 KB code is added in total, page_alloc.o increase by > +520 bytes and less than half of it is in hotpath. Building the kernel with > page owner and turning it on if needed would be great option to debug > kernel memory problem. > > diff --git a/mm/page_owner.c b/mm/page_owner.c > index b735a8eafcdb..af464bb7fbe7 100644 > --- a/mm/page_owner.c > +++ b/mm/page_owner.c > @@ -10,6 +10,7 @@ > #include > #include > #include > +#include > > #include "internal.h" > > @@ -25,6 +26,8 @@ struct page_owner { > gfp_t gfp_mask; > depot_stack_handle_t handle; > depot_stack_handle_t free_handle; > + u64 ts_nsec; > + pid_t pid; > }; > > static bool page_owner_enabled = false; > @@ -172,6 +175,8 @@ static inline void __set_page_owner_handle(struct page *page, > page_owner->order = order; > page_owner->gfp_mask = gfp_mask; > page_owner->last_migrate_reason = -1; > + page_owner->pid = current->pid; > + page_owner->ts_nsec = local_clock(); > __set_bit(PAGE_EXT_OWNER, &page_ext->flags); > __set_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags); > > @@ -236,6 +241,8 @@ void __copy_page_owner(struct page *oldpage, struct page *newpage) > new_page_owner->last_migrate_reason = > old_page_owner->last_migrate_reason; > new_page_owner->handle = old_page_owner->handle; > + new_page_owner->pid = old_page_owner->pid; > + new_page_owner->ts_nsec = old_page_owner->ts_nsec; > > /* > * We don't clear the bit on the oldpage as it's going to be freed > @@ -349,9 +356,10 @@ print_page_owner(char __user *buf, size_t count, unsigned long pfn, > return -ENOMEM; > > ret = snprintf(kbuf, count, > - "Page allocated via order %u, mask %#x(%pGg)\n", > + "Page allocated via order %u, mask %#x(%pGg), pid %d, ts %llu ns\n", > page_owner->order, page_owner->gfp_mask, > - &page_owner->gfp_mask); > + &page_owner->gfp_mask, page_owner->pid, > + page_owner->ts_nsec); > > if (ret >= count) > goto err; > @@ -427,8 +435,9 @@ void __dump_page_owner(struct page *page) > else > pr_alert("page_owner tracks the page as freed\n"); > > - pr_alert("page last allocated via order %u, migratetype %s, gfp_mask %#x(%pGg)\n", > - page_owner->order, migratetype_names[mt], gfp_mask, &gfp_mask); > + pr_alert("page last allocated via order %u, migratetype %s, gfp_mask %#x(%pGg), pid %d, ts %llu\n", > + page_owner->order, migratetype_names[mt], gfp_mask, &gfp_mask, > + page_owner->pid, page_owner->ts_nsec); > > handle = READ_ONCE(page_owner->handle); > if (!handle) { >