All of lore.kernel.org
 help / color / mirror / Atom feed
From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Kiryl Shutsemau <kirill@shutemov.name>,
	Andrew Morton <akpm@linux-foundation.org>,
	Lorenzo Stoakes <ljs@kernel.org>, Zi Yan <ziy@nvidia.com>,
	Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: "Kiryl Shutsemau (Meta)" <kas@kernel.org>,
	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 v3 05/12] mm/collapse: state what a collapse may do in the policy
Date: Wed, 23 Sep 2026 14:24:04 +0200	[thread overview]
Message-ID: <2add40dc-6541-41e3-8233-521cce7e0d33@kernel.org> (raw)
In-Reply-To: <20260916093145.4022188-6-kirill@shutemov.name>

On 9/16/26 11:31, 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.

Agreed. Removing plenty of these is_khugepaged checks is nice.

> 
> 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 treated alike.

Fair.

> 
> 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.

Worth putting this into a separate patch? Likely not.

> 
> Assisted-by: LLM
> Reviewed-by: Zi Yan <ziy@nvidia.com>
> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
> Signed-off-by: Kiryl Shutsemau (Meta) <kas@kernel.org>
> ---
>  mm/collapse.h   |  31 ++++++++++++-
>  mm/khugepaged.c | 114 ++++++++++++++++++++++++++----------------------
>  2 files changed, 93 insertions(+), 52 deletions(-)
> 
> diff --git a/mm/collapse.h b/mm/collapse.h
> index b115034d9018..7044dc71c7c2 100644
> --- a/mm/collapse.h
> +++ b/mm/collapse.h
> @@ -45,8 +45,37 @@ 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;
> +
> +	/* Take no swapped-out or shared PTE into a sub-PMD collapse */
> +	bool strict_sub_pmd;

Reading this variable name without the documentation I have no idea what it
means. It looks like the wrong abstraction.

Maybe you instead want to split max_ptes_swap and shared to a PMD and non-PMD case?

I am also confused why you use "strict_sub_pmd" in the collapse_max_ptes_none()
handler below? Something seems odd, as it doesn't amtch the description here.

> +
> +	/* Leave clean lazyfree folios to reclaim rather than collapse them */
> +	bool skip_lazyfree;
> +
> +	/* Refuse a range with no sign of use */
> +	bool require_referenced;
> +
> +	/* Map the PMD over a file collapse instead of leaving it to a fault */
> +	bool install_pmd;

Confusing.

If some of these policies are anon-/ file-specific, the name should indicate
that, so there is less head scratching.

> +
> +	/* Write dirty pages back and retry once instead of refusing them */
> +	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;
>  
>  	/* Num pages scanned per node */
>  	u32 node_load[MAX_NUMNODES];
> diff --git a/mm/khugepaged.c b/mm/khugepaged.c
> index 8889f75cf45f..cb08789b2d38 100644
> --- a/mm/khugepaged.c


[...]

>  
> +/* khugepaged collapses on its own initiative, so it obeys its own settings */
> +static void collapse_policy_khugepaged(struct collapse_policy *p)
> +{
> +	p->max_ptes_none = READ_ONCE(khugepaged_max_ptes_none);
> +	p->max_ptes_swap = READ_ONCE(khugepaged_max_ptes_swap);
> +	p->max_ptes_shared = READ_ONCE(khugepaged_max_ptes_shared);
> +	p->strict_sub_pmd = true;
> +	p->skip_lazyfree = true;
> +	p->require_referenced = true;
> +	p->install_pmd = false;
> +	p->writeback_dirty = false;
> +	p->gfp = alloc_hugepage_khugepaged_gfpmask();
> +	p->tva_type = TVA_KHUGEPAGED;
> +}
> +
> +/* MADV_COLLAPSE was asked for explicitly, so it is not held to those */
> +static void collapse_policy_forced(struct collapse_policy *p)

Why are we not calling this collapse_policy_madvise to match its description here?


[...]

> @@ -2943,6 +2952,9 @@ static void khugepaged_do_scan(struct collapse_control *cc)
>  
>  	lru_add_drain_all();
>  
> +	/* One policy for the whole pass, so every table is treated the same */

just drop that comment.



-- 
Cheers,

David


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

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-16  9:31 [PATCH v3 00/12] mm/collapse: separate a collapse from its callers Kiryl Shutsemau
2026-09-16  9:31 ` [PATCH v3 01/12] mm/khugepaged: drop redundant mm_struct pin in madvise_collapse() Kiryl Shutsemau
2026-09-23 11:49   ` David Hildenbrand (Arm)
2026-09-16  9:31 ` [PATCH v3 02/12] mm/khugepaged: count collapses where khugepaged makes them Kiryl Shutsemau
2026-09-23 11:51   ` David Hildenbrand (Arm)
2026-09-16  9:31 ` [PATCH v3 03/12] mm/khugepaged: rename mthp_present_ptes bitmap to eligible_ptes Kiryl Shutsemau
2026-09-23 11:52   ` David Hildenbrand (Arm)
2026-09-16  9:31 ` [PATCH v3 04/12] mm/collapse: add collapse.h for the collapse interface Kiryl Shutsemau
2026-09-23 11:56   ` David Hildenbrand (Arm)
2026-09-16  9:31 ` [PATCH v3 05/12] mm/collapse: state what a collapse may do in the policy Kiryl Shutsemau
2026-09-23 12:24   ` David Hildenbrand (Arm) [this message]
2026-09-24 13:49     ` Kiryl Shutsemau
2026-09-16  9:31 ` [PATCH v3 06/12] mm/collapse: drop the collapse_possible() wrapper Kiryl Shutsemau
2026-09-23 12:25   ` David Hildenbrand (Arm)
2026-09-16  9:31 ` [PATCH v3 07/12] mm/collapse: name the per-table scan reset for what it resets Kiryl Shutsemau
2026-09-23 12:26   ` David Hildenbrand (Arm)
2026-09-16  9:31 ` [PATCH v3 08/12] mm/collapse: separate scanning a PTE table from collapsing it Kiryl Shutsemau
2026-09-18  9:06   ` Baolin Wang
2026-09-23 13:04   ` David Hildenbrand (Arm)
2026-09-24 14:19     ` Kiryl Shutsemau
2026-09-16  9:31 ` [PATCH v3 09/12] mm/collapse: open-code collapse_single_pmd() in its two callers Kiryl Shutsemau
2026-09-18  9:31   ` Baolin Wang
2026-09-23 13:08   ` David Hildenbrand (Arm)
2026-09-24 14:56     ` Kiryl Shutsemau
2026-09-16  9:31 ` [PATCH v3 10/12] mm/collapse: work out the orders a VMA allows once per VMA Kiryl Shutsemau
2026-09-23 13:19   ` David Hildenbrand (Arm)
2026-09-24 15:04     ` Kiryl Shutsemau
2026-09-16  9:31 ` [PATCH v3 11/12] mm/collapse: declare the collapse interface in collapse.h Kiryl Shutsemau
2026-09-23 13:34   ` David Hildenbrand (Arm)
2026-09-24 15:22     ` Kiryl Shutsemau
2026-09-28 12:03       ` David Hildenbrand (Arm)
2026-09-16  9:31 ` [PATCH v3 12/12] mm/collapse: implement MADV_COLLAPSE in madvise.c Kiryl Shutsemau
2026-09-16 22:48 ` [PATCH v3 00/12] mm/collapse: separate a collapse from its callers Andrew Morton
2026-09-17 12:26   ` Kiryl Shutsemau
2026-09-17 22:11     ` Andrew Morton
2026-09-23 13:52       ` 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=2add40dc-6541-41e3-8233-521cce7e0d33@kernel.org \
    --to=david@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=baohua@kernel.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=dev.jain@arm.com \
    --cc=jannh@google.com \
    --cc=kas@kernel.org \
    --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 \
    --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.