Re: [PATCH] mm/page_vma_mapped: revalidate and do proper check before return device-private pmd
From: Lance Yang
Date: Mon Jun 22 2026 - 11:01:48 EST
On 2026/6/22 22:21, Wei Yang wrote:
On Mon, Jun 22, 2026 at 02:46:40PM +0100, Lorenzo Stoakes wrote:
+cc Lance, linux-kernel
Your subject line is 83 characters long and is way too detailed how about 'fix
device-private PMD handling'?
Got it.
You forgot to include linux-kernel@xxxxxxxxxxxxxxx on the mail, lore seems to be
a bit broken atm but in general it's helpful to include that.
Got it.
So usually we send a patch to both linux-mm and linux-kernel? If so, I
remember is later actions.
Yeah, please keep linux-kernel copied too. For MM patches, linux-mm +
linux-kernel is the right default, IMHO :)
[...]
Also is useful to make this [PATCH mm-hotfixes] to make it really clear it's
intended as a hotfix.
Got it.
----8<----
>From e6a3c1c782714ed831c4d46a14bb99226423bf59 Mon Sep 17 00:00:00 2001
From: Wei Yang <richard.weiyang@xxxxxxxxx>
Date: Mon, 22 Jun 2026 13:06:51 +0000
Subject: [PATCH] refactored
Signed-off-by: Lorenzo Stoakes <ljs@xxxxxxxxxx>
---
mm/page_vma_mapped.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 2ccbabfb2cc1..17dff8aab9f9 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -269,14 +269,24 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
/* THP pmd was split under us: handle on pte level */
spin_unlock(pvmw->ptl);
pvmw->ptl = NULL;
- } else if (!pmd_present(pmde)) {
- const softleaf_t entry = softleaf_from_pmd(pmde);
+ } else if (pmd_is_device_private_entry(pmde)) {
+ softleaf_t entry;
+
+ pvmw->ptl = pmd_lock(mm, pvmw->pmd);
+ pmde = *pvmw->pmd;
+ entry = softleaf_from_pmd(pmde);
- if (softleaf_is_device_private(entry)) {
- pvmw->ptl = pmd_lock(mm, pvmw->pmd);
+ if (likely(softleaf_is_device_private(entry))) {
+ if (pvmw->flags & PVMW_MIGRATION)
+ return not_found(pvmw);
+ if (!check_pmd(softleaf_to_pfn(entry), pvmw))
+ return not_found(pvmw);
return true;
}
-
+ /* device-private pmd was split under us: handle on pte level */
+ spin_unlock(pvmw->ptl);
+ pvmw->ptl = NULL;
+ } else if (!pmd_present(pmde)) {
if ((pvmw->flags & PVMW_SYNC) &&
thp_vma_suitable_order(vma, pvmw->address,
PMD_ORDER) &&
--
2.54.0
If we prefer this way, I will check and take it.
And +1 on Lorenzo's diff. Much cleaner.
Cheers, Lance