* [PATCH v3 0/2] mm/hmm: A fix and a selftest
@ 2026-06-04 5:53 Dev Jain
2026-06-04 5:53 ` [PATCH v3 1/2] fs/proc/task_mmu: do not warn on seeing non-migration pmd entry Dev Jain
2026-06-04 5:53 ` [PATCH v3 2/2] selftests/mm/hmm-tests: test pagemap reads of PMD device-private entries Dev Jain
0 siblings, 2 replies; 4+ messages in thread
From: Dev Jain @ 2026-06-04 5:53 UTC (permalink / raw)
To: akpm, liam, ljs, jgg, leon, david, shuah
Cc: Dev Jain, vbabka, jannh, pfalcato, balbirs, linux-mm,
linux-kernel, linux-fsdevel, rppt, surenb, mhocko,
linux-kselftest, ryan.roberts, anshuman.khandual, usama.arif
Patch 1 fixes a stale warning present from the time when only migration
softleaf entries were supported at the PMD level.
Patch 2 adds some code into hmm-tests.c which exercises the pagemap path
for PMD device-private entries.
---
Applies on mm-unstable (d17fe8a046a2).
v2->v3:
- Use MADV_COLLAPSE, use PAGEMAP_PRESENT
v1->v2:
- Add test
Dev Jain (2):
fs/proc/task_mmu: do not warn on seeing non-migration pmd entry
selftests/mm/hmm-tests: test pagemap reads of PMD device-private
entries
fs/proc/task_mmu.c | 1 -
tools/testing/selftests/mm/hmm-tests.c | 34 ++++++++++++++++++++++++--
2 files changed, 32 insertions(+), 3 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v3 1/2] fs/proc/task_mmu: do not warn on seeing non-migration pmd entry 2026-06-04 5:53 [PATCH v3 0/2] mm/hmm: A fix and a selftest Dev Jain @ 2026-06-04 5:53 ` Dev Jain 2026-06-04 5:53 ` [PATCH v3 2/2] selftests/mm/hmm-tests: test pagemap reads of PMD device-private entries Dev Jain 1 sibling, 0 replies; 4+ messages in thread From: Dev Jain @ 2026-06-04 5:53 UTC (permalink / raw) To: akpm, liam, ljs, jgg, leon, david, shuah Cc: Dev Jain, vbabka, jannh, pfalcato, balbirs, linux-mm, linux-kernel, linux-fsdevel, rppt, surenb, mhocko, linux-kselftest, ryan.roberts, anshuman.khandual, usama.arif, stable, Oscar Salvador pagemap_pmd_range_thp() warns if a non-present PMD is not a migration entry. This became false once device-private entries at the PMD level were added. Therefore, remove the stale migration-only assertion. Fixes: a30b48bf1b24 ("mm/migrate_device: implement THP migration of zone device pages") Cc: stable@vger.kernel.org Reviewed-by: Balbir Singh <balbirs@nvidia.com> Reviewed-by: Lorenzo Stoakes <ljs@kernel.org> Tested-by: Lorenzo Stoakes <ljs@kernel.org> Acked-by: David Hildenbrand (Arm) <david@kernel.org> Reviewed-by: Oscar Salvador (SUSE) <osalvador@kernel.org> Signed-off-by: Dev Jain <dev.jain@arm.com> --- fs/proc/task_mmu.c | 1 - 1 file changed, 1 deletion(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 1e3a15bf46f4e..58938e62154d9 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -2129,7 +2129,6 @@ static int pagemap_pmd_range_thp(pmd_t *pmdp, unsigned long addr, flags |= PM_SOFT_DIRTY; if (pmd_swp_uffd_wp(pmd)) flags |= PM_UFFD_WP; - VM_WARN_ON_ONCE(!pmd_is_migration_entry(pmd)); page = softleaf_to_page(entry); } -- 2.43.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 2/2] selftests/mm/hmm-tests: test pagemap reads of PMD device-private entries 2026-06-04 5:53 [PATCH v3 0/2] mm/hmm: A fix and a selftest Dev Jain 2026-06-04 5:53 ` [PATCH v3 1/2] fs/proc/task_mmu: do not warn on seeing non-migration pmd entry Dev Jain @ 2026-06-04 5:53 ` Dev Jain 2026-06-05 11:31 ` Lorenzo Stoakes 1 sibling, 1 reply; 4+ messages in thread From: Dev Jain @ 2026-06-04 5:53 UTC (permalink / raw) To: akpm, liam, ljs, jgg, leon, david, shuah Cc: Dev Jain, vbabka, jannh, pfalcato, balbirs, linux-mm, linux-kernel, linux-fsdevel, rppt, surenb, mhocko, linux-kselftest, ryan.roberts, anshuman.khandual, usama.arif To cover pagemap paths scanning PMD entries, add assertions to check whether a device-private PMD entry has the correct pagemap information - the PM_SWAP bit must be on in the pagemap entry. Before that, we must assert through HMM_DMIRROR_SNAPSHOT snapshot that the leaf entry is at PMD level and not PTE level. Signed-off-by: Dev Jain <dev.jain@arm.com> --- tools/testing/selftests/mm/hmm-tests.c | 34 ++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/mm/hmm-tests.c b/tools/testing/selftests/mm/hmm-tests.c index e1c8a679a4cf3..46e0c8c921c3d 100644 --- a/tools/testing/selftests/mm/hmm-tests.c +++ b/tools/testing/selftests/mm/hmm-tests.c @@ -2276,8 +2276,11 @@ TEST_F(hmm, migrate_anon_huge_fault) unsigned long npages; unsigned long size; unsigned long i; + unsigned char *m; + uint64_t entry; void *old_ptr; void *map; + int pagemap_fd; int *ptr; int ret; @@ -2300,8 +2303,6 @@ TEST_F(hmm, migrate_anon_huge_fault) npages = size >> self->page_shift; map = (void *)ALIGN((uintptr_t)buffer->ptr, size); - ret = madvise(map, size, MADV_HUGEPAGE); - ASSERT_EQ(ret, 0); old_ptr = buffer->ptr; buffer->ptr = map; @@ -2309,6 +2310,9 @@ TEST_F(hmm, migrate_anon_huge_fault) for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i) ptr[i] = i; + ret = madvise(map, size, MADV_COLLAPSE); + ASSERT_EQ(ret, 0); + /* Migrate memory to device. */ ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages); ASSERT_EQ(ret, 0); @@ -2318,6 +2322,32 @@ TEST_F(hmm, migrate_anon_huge_fault) for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) ASSERT_EQ(ptr[i], i); + if (!hmm_is_coherent_type(variant->device_number)) { + ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_SNAPSHOT, + buffer, npages); + ASSERT_EQ(ret, 0); + ASSERT_EQ(buffer->cpages, npages); + + m = buffer->mirror; + for (i = 0; i < npages; ++i) + ASSERT_EQ(m[i], HMM_DMIRROR_PROT_DEV_PRIVATE_LOCAL | + HMM_DMIRROR_PROT_WRITE | + HMM_DMIRROR_PROT_PMD); + + pagemap_fd = open("/proc/self/pagemap", O_RDONLY); + ASSERT_GE(pagemap_fd, 0); + + for (i = 0; i < npages; ++i) { + entry = pagemap_get_entry(pagemap_fd, + (char *)buffer->ptr + i * self->page_size); + + ASSERT_NE(entry & PM_SWAP, 0); + ASSERT_FALSE(PAGEMAP_PRESENT(entry)); + } + + close(pagemap_fd); + } + /* Fault pages back to system memory and check them. */ for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i) ASSERT_EQ(ptr[i], i); -- 2.43.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v3 2/2] selftests/mm/hmm-tests: test pagemap reads of PMD device-private entries 2026-06-04 5:53 ` [PATCH v3 2/2] selftests/mm/hmm-tests: test pagemap reads of PMD device-private entries Dev Jain @ 2026-06-05 11:31 ` Lorenzo Stoakes 0 siblings, 0 replies; 4+ messages in thread From: Lorenzo Stoakes @ 2026-06-05 11:31 UTC (permalink / raw) To: Dev Jain Cc: akpm, liam, jgg, leon, david, shuah, vbabka, jannh, pfalcato, balbirs, linux-mm, linux-kernel, linux-fsdevel, rppt, surenb, mhocko, linux-kselftest, ryan.roberts, anshuman.khandual, usama.arif On Thu, Jun 04, 2026 at 05:53:06AM +0000, Dev Jain wrote: > To cover pagemap paths scanning PMD entries, add assertions to check > whether a device-private PMD entry has the correct pagemap information - > the PM_SWAP bit must be on in the pagemap entry. Before that, we must > assert through HMM_DMIRROR_SNAPSHOT snapshot that the leaf entry is > at PMD level and not PTE level. > > Signed-off-by: Dev Jain <dev.jain@arm.com> LGTM, and confirmed this triggers the issue locally so: Reviewed-by: Lorenzo Stoakes <ljs@kernel.org> > --- > tools/testing/selftests/mm/hmm-tests.c | 34 ++++++++++++++++++++++++-- > 1 file changed, 32 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/mm/hmm-tests.c b/tools/testing/selftests/mm/hmm-tests.c > index e1c8a679a4cf3..46e0c8c921c3d 100644 > --- a/tools/testing/selftests/mm/hmm-tests.c > +++ b/tools/testing/selftests/mm/hmm-tests.c > @@ -2276,8 +2276,11 @@ TEST_F(hmm, migrate_anon_huge_fault) > unsigned long npages; > unsigned long size; > unsigned long i; > + unsigned char *m; > + uint64_t entry; > void *old_ptr; > void *map; > + int pagemap_fd; > int *ptr; > int ret; > > @@ -2300,8 +2303,6 @@ TEST_F(hmm, migrate_anon_huge_fault) > > npages = size >> self->page_shift; > map = (void *)ALIGN((uintptr_t)buffer->ptr, size); > - ret = madvise(map, size, MADV_HUGEPAGE); > - ASSERT_EQ(ret, 0); > old_ptr = buffer->ptr; > buffer->ptr = map; > > @@ -2309,6 +2310,9 @@ TEST_F(hmm, migrate_anon_huge_fault) > for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i) > ptr[i] = i; > > + ret = madvise(map, size, MADV_COLLAPSE); > + ASSERT_EQ(ret, 0); > + > /* Migrate memory to device. */ > ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages); > ASSERT_EQ(ret, 0); > @@ -2318,6 +2322,32 @@ TEST_F(hmm, migrate_anon_huge_fault) > for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) > ASSERT_EQ(ptr[i], i); > > + if (!hmm_is_coherent_type(variant->device_number)) { > + ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_SNAPSHOT, > + buffer, npages); > + ASSERT_EQ(ret, 0); > + ASSERT_EQ(buffer->cpages, npages); > + > + m = buffer->mirror; > + for (i = 0; i < npages; ++i) > + ASSERT_EQ(m[i], HMM_DMIRROR_PROT_DEV_PRIVATE_LOCAL | > + HMM_DMIRROR_PROT_WRITE | > + HMM_DMIRROR_PROT_PMD); > + > + pagemap_fd = open("/proc/self/pagemap", O_RDONLY); > + ASSERT_GE(pagemap_fd, 0); > + > + for (i = 0; i < npages; ++i) { > + entry = pagemap_get_entry(pagemap_fd, > + (char *)buffer->ptr + i * self->page_size); > + > + ASSERT_NE(entry & PM_SWAP, 0); > + ASSERT_FALSE(PAGEMAP_PRESENT(entry)); > + } > + > + close(pagemap_fd); > + } > + > /* Fault pages back to system memory and check them. */ > for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i) > ASSERT_EQ(ptr[i], i); > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-06-05 11:32 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-06-04 5:53 [PATCH v3 0/2] mm/hmm: A fix and a selftest Dev Jain 2026-06-04 5:53 ` [PATCH v3 1/2] fs/proc/task_mmu: do not warn on seeing non-migration pmd entry Dev Jain 2026-06-04 5:53 ` [PATCH v3 2/2] selftests/mm/hmm-tests: test pagemap reads of PMD device-private entries Dev Jain 2026-06-05 11:31 ` Lorenzo Stoakes
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox