From: Kiryl Shutsemau <kirill@shutemov.name>
To: "David Hildenbrand (Arm)" <david@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Lorenzo Stoakes <ljs@kernel.org>, Zi Yan <ziy@nvidia.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
kernel-team@meta.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 v2 00/12] mm/collapse: separate a collapse from its callers
Date: Fri, 11 Sep 2026 16:56:03 +0100 [thread overview]
Message-ID: <aqQf9hSy0iNjnL6t@thinkstation> (raw)
In-Reply-To: <8170ef17-0de3-45dc-8c8c-de15f088214d@kernel.org>
On Fri, Sep 11, 2026 at 05:06:58PM +0200, David Hildenbrand (Arm) wrote:
> On 9/10/26 14:02, Kiryl Shutsemau wrote:
> > From: "Kiryl Shutsemau (Meta)" <kas@kernel.org>
> >
> > [ This is the first of the cleanups I said I would front-load ]
> >
> > There is no line between the collapse engine and the callers that ask for
> > a collapse. khugepaged.c holds both, and they reach into each other.
> >
> > - Sixteen tests through the collapse path read cc->is_khugepaged to work
> > out what they are allowed to do, when every one of those decisions was
> > made by the caller before it asked.
> >
> > - collapse_single_pmd() does both halves of a collapse behind one call and
> > drops mmap_lock somewhere in the middle. Which of its paths dropped it
> > is not something a caller can see, so it hands back a bool and the
> > caller keeps track.
> >
> > - MADV_COLLAPSE's implementation -- the walk over the user's range, the
> > per-PMD loop, the errno translation -- sits in khugepaged.c, which is
> > the daemon's file.
> >
> > So: draw the line. State what a caller allows in a policy, split the call
> > in two with the lock as the boundary, and move the syscall to madvise.c.
> > What the engine offers is then four calls, with the lock state written
> > down against each, and a policy the caller fills for itself:
> >
> > collapse_control_init(cc) once, before the first table
> > collapse_policy_*(&cc->policy) what this caller allows
> > collapse_scan_pmd(vma, addr, ...) per table, under mmap_lock
> > collapse_run_pmd(mm, addr, cc) when a scan found work, no mmap_lock
> > collapse_control_release(cc) once, when done
> >
> > The engine stays in khugepaged.c for now; what changes is that it has an
> > interface, and that neither half has to ask about the other. madvise.c
> > gains the operation it should have had all along.
> >
> > Changes since v1
> > ================
> >
> > https://lore.kernel.org/all/cover.1788533997.git.kas@kernel.org/
> >
> > - Rebased onto mm-new with Vernon Yang's tracepoint fixes in it. Patch 8
> > no longer merges the two calls to each scan tracepoint, since the base
> > already has one; its changelog now says what the status field reports.
> >
> > - Patch 3: nr_occupied_ptes is nr_eligible_ptes, and the mthp_collapse()
> > comment counts eligible PTEs too (Zi, Baolin).
> >
> > - Patch 4: no comments on the two constants (Baolin).
> >
> > - Patch 5: one line per policy field (Baolin).
> >
> > - Patch 8: the file side is split like the anonymous one (Zi).
> > collapse_scan_file() runs under mmap_lock in the scan and only judges;
> > collapse_file() runs in the run. See Behaviour below.
> >
> > - Reviewed-by from Zi Yan and Baolin Wang on 1-4, 6 and 7.
> >
>
> I'll hopefully get too look at this soon (after digging through older stuff in
> my queue).
>
> Skimming over some patches, a note that we should not be undoing recent
> cleanups without a very good reason.
I don't think we undo it.
Both madvise and khugepaged use the same interface to the collapse
engine. Anon and file paths are handled internally in the engine. What
changed is that we have two calls into the engine instead of one.
Collapse consists of two phases: finding what to collapse and collapsing
the found range. These two phases have vastly different locking
expectations.
The scan reads a PTE table under mmap_lock, fails often and doesn't drop
the lock to move to next range.
The collapse allocates, may sleep in writeback and takes mmap_lock for
write itself. So the lock inherited from scan is no good.
collapse_single_pmd() hid that boundary inside one call. It had to drop
the lock somewhere in the middle, on some paths and not others, and the
only way for the caller to find out was the lock_dropped bool.
With scan and run as separate calls each has one lock rule: scan is
called locked and returns locked, run is called unlocked. There is
nothing left to report, so the ugly lock_dropped goes away.
It is the same move as Nico's da98790891a4 ("require collapse_huge_page
to enter/exit with the lock dropped"), one level up.
--
Kiryl Shutsemau / Kirill A. Shutemov
next prev parent reply other threads:[~2026-09-11 15:56 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 12:02 Kiryl Shutsemau
2026-09-10 12:02 ` [PATCH v2 01/12] mm/khugepaged: drop redundant mm_struct pin in madvise_collapse() Kiryl Shutsemau
2026-09-10 12:02 ` [PATCH v2 02/12] mm/khugepaged: count collapses where khugepaged makes them Kiryl Shutsemau
2026-09-10 12:02 ` [PATCH v2 03/12] mm/khugepaged: rename mthp_present_ptes bitmap to eligible_ptes Kiryl Shutsemau
2026-09-10 12:02 ` [PATCH v2 04/12] mm/collapse: add collapse.h for the collapse interface Kiryl Shutsemau
2026-09-10 12:02 ` [PATCH v2 05/12] mm/collapse: state what a collapse may do in the policy Kiryl Shutsemau
2026-09-11 2:06 ` Zi Yan
2026-09-10 12:02 ` [PATCH v2 06/12] mm/collapse: drop the collapse_possible() wrapper Kiryl Shutsemau
2026-09-10 12:02 ` [PATCH v2 07/12] mm/collapse: name the per-table scan reset for what it resets Kiryl Shutsemau
2026-09-10 12:02 ` [PATCH v2 08/12] mm/collapse: separate scanning a PTE table from collapsing it Kiryl Shutsemau
2026-09-11 2:38 ` Zi Yan
2026-09-11 13:37 ` Kiryl Shutsemau
2026-09-11 14:40 ` Zi Yan
2026-09-10 12:02 ` [PATCH v2 09/12] mm/collapse: open-code collapse_single_pmd() in its two callers Kiryl Shutsemau
2026-09-11 14:57 ` Zi Yan
2026-09-11 15:24 ` Kiryl Shutsemau
2026-09-11 15:26 ` Zi Yan
2026-09-11 22:09 ` Zi Yan
2026-09-10 12:02 ` [PATCH v2 10/12] mm/collapse: work out the orders a VMA allows once per VMA Kiryl Shutsemau
2026-09-11 15:56 ` Zi Yan
2026-09-10 12:02 ` [PATCH v2 11/12] mm/collapse: declare the collapse interface in collapse.h Kiryl Shutsemau
2026-09-11 19:02 ` Zi Yan
2026-09-10 12:02 ` [PATCH v2 12/12] mm/collapse: implement MADV_COLLAPSE in madvise.c Kiryl Shutsemau
2026-09-11 15:06 ` [PATCH v2 00/12] mm/collapse: separate a collapse from its callers David Hildenbrand (Arm)
2026-09-11 15:56 ` Kiryl Shutsemau [this message]
2026-09-11 15:58 ` Kiryl Shutsemau
2026-09-11 18:35 ` David Hildenbrand (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=aqQf9hSy0iNjnL6t@thinkstation \
--to=kirill@shutemov.name \
--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=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 \
--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 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®