From: Joonwon Kang <joonwonkang@google.com>
To: akpm@linux-foundation.org
Cc: cl@gentwo.org, dennis@kernel.org, dodam@google.com,
joonwonkang@google.com, linux-kernel@vger.kernel.org,
linux-mm@kvack.org, tj@kernel.org
Subject: Re: [PATCH v5 4/4] percpu: Fix hint invariant breakage
Date: Wed, 13 May 2026 06:18:09 +0000 [thread overview]
Message-ID: <20260513061809.3868837-1-joonwonkang@google.com> (raw)
In-Reply-To: <20260512154628.a30e8eb1827c80e0529b672e@linux-foundation.org>
> On Sun, 10 May 2026 07:21:49 +0000 Joonwon Kang <joonwonkang@google.com> wrote:
>
> > The invariant "scan_hint_start > contig_hint_start if and only if
> > scan_hint == contig_hint" should be kept for hint management. However,
> > it could be broken in some cases:
> >
> > - if (new contig == contig_hint == scan_hint) && (contig_hint_start <
> > scan_hint_start < new contig start) && the new contig is to become a
> > new contig_hint due to its better alignment, then scan_hint should
> > be invalidated instead of keeping the old value.
> >
> > - if (new contig == contig_hint > scan_hint) && (new contig start <
> > contig_hint_start) && the new contig is not to become a new
> > contig_hint, then scan_hint should be not updated to the new contig.
> >
> > This commit mainly fixes this invariant breakage and includes more:
>
> Thanks. AI review asked a single question:
> https://sashiko.dev/#/patchset/20260510072149.1279887-1-joonwonkang@google.com
Thanks for sharing it. Let me answer it inline.
> > diff --git a/mm/percpu.c b/mm/percpu.c
> > index 35e058f56a6fd..359f92d9637db 100644
> > --- a/mm/percpu.c
> > +++ b/mm/percpu.c
> [ ... ]
> > @@ -661,21 +710,41 @@ static void pcpu_block_update(struct pcpu_block_md *block, int start, int end)
> > if (block->contig_hint.start &&
> > (!free.start ||
> > __ffs(free.start) > __ffs(block->contig_hint.start))) {
> [ ... ]
> > /* new start has a better alignment so use it */
> > block->contig_hint.start = free.start;
> > - if (block->scan_hint.size &&
> > - free.start < block->scan_hint.start &&
> > - block->contig_hint.size > block->scan_hint.size)
> > - block->scan_hint.size = 0;
> > - } else if ((block->scan_hint.size &&
> > - free.start > block->scan_hint.start) ||
> > - block->contig_hint.size > block->scan_hint.size) {
> > - /*
> > - * Knowing new contig size == contig_hint.size, update
> > - * the scan_hint if it is farther than or larger than
> > - * the current scan_hint.
> > - */
> > - block->scan_hint = free;
> > + } else {
> > + if (block->contig_hint.size > block->scan_hint.size) {
> > + if (free.start < block->contig_hint.start) {
> > + /*
> > + * old scan_hint.size < new contig size
> > + * == old contig_hint.size. But, the new
> > + * contig is before the old contig_hint
> > + * so hold the invariant
> > + * scan_hint.start > contig_hint.start
> > + * iff scan_hint.size ==
> > + * contig_hint.size.
> > + */
> > + block->scan_hint.size = 0;
> Does this code unnecessarily invalidate the existing scan_hint by setting its
> size to 0?
> Since block->contig_hint.size > block->scan_hint.size in this branch, it
> appears the existing scan_hint already satisfies the invariant.
> While updating scan_hint to free would violate the invariant because
> free.start < contig_hint.start, simply retaining the old scan_hint rather
> than actively zeroing it seems to preserve the invariant.
> Could we leave the existing scan_hint intact here instead of clearing it to
> prevent a regression from losing a valid allocator hint?
If the old scan_hint is before the new free region, it makes sense to leave
the old scan_hint as-is and I don't see much demerit of it. If the old
scan_hint is after the new free region, however, leaving the old scan_hint
as-is is more likely to break the contig_hint later and I guess it is still
better to scan from 0 in that case. So, let me more diverge in this case.
Thanks,
Joonwon Kang
> > + } else {
> > + block->scan_hint = free;
> > + }
> > + } else if (free.start > block->scan_hint.start) {
> > + block->scan_hint = free;
> > + }
> > }
prev parent reply other threads:[~2026-05-13 6:18 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-10 7:21 [PATCH v5 1/4] percpu: Fix wrong chunk hints update Joonwon Kang
2026-05-10 7:21 ` [PATCH v5 2/4] percpu: Do not trust hint starts when they are not set Joonwon Kang
2026-05-10 7:21 ` [PATCH v5 3/4] percpu: Introduce struct pcpu_region Joonwon Kang
2026-05-10 7:21 ` [PATCH v5 4/4] percpu: Fix hint invariant breakage Joonwon Kang
2026-05-12 22:46 ` Andrew Morton
2026-05-13 6:18 ` Joonwon Kang [this message]
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=20260513061809.3868837-1-joonwonkang@google.com \
--to=joonwonkang@google.com \
--cc=akpm@linux-foundation.org \
--cc=cl@gentwo.org \
--cc=dennis@kernel.org \
--cc=dodam@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=tj@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox