From: "Zi Yan" <ziy@nvidia.com>
To: "Kiryl Shutsemau" <kirill@shutemov.name>
Cc: "Andrew Morton" <akpm@linux-foundation.org>,
"David Hildenbrand" <david@kernel.org>,
"Lorenzo Stoakes" <ljs@kernel.org>, <linux-mm@kvack.org>,
<linux-kernel@vger.kernel.org>, <kernel-team@meta.com>,
"Baolin Wang" <baolin.wang@linux.alibaba.com>,
"Liam R . Howlett" <liam@infradead.org>,
"Nico Pache" <nico.pache@linux.dev>,
"Ryan Roberts" <ryan.roberts@arm.com>,
"Dev Jain" <dev.jain@arm.com>, "Barry Song" <baohua@kernel.org>,
"Lance Yang" <lance.yang@linux.dev>,
"Usama Arif" <usama.arif@linux.dev>,
"Vlastimil Babka" <vbabka@kernel.org>,
"Jann Horn" <jannh@google.com>
Subject: Re: [PATCH 05/12] mm/collapse: state what a collapse may do in the policy
Date: Mon, 07 Sep 2026 15:40:14 -0400 [thread overview]
Message-ID: <DL9C887ZO3AG.956ZEVFA3OHV@nvidia.com> (raw)
In-Reply-To: <ap6Wa6h_4HznOzSx@thinkstation>
On Mon Sep 7, 2026 at 6:49 AM EDT, Kiryl Shutsemau wrote:
> On Fri, Sep 04, 2026 at 10:44:58PM -0400, Zi Yan wrote:
>> On Fri Sep 4, 2026 at 11:10 AM EDT, Kiryl Shutsemau wrote:
>> > From: "Kiryl Shutsemau (Meta)" <kas@kernel.org>
>> >
>> > Tests scattered through the collapse path decide what a collapse is
>> > allowed to do by asking whether khugepaged started it. Between them they
>> > settle:
>> >
>> > - which VMAs are eligible, and how hard to try for a folio;
>> > - how many empty, swapped-out or shared PTEs a window may contain, and
>> > whether a sub-PMD window is held to a stricter rule than a PMD;
>> > - whether a range has to look used, and whether a MADV_FREE'd page is
>> > left alone;
>> > - whether the PMD is mapped as part of the request, and whether dirty
>> > pages are worth writing back and retrying.
>> >
>> > None of those is a fact about khugepaged. Each is something the caller
>> > decided before asking, and the collapse code should not have to look up
>> > who called to find out.
>> >
>> > Add struct collapse_policy for the caller to fill: khugepaged from its
>> > own settings, MADV_COLLAPSE from the fact that a user asked explicitly.
>> > Every test becomes a read of a field, and cc->is_khugepaged goes, having
>> > no reader left.
>> >
>> > khugepaged fills the policy once per scan pass, MADV_COLLAPSE once per
>> > call. That is the one change in behaviour. The max_ptes_* limits and the
>> > defrag setting behind the allocation mask are sampled once per pass rather
>> > than on every table. A table scanned early in a pass and one scanned late
>> > are then judged alike.
>> >
>> > collapse_file() also drops a NULL check on the collapse_control. It has
>> > one call site, reached only from collapse_single_pmd(), which dereferences
>> > cc unconditionally, so the check was already dead.
>> >
>> > Assisted-by: Claude-Code:claude-opus-5
>> > Signed-off-by: Kiryl Shutsemau (Meta) <kas@kernel.org>
>> > ---
>> > mm/collapse.h | 40 ++++++++++++++++-
>> > mm/khugepaged.c | 114 ++++++++++++++++++++++++++----------------------
>> > 2 files changed, 102 insertions(+), 52 deletions(-)
>> >
>> > diff --git a/mm/collapse.h b/mm/collapse.h
>> > index 1c40229b9554..05282eed9a35 100644
>> > --- a/mm/collapse.h
>> > +++ b/mm/collapse.h
>> > @@ -48,8 +48,46 @@ enum scan_result {
>> > SCAN_PAGE_DIRTY_OR_WRITEBACK,
>> > };
>> >
>> > +/* What a collapse is allowed to do, decided by the caller that asks for it */
>> > +struct collapse_policy {
>> > + /* Limits, stated per PMD; HPAGE_PMD_NR means "no limit" */
>> > + unsigned int max_ptes_none;
>> > + unsigned int max_ptes_swap;
>> > + unsigned int max_ptes_shared;
>> > +
>> > + /*
>> > + * Hold a sub-PMD window to a stricter rule than a PMD: no swapped-out
>> > + * and no shared PTEs at all, and max_ptes_none as
>> > + * collapse_max_ptes_none() scales it.
>> > + */
>> > + bool strict_sub_pmd;
>> > +
>> > + /*
>> > + * Collapse only where it looks worth doing: require some sign the
>> > + * range is in use, and leave clean lazyfree folios for reclaim rather
>> > + * than collapsing them into a folio that is not lazyfree.
>> > + */
>> > + bool skip_lazyfree;
>> > + bool require_referenced;
>> > +
>> > + /*
>> > + * Finish the job rather than leaving it half done for a fault to pick
>> > + * up: map the PMD over a file collapse before returning, and write
>> > + * dirty pages back and retry once instead of refusing them. Both cost
>> > + * latency the caller has to be willing to pay.
>> > + */
>> > + bool install_pmd;
>> > + bool writeback_dirty;
>> > +
>> > + /* How hard to try for a destination folio */
>> > + gfp_t gfp;
>> > +
>> > + /* Which VMAs are eligible, as thp_vma_allowable_orders() spells it */
>> > + enum tva_type tva_type;
>> > +};
>> > +
>> > struct collapse_control {
>> > - bool is_khugepaged;
>> > + struct collapse_policy policy;
>>
>> Can it be made const since it seems to be read-only?
>
> Not as a member: khugepaged fills it once per pass from the sysfs knobs,
> so there is no constant object to point at. And madvise has to
> initialize it somehow after cc is allocated.
>
> It could become a const pointer to a struct the caller owns, but that
> adds a lifetime to track for a struct that is written in one place and
> read everywhere else. I would rather keep it embedded.
Got it. Thanks for the explanation.
--
Best Regards,
Yan, Zi
next prev parent reply other threads:[~2026-09-07 19:40 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-04 15:10 [PATCH 00/12] mm/collapse: separate a collapse from its callers Kiryl Shutsemau
2026-09-04 15:10 ` [PATCH 01/12] mm/khugepaged: drop redundant mm_struct pin in madvise_collapse() Kiryl Shutsemau
2026-09-04 15:58 ` Zi Yan
2026-09-07 7:33 ` Baolin Wang
2026-09-04 15:10 ` [PATCH 02/12] mm/khugepaged: count collapses where khugepaged makes them Kiryl Shutsemau
2026-09-05 2:25 ` Zi Yan
2026-09-07 7:40 ` Baolin Wang
2026-09-04 15:10 ` [PATCH 03/12] mm/khugepaged: rename mthp_present_ptes bitmap to eligible_ptes Kiryl Shutsemau
2026-09-05 2:28 ` Zi Yan
2026-09-07 7:54 ` Baolin Wang
2026-09-07 10:35 ` Kiryl Shutsemau
2026-09-04 15:10 ` [PATCH 04/12] mm/collapse: add collapse.h for the collapse interface Kiryl Shutsemau
2026-09-05 2:36 ` Zi Yan
2026-09-07 10:41 ` Kiryl Shutsemau
2026-09-07 8:04 ` Baolin Wang
2026-09-04 15:10 ` [PATCH 05/12] mm/collapse: state what a collapse may do in the policy Kiryl Shutsemau
2026-09-05 2:44 ` Zi Yan
2026-09-07 10:49 ` Kiryl Shutsemau
2026-09-07 19:40 ` Zi Yan [this message]
2026-09-07 9:05 ` Baolin Wang
2026-09-07 10:56 ` Kiryl Shutsemau
2026-09-08 1:48 ` Baolin Wang
2026-09-04 15:10 ` [PATCH 06/12] mm/collapse: drop the collapse_possible() wrapper Kiryl Shutsemau
2026-09-05 2:45 ` Zi Yan
2026-09-07 8:28 ` Baolin Wang
2026-09-04 15:10 ` [PATCH 07/12] mm/collapse: name the per-table scan reset for what it resets Kiryl Shutsemau
2026-09-05 18:05 ` Zi Yan
2026-09-07 8:31 ` Baolin Wang
2026-09-04 15:10 ` [PATCH 08/12] mm/collapse: separate scanning a PTE table from collapsing it Kiryl Shutsemau
2026-09-06 2:30 ` Zi Yan
2026-09-07 11:34 ` Kiryl Shutsemau
2026-09-04 15:10 ` [PATCH 09/12] mm/collapse: open-code collapse_single_pmd() in its two callers Kiryl Shutsemau
2026-09-04 15:10 ` [PATCH 10/12] mm/collapse: work out the orders a VMA allows once per VMA Kiryl Shutsemau
2026-09-04 15:10 ` [PATCH 11/12] mm/collapse: declare the collapse interface in collapse.h Kiryl Shutsemau
2026-09-04 15:10 ` [PATCH 12/12] mm/collapse: implement MADV_COLLAPSE in madvise.c Kiryl Shutsemau
2026-09-06 0:23 ` [PATCH 00/12] mm/collapse: separate a collapse from its callers Andrew Morton
2026-09-07 10:28 ` Kiryl Shutsemau
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=DL9C887ZO3AG.956ZEVFA3OHV@nvidia.com \
--to=ziy@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=jannh@google.com \
--cc=kernel-team@meta.com \
--cc=kirill@shutemov.name \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=nico.pache@linux.dev \
--cc=ryan.roberts@arm.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@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
all inboxes | Powered by JetHome®