From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Baolin Wang <baolin.wang@linux.alibaba.com>, akpm@linux-foundation.org
Cc: ljs@kernel.org, liam@infradead.org, vbabka@kernel.org,
rppt@kernel.org, surenb@google.com, mhocko@suse.com,
qi.zheng@linux.dev, jack@suse.cz, pfalcato@suse.de,
ayushr@modal.com, linux-mm@kvack.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v6] mm: memory: fix truncation removing mapped folios
Date: Wed, 28 Oct 2026 09:44:49 +0100 [thread overview]
Message-ID: <81862da7-21c7-4060-87f5-09650582ea24@kernel.org> (raw)
In-Reply-To: <14ebbd556cc4941f0ebc43da59fa6a2fdca25dc8.1793148609.git.baolin.wang@linux.alibaba.com>
On 10/28/26 01:52, Baolin Wang wrote:
> Ayush reported an issue that shmem/tmpfs folios are still mapped when
> truncating them on production:
> "
> BUG: Bad page cache in process ... pfn:...
> page dumped because: still mapped when deleted
> "
>
> I reproduced the issue with Ayush's reproducer [1] with the latest mm-unstable
> branch, and I got the following crash info. From the dump message, we can
> see that truncate_inode_folio() is really trying to remove mapped folios,
> which is incorrect.
>
> "
> [ 189.171977] page: refcount:3 mapcount:1 mapping:00000000fe168ee1
> index:0x3880 pfn:0x191647
> [ 189.171995] memcg:ffff0000cc073d40
> [ 189.171997] aops:shmem_aops ino:3c01 dentry name(?):"memfd:runsc-memory"
> [ 189.172006] flags: 0x17fffef0002022d(locked|referenced|uptodate|lru|
> workingset|swapbacked|node=0|zone=2|lastcpupid=0x3ffff)
> .......
> [ 189.172017] page dumped because: VM_BUG_ON_FOLIO(folio_mapped(folio))
> [ 189.172026] ------------[ cut here ]------------
> [ 189.172027] kernel BUG at mm/filemap.c:155!
> [ 189.172057] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
> .......
> [ 189.177721] CPU: 3 UID: 0 PID: 5521 Comm: repro Kdump: loaded Tainted:
> 7.3.0-rc4+ #277 PREEMPT(lazy)
> .......
> [ 189.183986] Call trace:
> [ 189.184124] filemap_unaccount_folio+0xf0/0x1e8 (P)
> [ 189.184391] __filemap_remove_folio+0x34/0x160
> [ 189.184633] filemap_remove_folio+0x4c/0xb0
> [ 189.184859] truncate_inode_folio+0x34/0x58
> [ 189.185087] shmem_undo_range+0x220/0x658
> [ 189.185308] shmem_fallocate+0x2f0/0x470
> [ 189.185527] vfs_fallocate+0x128/0x328
> ......
> [ 189.187078] el0t_64_sync+0x184/0x188
> "
>
> After analysis, I believe the race exists between truncation and MADV_DONTNEED,
> and shmem's ->map_pages() merely makes the issue easier to reproduce. Since
> MADV_DONTNEED synchronously releases the pagetable page before calling
> tlb_flush_rmaps(), this could cause another thread's truncation to skip
> zap_pte_range() (due to pmd is none) but still observe the folio's mapcount
> as non-zero. A possible race scenario is as follows:
>
> CPU 0 CPU 1
> shmem_fallocate madvise_dontneed_single_vma
> unmap_mapping_range .......
> ......
> (filemap_map_pages() remap folios)
> zap_pte_range
> truncate_inode_folio zap_empty_pte_table(pmd clear)
> unmap_mapping_folio
> ......
> zap_pmd_range (saw pmd none, skip)
>
> filemap_remove_folio
> BUG_ON(folio_mapped)
> tlb_flush_rmaps(remove rmaps)
>
> To fix this issue, we should move the pmd clear operation (via zap_empty_pte_table())
> to after tlb_flush_rmaps() and use sync_with_folio_pmd_zap() to sync with
> concurrent zapping, so that when we find a pmd_none() while unmapping a folio
> without holding the PTL, the folio's mappings are guaranteed to have been
> removed via tlb_flush_rmaps().
>
> Meanwhile move the second pmd_none() check to where it belongs: if splitting
> zapped the PMD.
>
> [1] https://lore.kernel.org/all/20260925065013.3682431-1-ayushr@modal.com/
> Reported-by: Ayush Ranjan <ayushr@modal.com>
> Closes: https://lore.kernel.org/all/20260924061708.1645968-1-ayushr@modal.com/
> Fixes: 6375e95f381e ("mm: pgtable: reclaim empty PTE page in madvise(MADV_DONTNEED)")
> Cc: stable@vger.kernel.org
> Acked-by: Qi Zheng <qi.zheng@linux.dev>
> Reviewed-by: Pedro Falcato <pfalcato@suse.de>
> Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
> ---
> Andrew, sorry for the trouble caused by the several iterations:).
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Let's see what the fallout from this one will be (performance wise :) )
--
Cheers,
David
prev parent reply other threads:[~2026-10-28 8:44 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 0:52 Baolin Wang
2026-10-28 8:44 ` David Hildenbrand (Arm) [this message]
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=81862da7-21c7-4060-87f5-09650582ea24@kernel.org \
--to=david@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=ayushr@modal.com \
--cc=baolin.wang@linux.alibaba.com \
--cc=jack@suse.cz \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=mhocko@suse.com \
--cc=pfalcato@suse.de \
--cc=qi.zheng@linux.dev \
--cc=rppt@kernel.org \
--cc=surenb@google.com \
--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®