Skip to content

Commit e3d8707

Browse files
Dev Jainakpm00
authored andcommitted
selftests/mm/hmm-tests: test pagemap reads of PMD device-private entries
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. Link: https://lore.kernel.org/20260604055308.1947679-3-dev.jain@arm.com Signed-off-by: Dev Jain <dev.jain@arm.com> Reviewed-by: Lorenzo Stoakes <ljs@kernel.org> Cc: Balbir Singh <balbirs@nvidia.com> Cc: David Hildenbrand (Arm) <david@kernel.org> Cc: Oscar Salvador (SUSE) <osalvador@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent cd1fc0e commit e3d8707

1 file changed

Lines changed: 32 additions & 2 deletions

File tree

tools/testing/selftests/mm/hmm-tests.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2274,8 +2274,11 @@ TEST_F(hmm, migrate_anon_huge_fault)
22742274
unsigned long npages;
22752275
unsigned long size;
22762276
unsigned long i;
2277+
unsigned char *m;
2278+
uint64_t entry;
22772279
void *old_ptr;
22782280
void *map;
2281+
int pagemap_fd;
22792282
int *ptr;
22802283
int ret;
22812284

@@ -2298,15 +2301,16 @@ TEST_F(hmm, migrate_anon_huge_fault)
22982301

22992302
npages = size >> self->page_shift;
23002303
map = (void *)ALIGN((uintptr_t)buffer->ptr, size);
2301-
ret = madvise(map, size, MADV_HUGEPAGE);
2302-
ASSERT_EQ(ret, 0);
23032304
old_ptr = buffer->ptr;
23042305
buffer->ptr = map;
23052306

23062307
/* Initialize buffer in system memory. */
23072308
for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
23082309
ptr[i] = i;
23092310

2311+
ret = madvise(map, size, MADV_COLLAPSE);
2312+
ASSERT_EQ(ret, 0);
2313+
23102314
/* Migrate memory to device. */
23112315
ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages);
23122316
ASSERT_EQ(ret, 0);
@@ -2316,6 +2320,32 @@ TEST_F(hmm, migrate_anon_huge_fault)
23162320
for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
23172321
ASSERT_EQ(ptr[i], i);
23182322

2323+
if (!hmm_is_coherent_type(variant->device_number)) {
2324+
ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_SNAPSHOT,
2325+
buffer, npages);
2326+
ASSERT_EQ(ret, 0);
2327+
ASSERT_EQ(buffer->cpages, npages);
2328+
2329+
m = buffer->mirror;
2330+
for (i = 0; i < npages; ++i)
2331+
ASSERT_EQ(m[i], HMM_DMIRROR_PROT_DEV_PRIVATE_LOCAL |
2332+
HMM_DMIRROR_PROT_WRITE |
2333+
HMM_DMIRROR_PROT_PMD);
2334+
2335+
pagemap_fd = open("/proc/self/pagemap", O_RDONLY);
2336+
ASSERT_GE(pagemap_fd, 0);
2337+
2338+
for (i = 0; i < npages; ++i) {
2339+
entry = pagemap_get_entry(pagemap_fd,
2340+
(char *)buffer->ptr + i * self->page_size);
2341+
2342+
ASSERT_NE(entry & PM_SWAP, 0);
2343+
ASSERT_FALSE(PAGEMAP_PRESENT(entry));
2344+
}
2345+
2346+
close(pagemap_fd);
2347+
}
2348+
23192349
/* Fault pages back to system memory and check them. */
23202350
for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
23212351
ASSERT_EQ(ptr[i], i);

0 commit comments

Comments
 (0)