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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB691CF07BF for ; Thu, 10 Oct 2024 08:28:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EBE196B0085; Thu, 10 Oct 2024 04:28:32 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E6DDD6B0088; Thu, 10 Oct 2024 04:28:32 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D0E0E6B0089; Thu, 10 Oct 2024 04:28:32 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id B27986B0085 for ; Thu, 10 Oct 2024 04:28:32 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 9520212043C for ; Thu, 10 Oct 2024 08:28:29 +0000 (UTC) X-FDA: 82657016064.08.250EEEB Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) by imf10.hostedemail.com (Postfix) with ESMTP id 750CAC0006 for ; Thu, 10 Oct 2024 08:28:29 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=oRDKzE43; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=53PUQ0rF; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=oRDKzE43; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=53PUQ0rF; spf=pass (imf10.hostedemail.com: domain of vbabka@suse.cz designates 195.135.223.130 as permitted sender) smtp.mailfrom=vbabka@suse.cz; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1728548773; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=8/L7CAxlxLfFtodFuR62q09RQ2tZ8GHVhaM0988R3ZM=; b=kzAmhuQXTfe+sW/8sPTWlY5GFW+66Ho7GAAxgVSZjNqEqGT2MomOrPc/xr0HHH27SF7JaI 5QpL+7JKo6J2MzSSnBb/DcKGUmkQnsgBPTQ4+yjvjmEG/QavJExt9RNLFllIH6AeFqZI9W 7HByxVs8+V9A71+j+H4kK+JKDpVtUVk= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1728548773; a=rsa-sha256; cv=none; b=8mIxAIktxZ2V5PRP5fibP0ZozLEgsF++NESLFg+0ZWdUeikAk6GjDE8u9wt31rTV2y1Ihw XXN5a5XQ3EitYIX6QoSlMXFK0GIw6T2Wf4dSv0Zs8hbbFNThpWeX9khsZQVJzOoowT5cVb TyY2kE/GOCIbVsIf2aURRHbcvZyf6S0= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=oRDKzE43; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=53PUQ0rF; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=oRDKzE43; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=53PUQ0rF; spf=pass (imf10.hostedemail.com: domain of vbabka@suse.cz designates 195.135.223.130 as permitted sender) smtp.mailfrom=vbabka@suse.cz; dmarc=none Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 0966721E8B; Thu, 10 Oct 2024 08:28:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1728548908; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8/L7CAxlxLfFtodFuR62q09RQ2tZ8GHVhaM0988R3ZM=; b=oRDKzE43myaaWVSgzdlGG8sOoDjMuEFUJLR6QeFr9kFFgYfph/AxgXksLUAhJXlY4xEqsj pE/fVLZeufD5YHo4E67otfAYXQ/srB9/2eKQzDgj3DKhWMhfSGRm4MmEc+8jwNkyI7b6Un 8MTxfyy7MnF5Utk+xtlTx1fIVyjOVJ0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1728548908; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8/L7CAxlxLfFtodFuR62q09RQ2tZ8GHVhaM0988R3ZM=; b=53PUQ0rFvxdqVlmPcr49ZHE02cZkM2EDwNRk2QDxA4rw/FrqR4/zEMw3qtC4kyrgAjGe0z Br6GG7QR/FRKBjDA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1728548908; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8/L7CAxlxLfFtodFuR62q09RQ2tZ8GHVhaM0988R3ZM=; b=oRDKzE43myaaWVSgzdlGG8sOoDjMuEFUJLR6QeFr9kFFgYfph/AxgXksLUAhJXlY4xEqsj pE/fVLZeufD5YHo4E67otfAYXQ/srB9/2eKQzDgj3DKhWMhfSGRm4MmEc+8jwNkyI7b6Un 8MTxfyy7MnF5Utk+xtlTx1fIVyjOVJ0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1728548908; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8/L7CAxlxLfFtodFuR62q09RQ2tZ8GHVhaM0988R3ZM=; b=53PUQ0rFvxdqVlmPcr49ZHE02cZkM2EDwNRk2QDxA4rw/FrqR4/zEMw3qtC4kyrgAjGe0z Br6GG7QR/FRKBjDA== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id E1E1E1370C; Thu, 10 Oct 2024 08:28:27 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id /r9lNiuQB2fybgAAD6G6ig (envelope-from ); Thu, 10 Oct 2024 08:28:27 +0000 Message-ID: Date: Thu, 10 Oct 2024 10:28:30 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] vmscan: add a vmscan event for reclaim_pages To: Jaewon Kim , sj@kernel.org, minchan@kernel.org, kaleshsingh@google.com, akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, jaewon31.kim@gmail.com References: <20241009093124.3647359-1-jaewon31.kim@samsung.com> From: Vlastimil Babka Content-Language: en-US In-Reply-To: <20241009093124.3647359-1-jaewon31.kim@samsung.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Rspamd-Action: no action X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 750CAC0006 X-Stat-Signature: 64s86kf1ddjwnwzxjtpqegsk7ow75rwk X-HE-Tag: 1728548909-254608 X-HE-Meta: U2FsdGVkX1+cGIZgFBh02nka2IfJ4Kp0K6klc5Y6b+YwhANyKSig4QjnUW9+nAg/mGSYdVdvvztwf6FvcxDw6gJjW1OHw8d6HjywQ9j5+fScY/Z6O0sFGJLJqeqxuCwOEiyCdcaE/w1A3ni5jtK+N4hIp+VxByDsHttivDtjcllBPUk68hKIlC7rYgQOpVQc7Jts0c/ZuTd0DbwP2PEEPjkmqggn3Ko0IflfPuoGUk7Fu8Fh61CqUi3NGHm3dYsyN3Wxw29bW6g46o/KUry8Y7ATR+O0LcZ7mTzaQAlDDrjq5hVnjGf4BJoWHG9Q3Hb6dis+yVaV9yoCtdDu64qphe7TjWK0VqdcyJjspO17nHAh1kkk6HqZMC5XDUX7/OmNGNk0HA4JHunlm6hBrPfkiWvxvbYATZn7SF9RyY3aC3cHdtgT8ItLn+jdQ41N6ykc2OuFgwONnXYCtMdgL1/IhRJyuOwZkb0FuTYqxakgQxWIV0/B2aXpmzZlrj5CTLcf92RY8/9f/kmZjTSXN+fPfR1DdxdGuu+IRt6ShE6md41iEcNsRKYw6pKunbz/4oTyvFu03PlDCAZRBcuow3jVQe4L0LkSx0pt6e6GvsayHt4CkBqrspBKC/VrjRa6rZxYRRv2VkYnz2ogQBz+Za7XeY69LA+NItV2PLS/+YgpQJJOQMVqCFLZFSdS5rDzvtksDGTScLf9GJs+gEj7ITU9L+8DIbCmNUrLT4DAgT+YoZbRNKWJn++MwBFxHgxNEckekXg3S1iHasJR5zvQTmxPTBkpTlo6hhrJqkaESDiQ8JO+5rVmQusFQr70bYbNX1eyaheQHLRdefROhAkLQkQOi0cWPNWViTUuAfUemCZrcNtix8P8D3VEa9CQpMZuSmgY6AO8+HtMUeEPlaKzWtUmPS64fRYHF2+Zcxcf4Zx/1tiQDfGdtK3MgAFrq8jyrq9OwU8zss4qbPKcbPaK1yJ 9UCE/kwr TNi4MlCFqnoaDx8M1O4X7rW2Rgvaca+FJ/zHZs/0bqekVeHVq+WvmQJOJF6Etr2Xf4JkRYh8wo5T9BUXGZelcwyKdvhJZoK7m1kY93nCTpgQaHMzFUIVp4T3ToEY2Rnj8Et6QZEn5QA0Fbklj/pSAgszFx9mcjZ67jCLLbgOxnYt2DCFWAHcwqSLaK+gt6TvNVnU/402Ti+QR8xOuuBjoRS67YNpHOmRxfm7GhMFwo/l/qUVPJf1v2bMIQN7WKMkqeObLQ1lFAqbJCzUZDhZq4zMeLfABifyMWhrvzpV7cId5YWyOXVZdIAsmGt2l0cgc/BHVDjpi+KjgRgnhC6YZ5MiVrqaGf4py5BtIIu5x03kpsqJGwO917vrjCFHUnQTdJ9VxKv78Q7bDXj0exBZbt/DOGg4XmHfvR4SmGN7kSplpYZQ= 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: List-Subscribe: List-Unsubscribe: On 10/9/24 11:31 AM, Jaewon Kim wrote: > The reclaim_folio_list uses a dummy reclaim_stat and is not being > used. To know the memory stat, add a new trace event. This is useful how > how many pages are not reclaimed or why. > > This is an example. > mm_vmscan_reclaim_pages: nr_scanned=17 nr_reclaimed=17 nr_dirty=0 nr_writeback=0 nr_congested=0 nr_immediate=0 nr_activate_anon=0 nr_activate_file=0 nr_ref_keep=0 nr_unmap_fail=0 > > Currenlty reclaim_folio_list is only called by reclaim_pages, and > reclaim_pages is used by damon and madvise. In the latest Android, > reclaim_pages is also used by shmem to reclaim all pages in a > address_space. > > Signed-off-by: Jaewon Kim > --- > include/trace/events/vmscan.h | 41 +++++++++++++++++++++++++++++++++++ > mm/vmscan.c | 40 +++++++++++++++++++++++++++++----- > 2 files changed, 76 insertions(+), 5 deletions(-) > > diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h > index 1a488c30afa5..509110a12fa5 100644 > --- a/include/trace/events/vmscan.h > +++ b/include/trace/events/vmscan.h > @@ -346,6 +346,47 @@ TRACE_EVENT(mm_vmscan_write_folio, > show_reclaim_flags(__entry->reclaim_flags)) > ); > > +TRACE_EVENT(mm_vmscan_reclaim_pages, > + > + TP_PROTO(unsigned long nr_scanned, unsigned long nr_reclaimed, > + struct reclaim_stat *stat), > + > + TP_ARGS(nr_scanned, nr_reclaimed, stat), > + > + TP_STRUCT__entry( > + __field(unsigned long, nr_scanned) > + __field(unsigned long, nr_reclaimed) > + __field(unsigned long, nr_dirty) > + __field(unsigned long, nr_writeback) > + __field(unsigned long, nr_congested) > + __field(unsigned long, nr_immediate) > + __field(unsigned int, nr_activate0) > + __field(unsigned int, nr_activate1) > + __field(unsigned long, nr_ref_keep) > + __field(unsigned long, nr_unmap_fail) > + ), > + > + TP_fast_assign( > + __entry->nr_scanned = nr_scanned; > + __entry->nr_reclaimed = nr_reclaimed; > + __entry->nr_dirty = stat->nr_dirty; > + __entry->nr_writeback = stat->nr_writeback; > + __entry->nr_congested = stat->nr_congested; > + __entry->nr_immediate = stat->nr_immediate; > + __entry->nr_activate0 = stat->nr_activate[0]; > + __entry->nr_activate1 = stat->nr_activate[1]; > + __entry->nr_ref_keep = stat->nr_ref_keep; > + __entry->nr_unmap_fail = stat->nr_unmap_fail; > + ), > + > + TP_printk("nr_scanned=%ld nr_reclaimed=%ld nr_dirty=%ld nr_writeback=%ld nr_congested=%ld nr_immediate=%ld nr_activate_anon=%d nr_activate_file=%d nr_ref_keep=%ld nr_unmap_fail=%ld", > + __entry->nr_scanned, __entry->nr_reclaimed, > + __entry->nr_dirty, __entry->nr_writeback, > + __entry->nr_congested, __entry->nr_immediate, > + __entry->nr_activate0, __entry->nr_activate1, > + __entry->nr_ref_keep, __entry->nr_unmap_fail) > +); > + > TRACE_EVENT(mm_vmscan_lru_shrink_inactive, > > TP_PROTO(int nid, > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 749cdc110c74..4776c42dfd2a 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -2126,9 +2126,9 @@ static void shrink_active_list(unsigned long nr_to_scan, > } > > static unsigned int reclaim_folio_list(struct list_head *folio_list, > - struct pglist_data *pgdat) > + struct pglist_data *pgdat, > + struct reclaim_stat *stat) > { > - struct reclaim_stat dummy_stat; > unsigned int nr_reclaimed; > struct folio *folio; > struct scan_control sc = { > @@ -2139,7 +2139,7 @@ static unsigned int reclaim_folio_list(struct list_head *folio_list, > .no_demotion = 1, > }; > > - nr_reclaimed = shrink_folio_list(folio_list, pgdat, &sc, &dummy_stat, true); > + nr_reclaimed = shrink_folio_list(folio_list, pgdat, &sc, stat, true); > while (!list_empty(folio_list)) { > folio = lru_to_folio(folio_list); > list_del(&folio->lru); > @@ -2149,16 +2149,40 @@ static unsigned int reclaim_folio_list(struct list_head *folio_list, > return nr_reclaimed; > } > > +static void reclaim_stat_add(struct reclaim_stat *stat_from, > + struct reclaim_stat *stat_to) > +{ > + int type; > + > + if (!trace_mm_vmscan_reclaim_pages_enabled()) > + return; > + > + stat_to->nr_dirty += stat_from->nr_dirty; > + stat_to->nr_unqueued_dirty += stat_from->nr_unqueued_dirty; > + stat_to->nr_congested += stat_from->nr_congested; > + stat_to->nr_writeback += stat_from->nr_writeback; > + stat_to->nr_immediate += stat_from->nr_immediate; > + stat_to->nr_pageout += stat_from->nr_pageout; > + for (type = 0; type < ANON_AND_FILE; type++) > + stat_to->nr_activate[type] += stat_from->nr_activate[type]; > + stat_to->nr_ref_keep += stat_from->nr_ref_keep; > + stat_to->nr_unmap_fail += stat_from->nr_unmap_fail; > + stat_to->nr_lazyfree_fail += stat_from->nr_lazyfree_fail; > +} Could we avoid this by using a single stat that just accumulates over multiple calls to reclaim_folio_list()? That means shrink_folio_list() would not do the initial memset(0) and it would be caller responsibility. AFAICS shrink_folio_list() only cares about these fields: pgactivate = stat->nr_activate[0] + stat->nr_activate[1]; in order to do count_vm_events(PGACTIVATE, pgactivate); Which could be adjusted to deal with accumulating stat - i.e. take an initial sum of the fields in stat and subtract from the final sum to get the delta. > unsigned long reclaim_pages(struct list_head *folio_list) > { > int nid; > + unsigned int nr_scanned = 0; > unsigned int nr_reclaimed = 0; > LIST_HEAD(node_folio_list); > unsigned int noreclaim_flag; > + struct reclaim_stat stat_total, stat_one; > > if (list_empty(folio_list)) > return nr_reclaimed; > > + memset(&stat_total, 0, sizeof(stat_total)); > noreclaim_flag = memalloc_noreclaim_save(); > > nid = folio_nid(lru_to_folio(folio_list)); > @@ -2168,14 +2192,20 @@ unsigned long reclaim_pages(struct list_head *folio_list) > if (nid == folio_nid(folio)) { > folio_clear_active(folio); > list_move(&folio->lru, &node_folio_list); > + nr_scanned += folio_nr_pages(folio); > continue; > } > > - nr_reclaimed += reclaim_folio_list(&node_folio_list, NODE_DATA(nid)); > + nr_reclaimed += reclaim_folio_list(&node_folio_list, > + NODE_DATA(nid), &stat_one); > + reclaim_stat_add(&stat_one, &stat_total); > nid = folio_nid(lru_to_folio(folio_list)); > } while (!list_empty(folio_list)); > > - nr_reclaimed += reclaim_folio_list(&node_folio_list, NODE_DATA(nid)); > + nr_reclaimed += reclaim_folio_list(&node_folio_list, NODE_DATA(nid), > + &stat_one); > + reclaim_stat_add(&stat_one, &stat_total); > + trace_mm_vmscan_reclaim_pages(nr_scanned, nr_reclaimed, &stat_total); > > memalloc_noreclaim_restore(noreclaim_flag); >