From: Bharata B Rao <bharata@amd.com>
To: "Gregory Price (Meta)" <gourry@gourry.net>, <linux-mm@kvack.org>
Cc: <linux-kernel@vger.kernel.org>, <kernel-team@meta.com>,
<akpm@linux-foundation.org>, <david@kernel.org>, <ljs@kernel.org>,
<liam@infradead.org>, <vbabka@kernel.org>, <rppt@kernel.org>,
<surenb@google.com>, <mhocko@suse.com>, <peterz@infradead.org>,
<juri.lelli@redhat.com>, <vincent.guittot@linaro.org>,
<dietmar.eggemann@arm.com>, <rostedt@goodmis.org>,
<bsegall@google.com>, <mgorman@techsingularity.net>,
<mingo@kernel.org>, <vschneid@redhat.com>,
<kprateek.nayak@amd.com>, <ziy@nvidia.com>,
<baolin.wang@linux.alibaba.com>, <nico.pache@linux.dev>,
<ryan.roberts@arm.com>, <dev.jain@arm.com>, <baohua@kernel.org>,
<lance.yang@linux.dev>, <usama.arif@linux.dev>, <kas@kernel.org>,
<joshua.hahnjy@gmail.com>, <rakie.kim@sk.com>,
<ying.huang@linux.alibaba.com>, <matthew.brost@intel.com>,
<byungchul@sk.com>, <apopple@nvidia.com>, <jannh@google.com>,
<pfalcato@suse.de>, <hannes@cmpxchg.org>, <osalvador@suse.de>,
<raghavendra.kt@amd.com>, <stable@vger.kernel.org>
Subject: Re: [PATCH v5 2/7] mm: allow shared folios to be promoted to a fast tier
Date: Thu, 12 Nov 2026 09:34:36 +0530 [thread overview]
Message-ID: <81841052-e524-4263-b09d-9cf823ed9728@amd.com> (raw)
In-Reply-To: <20261110150446.2452975-3-gourry@gourry.net>
On 10-Nov-26 8:34 PM, Gregory Price (Meta) wrote:
> NUMA balancing rejects shared copy-on-write folios and executable
> file folios mapped by multiple processes to avoid east-west
> migration bouncing. These checks break promotion from slow memory.
>
> Allow such folios to participate when the folio being migrated is
> a low-tier folio and the destination is top-tier (south->north).
> This allows promotion, but prevents east-west or north->south
> migrations (north->south is handled by reclaim demotion).
>
> Keep the existing restrictions for ordinary placement and for
> migrations that are not slow-to-top-tier promotions.
>
> Rename folio_use_access_time() to folio_numab_promotable() so the name
> captures the combined memory-tiering and source-tier test. The helper
> retains its existing behavior.
>
> Fixes: c574bbe91703 ("NUMA balancing: optimize page placement for memory tiering system")
> Cc: stable@vger.kernel.org
> Suggested-by: Zi Yan <ziy@nvidia.com>
> Link: https://lore.kernel.org/r/DLHS4KFPQ86I.1J4LN3352RI71@nvidia.com
> Assisted-by: LLM
> Acked-by: David Hildenbrand (Arm) <david@kernel.org>
> Signed-off-by: Gregory Price (Meta) <gourry@gourry.net>
> ---
> include/linux/mm.h | 5 +++--
> kernel/sched/fair.c | 2 +-
> mm/memory-tiers.c | 9 ++++++---
> mm/memory.c | 2 +-
> mm/mempolicy.c | 11 ++++++++---
> mm/migrate.c | 13 +++++++++----
> 6 files changed, 28 insertions(+), 14 deletions(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 40de653041f92..55817dea7307f 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -2647,7 +2647,7 @@ static inline void vma_set_access_pid_bit(struct vm_area_struct *vma)
> }
> }
>
> -bool folio_use_access_time(struct folio *folio);
> +bool folio_numab_promotable(struct folio *folio);
> #else /* !CONFIG_NUMA_BALANCING */
> static inline int folio_xchg_last_cpupid(struct folio *folio, int cpupid)
> {
> @@ -2701,7 +2701,8 @@ static inline bool cpupid_match_pid(struct task_struct *task, int cpupid)
> static inline void vma_set_access_pid_bit(struct vm_area_struct *vma)
> {
> }
> -static inline bool folio_use_access_time(struct folio *folio)
> +
> +static inline bool folio_numab_promotable(struct folio *folio)
> {
> return false;
> }
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 5d3d7b61d0257..e353d3d3012ea 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -2877,7 +2877,7 @@ bool should_numa_migrate_memory(struct task_struct *p, struct folio *folio,
> * The pages in slow memory node should be migrated according
> * to hot/cold instead of private/shared.
> */
> - if (folio_use_access_time(folio)) {
> + if (folio_numab_promotable(folio)) {
> struct pglist_data *pgdat;
> unsigned long rate_limit;
> unsigned int latency, th, def_th;
> diff --git a/mm/memory-tiers.c b/mm/memory-tiers.c
> index 7fc56a8c66518..0df54dc556f19 100644
> --- a/mm/memory-tiers.c
> +++ b/mm/memory-tiers.c
> @@ -53,16 +53,19 @@ static const struct bus_type memory_tier_subsys = {
>
> #ifdef CONFIG_NUMA_BALANCING
> /**
> - * folio_use_access_time - check if a folio reuses cpupid for page access time
> + * folio_numab_promotable - check if NUMA balancing can promote a folio
> * @folio: folio to check
> *
> * folio's _last_cpupid field is repurposed by memory tiering. In memory
> * tiering mode, cpupid of slow memory folio (not toptier memory) is used to
> * record page access time.
> *
> - * Return: the folio _last_cpupid is used to record page access time
> + * If memory tiering is disabled, then lowtier has no appreciable meaning,
> + * so we return false (the folio should not be migrated on this distinction).
> + *
> + * Return: true if memory tiering can promote the folio.
> */
> -bool folio_use_access_time(struct folio *folio)
> +bool folio_numab_promotable(struct folio *folio)
> {
> return (sysctl_numa_balancing_mode & NUMA_BALANCING_MEMORY_TIERING) &&
> !node_is_toptier(folio_nid(folio));
> diff --git a/mm/memory.c b/mm/memory.c
> index d477a4f986bc8..e70885653475a 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -6262,7 +6262,7 @@ int numa_migrate_check(struct folio *folio, struct vm_fault *vmf,
> * For memory tiering mode, cpupid of slow memory page is used
> * to record page access time. So use default value.
> */
> - if (folio_use_access_time(folio))
> + if (folio_numab_promotable(folio))
> *last_cpupid = (-1 & LAST_CPUPID_MASK);
> else
> *last_cpupid = folio_last_cpupid(folio);
> diff --git a/mm/mempolicy.c b/mm/mempolicy.c
> index f0933e9b209c9..49cfeab501b4a 100644
> --- a/mm/mempolicy.c
> +++ b/mm/mempolicy.c
> @@ -866,8 +866,13 @@ bool folio_can_map_prot_numa(struct folio *folio, struct vm_area_struct *vma,
> if (!folio || folio_is_zone_device(folio) || folio_test_ksm(folio))
> return false;
>
> - /* Also skip shared copy-on-write folios */
> - if (vma_is_cow_mapping(vma) && folio_maybe_mapped_shared(folio))
> + /*
> + * Shared copy-on-write folios are poor east-west placement candidates.
> + * When tiering is enabled, folio_numab_promotable() identifies a
> + * low-tier folio that needs a hint fault for promotion.
> + */
> + if (vma_is_cow_mapping(vma) && folio_maybe_mapped_shared(folio) &&
> + !folio_numab_promotable(folio))
> return false;
>
> /* Folios are pinned and can't be migrated */
> @@ -894,7 +899,7 @@ bool folio_can_map_prot_numa(struct folio *folio, struct vm_area_struct *vma,
> if (vma_is_single_threaded_private(vma) && nid == numa_node_id())
> return false;
>
> - if (folio_use_access_time(folio))
> + if (folio_numab_promotable(folio))
> folio_xchg_access_time(folio, jiffies_to_msecs(jiffies));
>
> return true;
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 28a8d7734735b..50a0a2e11a353 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -2704,14 +2704,19 @@ int migrate_misplaced_folio_prepare(struct folio *folio,
>
> if (folio_is_file_lru(folio)) {
> /*
> - * Do not migrate file folios that are mapped in multiple
> - * processes with execute permissions as they are probably
> - * shared libraries.
> + * Limit east-west migration of file folios mapped in
> + * multiple processes with execute permissions as they
> + * are probably shared libraries (limits bouncing).
> + *
> + * If this is a low-tier folio, only migrate if the target
> + * node is toptier (this allows south->north migration while
> + * disallowing east-west migration between slow tiers).
> *
> * See folio_maybe_mapped_shared() on possible imprecision
> * when we cannot easily detect if a folio is shared.
> */
> - if ((vma->vm_flags & VM_EXEC) && folio_maybe_mapped_shared(folio))
> + if ((vma->vm_flags & VM_EXEC) && folio_maybe_mapped_shared(folio) &&
> + (!folio_numab_promotable(folio) || !node_is_toptier(node)))
> return -EACCES;
>
> /*
I am carrying a patch in pghot patchset to base this shared folio check
on @vma, in the async migration case where VMA won't be available to check the
exec permission. The effect of that is to allow promotion of shared exec folios.
This patch achieves the same in more direct manner.
Reviewed-by: Bharata B Rao <bharata@amd.com>
Regards,
Bharata.
next prev parent reply other threads:[~2026-11-12 4:05 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 15:04 [PATCH v5 0/7] sched/numa: stop VMA scan filters from gating promotion Gregory Price (Meta)
2026-11-10 15:04 ` [PATCH v5 1/7] mm: support promotion-only NUMA hinting scans Gregory Price (Meta)
2026-11-10 15:04 ` [PATCH v5 2/7] mm: allow shared folios to be promoted to a fast tier Gregory Price (Meta)
2026-11-12 4:04 ` Bharata B Rao [this message]
2026-11-10 15:04 ` [PATCH v5 3/7] sched/numa: scan read-only file mappings in tiering mode Gregory Price (Meta)
2026-11-10 15:04 ` [PATCH v5 4/7] sched/numa: separate VMA placement from scan continuation Gregory Price (Meta)
2026-11-10 15:04 ` [PATCH v5 5/7] sched/numa: scan PID-inactive VMAs for promotion Gregory Price (Meta)
2026-11-10 19:33 ` sashiko-bot
2026-11-10 20:36 ` Gregory Price (Meta)
2026-11-10 15:04 ` [PATCH v5 6/7] mm: use BIT() for change_protection() flags Gregory Price (Meta)
2026-11-10 15:16 ` Lorenzo Stoakes (ARM)
2026-11-10 15:04 ` [PATCH v5 7/7] mm: use VMA flag helpers in NUMA balancing Gregory Price (Meta)
2026-11-10 15:15 ` Lorenzo Stoakes (ARM)
2026-11-10 16:24 ` Gregory Price (Meta)
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=81841052-e524-4263-b09d-9cf823ed9728@amd.com \
--to=bharata@amd.com \
--cc=akpm@linux-foundation.org \
--cc=apopple@nvidia.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=bsegall@google.com \
--cc=byungchul@sk.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=dietmar.eggemann@arm.com \
--cc=gourry@gourry.net \
--cc=hannes@cmpxchg.org \
--cc=jannh@google.com \
--cc=joshua.hahnjy@gmail.com \
--cc=juri.lelli@redhat.com \
--cc=kas@kernel.org \
--cc=kernel-team@meta.com \
--cc=kprateek.nayak@amd.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=matthew.brost@intel.com \
--cc=mgorman@techsingularity.net \
--cc=mhocko@suse.com \
--cc=mingo@kernel.org \
--cc=nico.pache@linux.dev \
--cc=osalvador@suse.de \
--cc=peterz@infradead.org \
--cc=pfalcato@suse.de \
--cc=raghavendra.kt@amd.com \
--cc=rakie.kim@sk.com \
--cc=rostedt@goodmis.org \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=stable@vger.kernel.org \
--cc=surenb@google.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
--cc=ying.huang@linux.alibaba.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox