All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: Usama Arif <usama.arif@linux.dev>
Cc: "David Hildenbrand" <david@kernel.org>,
	"Liam R. Howlett" <liam@infradead.org>,
	"Vlastimil Babka" <vbabka@kernel.org>,
	"Mike Rapoport" <rppt@kernel.org>,
	"Suren Baghdasaryan" <surenb@google.com>,
	"Michal Hocko" <mhocko@suse.com>,
	"David Rientjes" <rientjes@google.com>,
	"Shakeel Butt" <shakeel.butt@linux.dev>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Jann Horn" <jannh@google.com>,
	"Pedro Falcato" <pfalcato@suse.de>,
	"Matthew Wilcox (Oracle)" <willy@infradead.org>,
	"Jan Kara" <jack@suse.cz>, "Nhat Pham" <nphamcs@gmail.com>,
	"Johannes Weiner" <hannes@cmpxchg.org>, "Zi Yan" <ziy@nvidia.com>,
	"Matthew Brost" <matthew.brost@intel.com>,
	"Joshua Hahn" <joshua.hahnjy@gmail.com>,
	"Byungchul Park" <byungchul@sk.com>,
	"Gregory Price" <gourry@gourry.net>,
	"Ying Huang" <ying.huang@linux.alibaba.com>,
	"Alistair Popple" <apopple@nvidia.com>,
	"Kairui Song" <kasong@tencent.com>,
	"Balbir Singh" <balbirs@nvidia.com>,
	"Jérôme Glisse" <jglisse@redhat.com>,
	"Kiryl Shutsemau" <kas@kernel.org>,
	"Yu-cheng Yu" <yu-cheng.yu@intel.com>,
	"Dave Hansen" <dave.hansen@linux.intel.com>,
	"Dennis Zhou" <dennis@kernel.org>, "Tejun Heo" <tj@kernel.org>,
	"Christoph Lameter" <cl@gentwo.org>,
	"Peng Fan" <peng.fan@nxp.com>, "Josef Bacik" <jbacik@fb.com>,
	"Chris Mason" <mason@kernel.org>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	linux-fsdevel@vger.kernel.org,
	"Borislav Petkov (AMD)" <bp@alien8.de>,
	"Mark Brown" <broonie@kernel.org>,
	"Dennis Zhou (Facebook)" <dennisszhou@gmail.com>,
	"Rick Edgecombe" <rick.p.edgecombe@intel.com>
Subject: Re: [PATCH 03/13] mm: cachestat: restart the walk after each entry
Date: Thu, 12 Nov 2026 12:22:54 +0000	[thread overview]
Message-ID: <avWuxs25RmC6PvVZ@gremlin> (raw)
In-Reply-To: <9b795d3a-1818-4265-a364-58fba139c651@linux.dev>

On Wed, Nov 11, 2026 at 11:38:39PM +0000, Usama Arif wrote:
>
>
> On 11/11/2026 18:13, Lorenzo Stoakes (ARM) wrote:
> > From: Chris Mason <mason@kernel.org>
> >
> > cachestat() can leave cached pages out of its counts. This happens if
> > the entry that the call has just counted is replaced by a larger folio
> > that starts in the same XArray slot.
> >
> > The issue is that filemap_cachestat() walks the page cache under the RCU
> > read lock, so racing concurrent collapse/split is possible.
> >
> > Thus, an entry can be replaced immediately after the walk has returned
> > it. When that happens, the next xas_find() skips the sibling entries that
> > point to the slot of that entry, since ordinarily they belong to that
> > entry.
> >
> > However a concurrent collapse_file() or __filemap_add_folio() (when
> > replacing a shadow entry) can store a larger folio in the slot, in which
> > case the sibling entries belong to the new folio and the walk still skips
> > them.
> >
> > Consider:
> >
> >     cachestat                         collapse
> >     =========                         ========
> >     count a 64-page folio in slot 8
> >                                       store a 512-page folio in slot 8,
> >                                       with sibling entries in slots 9-15
> >     xas_find() starts at slot 8
> >     and skips slots 9-15
> >       /* 448 pages are never counted */
> >
> > Also consider:
> >
> >     filemap_cachestat()                  __filemap_add_folio()
> >     ===================                  =====================
> >     counts the shadow entry in slot 0
> >                                          slot 0: a folio of 32 pages
> >                                          slots 1-31: siblings of slot 0
> >     xas_find() skips slots 1-31
> >       /* 31 pages are never counted */
> >
> > Essentially the fact that large folios might be present means we cannot
> > safely continue the XArray walk, and must reset the iterator each time.
> >
> > Fixes: cf264e1329fb ("cachestat: implement cachestat syscall")
> > Signed-off-by: Chris Mason <mason@kernel.org>
> > [ ljs: squashed 2 commits, fixed up comment in code, and commit message ]
> > Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>

Oops I didn't even include a 'fix this by' even...

David/Andrew - as per Usama, could you add this to the end of the commit msg:

	Fix this by resetting the walk in each loop. This incurs a performance
	penalty, but given that only the RCU lock is held here, it can't be
	avoided.

> > ---
> >  mm/filemap.c | 7 ++++---
> >  1 file changed, 4 insertions(+), 3 deletions(-)
> >
> > diff --git a/mm/filemap.c b/mm/filemap.c
> > index 7c05e4fad081..c4e82891767b 100644
> > --- a/mm/filemap.c
> > +++ b/mm/filemap.c
> > @@ -4731,10 +4731,11 @@ static void filemap_cachestat(struct address_space *mapping,
> >  		if (folio_last_index >= last_index)
> >  			break;
> >
> > -		if (need_resched()) {
> > -			xas_set(&xas, curr_index);
> > +		/* Collapse or new folio spanning shadow entries needs reset. */
> > +		xas_set(&xas, curr_index);
> > +
>
> I imagine this will be a performance hit for the call, as each entry now
> needs a traversal from the xarray root. Might be good to callout in commit
> message. But is the right thing to do.

Yeah good point and I did try to find a way not to do that. But it's apparently
(says AI overlords) less bad than an xa_for_each() implementation :P

> Acked-by: Usama Arif <usama.arif@linux.dev>

Thanks!

--
Cheers, Lorenzo

  reply	other threads:[~2026-11-12 12:23 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-11 18:13 [PATCH 00/13] mm: batch of (urgentish?) fixes in oomk, cachestat, dev-migrate, percpu Lorenzo Stoakes (ARM)
2026-11-11 18:13 ` [PATCH 01/13] mm/mmap: free gathered pages before MMF_OOM_SKIP Lorenzo Stoakes (ARM)
2026-11-11 22:49   ` Usama Arif
2026-11-12 12:18     ` Lorenzo Stoakes (ARM)
2026-11-12 11:21   ` Pedro Falcato
2026-11-12 12:17     ` Lorenzo Stoakes (ARM)
2026-11-12 12:18       ` Lorenzo Stoakes (ARM)
2026-11-12 12:28         ` Pedro Falcato
2026-11-12 12:33           ` Lorenzo Stoakes (ARM)
2026-11-12 11:43   ` Michal Hocko
2026-11-12 12:14     ` Lorenzo Stoakes (ARM)
2026-11-12 12:48       ` Michal Hocko
2026-11-12 14:12         ` Michal Hocko
2026-11-12 14:27           ` Lorenzo Stoakes (ARM)
2026-11-12 16:59   ` Gregory Price (Meta)
2026-11-12 19:15     ` Lorenzo Stoakes (ARM)
2026-11-11 18:13 ` [PATCH 02/13] mm: cachestat: count each page only once Lorenzo Stoakes (ARM)
2026-11-11 23:26   ` Usama Arif
2026-11-12 11:27   ` Pedro Falcato
2026-11-12 13:30   ` Nhat Pham
2026-11-12 16:13   ` Johannes Weiner
2026-11-12 16:37   ` Gregory Price (Meta)
2026-11-11 18:13 ` [PATCH 03/13] mm: cachestat: restart the walk after each entry Lorenzo Stoakes (ARM)
2026-11-11 23:38   ` Usama Arif
2026-11-12 12:22     ` Lorenzo Stoakes (ARM) [this message]
2026-11-12 11:29   ` Pedro Falcato
2026-11-12 12:33   ` Nhat Pham
2026-11-12 16:15   ` Johannes Weiner
2026-11-12 16:40   ` Gregory Price (Meta)
2026-11-11 18:13 ` [PATCH 04/13] mm/migrate_device: allocate THP deferred split heads Lorenzo Stoakes (ARM)
2026-11-11 19:30   ` Kiryl Shutsemau
2026-11-11 19:40     ` David Hildenbrand (Arm)
2026-11-11 22:18       ` Andrew Morton
2026-11-11 23:02   ` Balbir Singh
2026-11-12 17:07   ` Gregory Price (Meta)
2026-11-12 18:16   ` sashiko-bot
2026-11-11 18:13 ` [PATCH 05/13] mm/migrate_device: don't collect a range twice Lorenzo Stoakes (ARM)
2026-11-12 17:15   ` Gregory Price (Meta)
2026-11-12 18:16   ` sashiko-bot
2026-11-11 18:13 ` [PATCH 06/13] mm/migrate_device: don't let go of the fault page Lorenzo Stoakes (ARM)
2026-11-12 17:56   ` Gregory Price (Meta)
2026-11-11 18:13 ` [PATCH 07/13] mm/migrate_device: look up fault folio after a split Lorenzo Stoakes (ARM)
2026-11-12 17:35   ` Gregory Price (Meta)
2026-11-12 19:12     ` Lorenzo Stoakes (ARM)
2026-11-11 18:13 ` [PATCH 08/13] mm/migrate_device: fix ksmd oops on a migrated KSM page Lorenzo Stoakes (ARM)
2026-11-11 21:54   ` David Hildenbrand (Arm)
2026-11-11 22:47     ` Alistair Popple
2026-11-11 23:27   ` Balbir Singh
2026-11-12 17:22   ` Gregory Price (Meta)
2026-11-12 18:16   ` sashiko-bot
2026-11-11 18:13 ` [PATCH 09/13] mm/migrate_device: fix use-after-free of the anon rmap Lorenzo Stoakes (ARM)
2026-11-11 23:04   ` Alistair Popple
2026-11-12 19:05     ` Lorenzo Stoakes (ARM)
2026-11-12 18:11   ` Gregory Price (Meta)
2026-11-12 19:10     ` Lorenzo Stoakes (ARM)
2026-11-12 18:16   ` sashiko-bot
2026-11-11 18:13 ` [PATCH 10/13] mm/migrate_device: refuse to migrate shadow stacks Lorenzo Stoakes (ARM)
2026-11-11 21:15   ` Balbir Singh
2026-11-11 23:15   ` Alistair Popple
2026-11-12 18:16   ` sashiko-bot
2026-11-12 19:03     ` Lorenzo Stoakes (ARM)
2026-11-12 22:53       ` Roman Gushchin
2026-11-13  0:22       ` Roman Gushchin
2026-11-11 18:13 ` [PATCH 11/13] percpu: fix contig hints that are too low Lorenzo Stoakes (ARM)
2026-11-12 18:30   ` Gregory Price (Meta)
2026-11-11 18:13 ` [PATCH 12/13] percpu: search the whole reserved chunk Lorenzo Stoakes (ARM)
2026-11-12 18:33   ` Gregory Price (Meta)
2026-11-11 18:13 ` [PATCH 13/13] percpu: queue the balance work on an unbound workqueue Lorenzo Stoakes (ARM)
2026-11-12 18:41   ` Gregory Price (Meta)
2026-11-12 18:45     ` Lorenzo Stoakes (ARM)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=avWuxs25RmC6PvVZ@gremlin \
    --to=ljs@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=apopple@nvidia.com \
    --cc=balbirs@nvidia.com \
    --cc=bp@alien8.de \
    --cc=broonie@kernel.org \
    --cc=byungchul@sk.com \
    --cc=cl@gentwo.org \
    --cc=dave.hansen@linux.intel.com \
    --cc=david@kernel.org \
    --cc=dennis@kernel.org \
    --cc=dennisszhou@gmail.com \
    --cc=gourry@gourry.net \
    --cc=hannes@cmpxchg.org \
    --cc=jack@suse.cz \
    --cc=jannh@google.com \
    --cc=jbacik@fb.com \
    --cc=jglisse@redhat.com \
    --cc=joshua.hahnjy@gmail.com \
    --cc=kas@kernel.org \
    --cc=kasong@tencent.com \
    --cc=liam@infradead.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mason@kernel.org \
    --cc=matthew.brost@intel.com \
    --cc=mhocko@suse.com \
    --cc=nphamcs@gmail.com \
    --cc=peng.fan@nxp.com \
    --cc=pfalcato@suse.de \
    --cc=rick.p.edgecombe@intel.com \
    --cc=rientjes@google.com \
    --cc=rppt@kernel.org \
    --cc=shakeel.butt@linux.dev \
    --cc=surenb@google.com \
    --cc=tj@kernel.org \
    --cc=usama.arif@linux.dev \
    --cc=vbabka@kernel.org \
    --cc=willy@infradead.org \
    --cc=ying.huang@linux.alibaba.com \
    --cc=yu-cheng.yu@intel.com \
    --cc=ziy@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.