From: sashiko-bot@kernel.org
To: tao <tao.wangtao@honor.com>
Cc: damon@lists.linux.dev
Subject: Re: [PATCH 12/15] mm: handle ANON_VMA_LAZY during migration
Date: Wed, 27 May 2026 12:23:59 +0000 [thread overview]
Message-ID: <20260527122359.ECD9C1F00A3C@smtp.kernel.org> (raw)
In-Reply-To: <20260527110147.17815-13-tao.wangtao@honor.com>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [Critical] Dereferencing vma->vm_mm without protection leads to a use-after-free of the mm_struct.
- [High] Discarding the pointer returned by lock_vma_under_rcu() leads to a leaked per-VMA lock and unmatched unlock on the original VMA.
- [High] Migration unconditionally fails for unmapped anonymous folios because folio_trylock_get_anon_rmap() returns NULL for them.
- [High] Holding a dynamic number of anon_vma or VMA read locks concurrently during batch migration violates locking rules and overflows lockdep depth.
--
commit 18d8778974aea49701a86271f93dca924bc4ff06
Author: tao <tao.wangtao@honor.com>
mm: handle ANON_VMA_LAZY during migration
To ensure the atomicity of folio migration, introduce
folio_trylock_get_anon_rmap().
> diff --git a/mm/migrate.c b/mm/migrate.c
> index b397cdeab09a9..4abbfd1faea26 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
[ ... ]
> @@ -1287,26 +1300,17 @@ static int migrate_folio_unmap(new_folio_t get_new_folio,
[ ... ]
> - if (folio_test_anon(src) && !folio_test_ksm(src))
> - anon_rmap = folio_get_anon_rmap(src);
[ ... ]
> + if (folio_test_anon(src) && !folio_test_ksm(src)) {
> + anon_rmap = folio_trylock_get_anon_rmap(src);
> + if (!anon_rmap_value(anon_rmap))
> + goto out;
> + }
[Severity: High]
Does this cause migration to unconditionally fail for unmapped anonymous
folios? For unmapped folios, folio_get_anon_vma() returns NULL because
folio_mapped() is false, which causes folio_trylock_get_anon_rmap() to
return ANON_RMAP_NULL. Before this change, the code ignored a NULL rmap
for unmapped folios and proceeded. With this goto out, any attempt to
migrate an unmapped anonymous folio might repeatedly fail with -EAGAIN.
[Severity: High]
Could this lead to holding a dynamic number of read locks concurrently
during batch migration? Because migrate_pages_batch() processes folios in
batches, it iterates and calls migrate_folio_unmap() to acquire the lock
for every folio before it begins calling migrate_folio_move() to release
them.
Holding these locks concurrently across an entire batch could easily exceed
lockdep's MAX_LOCK_DEPTH (48) and cause severe contention or stall writers
on those VMAs during long-latency operations like TLB flushing.
[ ... ]
> diff --git a/mm/rmap.c b/mm/rmap.c
> index cb104310cdc9b..bd5587735ee06 100644
> --- a/mm/rmap.c
> +++ b/mm/rmap.c
> @@ -1223,6 +1223,46 @@ anon_rmap_t folio_lock_anon_rmap_read(const struct folio *folio,
> return anon_vma ? anon_vma_to_anon_rmap(anon_vma) : ANON_RMAP_NULL;
> }
>
> +anon_rmap_t folio_trylock_get_anon_rmap(const struct folio *folio)
> +{
> + struct anon_vma *anon_vma;
> + struct vm_area_struct *vma;
> +
> + if (folio_test_anon_vma_lazy(folio)) {
> + vma = folio_get_anon_vma_lazy(folio);
> + if (vma && !lock_vma_under_rcu(vma->vm_mm, vma->vm_start)) {
[Severity: Critical]
Is it safe to dereference vma->vm_mm here without protection? While the VMA
object itself might be protected from being freed, a VMA does not pin its
associated mm_struct. If the process has exited, the mm_struct could be
freed via free_mm().
Passing a dangling vma->vm_mm pointer to lock_vma_under_rcu(), which
attempts to walk the maple tree, could result in a use-after-free.
[Severity: High]
Does this discard the pointer returned by lock_vma_under_rcu() and leak the
per-VMA lock?
lock_vma_under_rcu() returns a pointer to the locked VMA if successful.
The condition implicitly casts this pointer to a boolean and discards it.
If the lock succeeds, the code proceeds to return the original vma pointer
instead of the locked one, leaving the successfully locked VMA permanently
locked.
Later, anon_rmap_unlock_put() would call vma_end_read() on the original
vma pointer, which was never explicitly locked.
> + vma_put(vma);
> + vma = NULL;
> + }
> + if (vma)
> + return vma_to_anon_rmap(vma);
> + }
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260527110147.17815-1-tao.wangtao@honor.com?part=12
next prev parent reply other threads:[~2026-05-27 12:24 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-27 11:01 [PATCH 0/15] mm: introduce ANON_VMA_LAZY for deferred anon_vma creation tao
2026-05-27 11:01 ` [PATCH 01/15] mm/rmap: introduce anon_rmap APIs for anonymous folios tao
2026-05-27 11:32 ` sashiko-bot
2026-05-27 11:44 ` Lorenzo Stoakes
2026-05-28 7:47 ` wangtao
2026-05-27 11:01 ` [PATCH 02/15] mm: convert anon_vma rmap APIs to anon_rmap tao
2026-05-27 11:49 ` Lorenzo Stoakes
2026-05-28 8:55 ` wangtao
2026-05-27 11:01 ` [PATCH 03/15] mm: introduce anon_vma_tree_t for multiple anon_vma topologies tao
2026-05-27 11:56 ` Lorenzo Stoakes
2026-05-28 9:00 ` wangtao
2026-05-27 11:01 ` [PATCH 04/15] mm: switch to anon_vma_tree_t APIs in preparation for ANON_VMA_LAZY tao
2026-05-27 11:53 ` sashiko-bot
2026-05-27 11:01 ` [PATCH 05/15] mm: add CONFIG_ANON_VMA_LAZY and folio helpers tao
2026-05-27 11:01 ` [PATCH 06/15] mm: add CONFIG_VMA_REF and VMA helpers tao
2026-05-27 11:42 ` sashiko-bot
2026-05-27 11:01 ` [PATCH 07/15] mm: replace direct FOLIO_MAPPING_ANON usage with helpers tao
2026-05-27 11:43 ` sashiko-bot
2026-05-27 11:01 ` [PATCH 08/15] mm: prepare rmap infrastructure for ANON_VMA_LAZY tao
2026-05-27 14:01 ` sashiko-bot
2026-05-27 11:01 ` [PATCH 09/15] mm: implement ANON_VMA_LAZY rmap semantics tao
2026-05-27 12:15 ` sashiko-bot
2026-05-27 11:01 ` [PATCH 10/15] mm: defer anon_vma creation with ANON_VMA_LAZY tao
2026-05-27 12:29 ` sashiko-bot
2026-05-27 11:01 ` [PATCH 11/15] mm: handle ANON_VMA_LAZY in huge page operations tao
2026-05-27 12:21 ` sashiko-bot
2026-05-27 11:01 ` [PATCH 12/15] mm: handle ANON_VMA_LAZY during migration tao
2026-05-27 12:23 ` sashiko-bot [this message]
2026-05-27 11:01 ` [PATCH 13/15] mm: support setup and upgrade of ANON_VMA_LAZY folios tao
2026-05-27 13:02 ` sashiko-bot
2026-05-27 11:01 ` [PATCH 14/15] mm: support merging of ANON_VMA_LAZY VMAs tao
2026-05-27 12:49 ` sashiko-bot
2026-05-27 11:01 ` [PATCH 15/15] mm: enable CONFIG_ANON_VMA_LAZY on arm64 and x86_64 tao
2026-05-27 17:19 ` sashiko-bot
2026-05-27 11:23 ` [PATCH 0/15] mm: introduce ANON_VMA_LAZY for deferred anon_vma creation Pedro Falcato
2026-05-28 6:45 ` wangtao
2026-05-28 7:14 ` Lorenzo Stoakes
2026-05-27 11:30 ` Lorenzo Stoakes
2026-05-28 7:11 ` wangtao
2026-05-28 7:22 ` Lorenzo Stoakes
2026-05-27 14:33 ` Lorenzo Stoakes
2026-05-28 7:57 ` wangtao
2026-05-28 8:14 ` Lorenzo Stoakes
2026-05-28 23:31 ` Barry Song
2026-05-29 2:20 ` wangzicheng
2026-05-29 6:56 ` Lorenzo Stoakes
2026-05-29 6:45 ` Lorenzo Stoakes
2026-05-29 9:41 ` wangtao
2026-05-29 12:03 ` Lorenzo Stoakes
2026-06-01 1:46 ` wangtao
2026-06-02 2:15 ` Barry Song
2026-06-02 2:46 ` Lance Yang
2026-06-02 15:37 ` Lorenzo Stoakes
2026-06-02 19:44 ` Pedro Falcato
2026-06-02 23:03 ` Barry Song
2026-06-03 7:07 ` Lorenzo Stoakes
2026-06-02 19:56 ` Harry Yoo
2026-06-02 22:27 ` Barry Song
2026-06-02 20:47 ` Lorenzo Stoakes
2026-05-29 15:07 ` Jonathan Corbet
2026-05-29 15:40 ` Lorenzo Stoakes
2026-05-30 11:28 ` Barry Song
2026-06-02 16:07 ` Harry Yoo
2026-06-03 2:59 ` wangtao
2026-06-03 3:12 ` wangtao
2026-06-03 7:54 ` Lorenzo Stoakes
2026-06-03 11:05 ` wangtao
2026-06-03 11:53 ` Lorenzo Stoakes
2026-06-04 3:50 ` wangtao
2026-06-03 20:25 ` David Hildenbrand (Arm)
2026-06-03 22:14 ` Barry Song
2026-06-04 4:03 ` wangtao
2026-06-04 4:20 ` Barry Song
2026-06-04 7:35 ` wangtao
2026-06-09 15:26 ` Suren Baghdasaryan
2026-06-09 15:49 ` David Hildenbrand (Arm)
2026-06-04 3:10 ` xu.xin16
2026-06-04 4:10 ` wangtao
2026-06-05 9:38 ` David Hildenbrand (Arm)
2026-06-05 10:07 ` Lorenzo Stoakes
2026-06-05 10:56 ` David Hildenbrand (Arm)
2026-06-04 9:40 ` Lorenzo Stoakes
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=20260527122359.ECD9C1F00A3C@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=damon@lists.linux.dev \
--cc=sashiko-reviews@lists.linux.dev \
--cc=tao.wangtao@honor.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.