From: Usama Arif <usama.arif@linux•dev>
To: Andrew Morton <akpm@linux-foundation•org>,
david@kernel•org, Lorenzo Stoakes <ljs@kernel•org>,
willy@infradead•org, linux-mm@kvack•org
Cc: fvdl@google•com, hannes@cmpxchg•org, riel@surriel•com,
shakeel.butt@linux•dev, kas@kernel•org, baohua@kernel•org,
dev.jain@arm•com, baolin.wang@linux•alibaba.com,
npache@redhat•com, Liam.Howlett@oracle•com, ryan.roberts@arm•com,
Vlastimil Babka <vbabka@kernel•org>,
lance.yang@linux•dev, linux-kernel@vger•kernel.org,
kernel-team@meta•com, maddy@linux•ibm.com, mpe@ellerman•id.au,
linuxppc-dev@lists•ozlabs.org, hca@linux•ibm.com,
gor@linux•ibm.com, agordeev@linux•ibm.com,
borntraeger@linux•ibm.com, svens@linux•ibm.com,
linux-s390@vger•kernel.org, Usama Arif <usama.arif@linux•dev>
Subject: [v3 23/24] selftests/mm: add partial_mremap test for move_page_tables
Date: Thu, 26 Mar 2026 19:09:05 -0700 [thread overview]
Message-ID: <20260327021403.214713-24-usama.arif@linux.dev> (raw)
In-Reply-To: <20260327021403.214713-1-usama.arif@linux.dev>
Add test for partial mremap on THP which exercises move_page_tables().
This verifies that partial mremap correctly splits the PMD, moves
only the requested page, and preserves data integrity in both the
moved region and the original mapping.
Signed-off-by: Usama Arif <usama.arif@linux•dev>
---
.../testing/selftests/mm/thp_pmd_split_test.c | 50 +++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/tools/testing/selftests/mm/thp_pmd_split_test.c b/tools/testing/selftests/mm/thp_pmd_split_test.c
index 3c9f05457efec..1f29296759a5b 100644
--- a/tools/testing/selftests/mm/thp_pmd_split_test.c
+++ b/tools/testing/selftests/mm/thp_pmd_split_test.c
@@ -203,4 +203,54 @@ TEST_F(thp_pmd_split, partial_mlock)
self->split_pmd_failed_before);
}
+/*
+ * Partial mremap (move_page_tables)
+ *
+ * Tests that partial mremap of a THP correctly splits the PMD and
+ * moves only the requested portion. This exercises move_page_tables()
+ * which now handles split failures.
+ */
+TEST_F(thp_pmd_split, partial_mremap)
+{
+ void *new_addr;
+ unsigned long *ptr = (unsigned long *)self->aligned;
+ unsigned long *new_ptr;
+ unsigned long pattern = 0xABCDUL;
+ int ret;
+
+ ret = allocate_thp(self->aligned, self->pmdsize);
+ if (ret)
+ SKIP(return, "Failed to allocate THP");
+
+ /* Write pattern to the page we'll move */
+ ptr[self->pagesize / sizeof(unsigned long)] = pattern;
+
+ /* Also write to first and last page to verify they stay intact */
+ ptr[0] = 0x1234UL;
+ ptr[(self->pmdsize - self->pagesize) / sizeof(unsigned long)] = 0x4567UL;
+
+ /* Partial mremap - move one base page from the THP */
+ new_addr = mremap((char *)self->aligned + self->pagesize, self->pagesize,
+ self->pagesize, MREMAP_MAYMOVE);
+ if (new_addr == MAP_FAILED) {
+ if (errno == ENOMEM)
+ SKIP(return, "mremap failed with ENOMEM");
+ ASSERT_NE(new_addr, MAP_FAILED);
+ }
+
+ /* Verify data was moved correctly */
+ new_ptr = (unsigned long *)new_addr;
+ ASSERT_EQ(new_ptr[0], pattern);
+
+ /* Verify surrounding data is intact */
+ ASSERT_EQ(ptr[0], 0x1234UL);
+ ASSERT_EQ(ptr[(self->pmdsize - self->pagesize) / sizeof(unsigned long)], 0x4567UL);
+
+ /* Cleanup the moved page */
+ munmap(new_addr, self->pagesize);
+
+ log_and_check_pmd_split(_metadata, self->split_pmd_before,
+ self->split_pmd_failed_before);
+}
+
TEST_HARNESS_MAIN
--
2.52.0
next prev parent reply other threads:[~2026-03-27 2:17 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-27 2:08 [v3 00/24] mm: thp: lazy PTE page table allocation at PMD split time Usama Arif
2026-03-27 2:08 ` [v3 01/24] mm: thp: make split_huge_pmd functions return int for error propagation Usama Arif
2026-03-27 2:08 ` [v3 02/24] mm: thp: propagate split failure from vma_adjust_trans_huge() Usama Arif
2026-03-27 2:08 ` [v3 03/24] mm: thp: handle split failure in copy_huge_pmd() Usama Arif
2026-03-27 2:08 ` [v3 04/24] mm: thp: handle split failure in do_huge_pmd_wp_page() Usama Arif
2026-03-27 2:08 ` [v3 05/24] mm: thp: handle split failure in zap_pmd_range() Usama Arif
2026-03-30 14:13 ` Kiryl Shutsemau
2026-03-30 15:09 ` David Hildenbrand (Arm)
2026-03-27 2:08 ` [v3 06/24] mm: thp: handle split failure in wp_huge_pmd() Usama Arif
2026-03-27 2:08 ` [v3 07/24] mm: thp: retry on split failure in change_pmd_range() Usama Arif
2026-03-30 14:27 ` Kiryl Shutsemau
2026-03-27 2:08 ` [v3 08/24] mm: thp: handle split failure in follow_pmd_mask() Usama Arif
2026-03-27 2:08 ` [v3 09/24] mm: handle walk_page_range() failure from THP split Usama Arif
2026-03-27 2:08 ` [v3 10/24] mm: thp: handle split failure in mremap move_page_tables() Usama Arif
2026-03-27 2:08 ` [v3 11/24] mm: thp: handle split failure in userfaultfd move_pages() Usama Arif
2026-03-27 2:08 ` [v3 12/24] mm: thp: handle split failure in device migration Usama Arif
2026-03-27 2:08 ` [v3 13/24] mm: proc: handle split_huge_pmd failure in pagemap_scan Usama Arif
2026-03-27 2:08 ` [v3 14/24] powerpc/mm: handle split_huge_pmd failure in subpage_prot Usama Arif
2026-03-27 2:08 ` [v3 15/24] fs/dax: handle split_huge_pmd failure in dax_iomap_pmd_fault Usama Arif
2026-03-27 2:08 ` [v3 16/24] mm: huge_mm: Make sure all split_huge_pmd calls are checked Usama Arif
2026-03-30 14:41 ` Kiryl Shutsemau
2026-03-27 2:08 ` [v3 17/24] mm: thp: allocate PTE page tables lazily at split time Usama Arif
2026-03-27 2:09 ` [v3 18/24] mm: thp: remove pgtable_trans_huge_{deposit/withdraw} when not needed Usama Arif
2026-03-27 2:09 ` [v3 19/24] mm: thp: add THP_SPLIT_PMD_FAILED counter Usama Arif
2026-03-27 2:09 ` [v3 20/24] selftests/mm: add THP PMD split test infrastructure Usama Arif
2026-03-27 2:09 ` [v3 21/24] selftests/mm: add partial_mprotect test for change_pmd_range Usama Arif
2026-03-27 2:09 ` [v3 22/24] selftests/mm: add partial_mlock test Usama Arif
2026-03-27 2:09 ` Usama Arif [this message]
2026-03-27 2:09 ` [v3 24/24] selftests/mm: add madv_dontneed_partial test Usama Arif
2026-03-27 8:51 ` [v3 00/24] mm: thp: lazy PTE page table allocation at PMD split time David Hildenbrand (Arm)
2026-03-27 9:25 ` Lorenzo Stoakes (Oracle)
2026-03-27 14:40 ` Usama Arif
2026-03-27 14:34 ` Usama Arif
2026-04-05 23:34 ` Hugh Dickins
2026-04-08 15:06 ` Usama Arif
2026-04-08 19:49 ` Matthew Wilcox
2026-04-09 12:48 ` Usama Arif
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=20260327021403.214713-24-usama.arif@linux.dev \
--to=usama.arif@linux$(echo .)dev \
--cc=Liam.Howlett@oracle$(echo .)com \
--cc=agordeev@linux$(echo .)ibm.com \
--cc=akpm@linux-foundation$(echo .)org \
--cc=baohua@kernel$(echo .)org \
--cc=baolin.wang@linux$(echo .)alibaba.com \
--cc=borntraeger@linux$(echo .)ibm.com \
--cc=david@kernel$(echo .)org \
--cc=dev.jain@arm$(echo .)com \
--cc=fvdl@google$(echo .)com \
--cc=gor@linux$(echo .)ibm.com \
--cc=hannes@cmpxchg$(echo .)org \
--cc=hca@linux$(echo .)ibm.com \
--cc=kas@kernel$(echo .)org \
--cc=kernel-team@meta$(echo .)com \
--cc=lance.yang@linux$(echo .)dev \
--cc=linux-kernel@vger$(echo .)kernel.org \
--cc=linux-mm@kvack$(echo .)org \
--cc=linux-s390@vger$(echo .)kernel.org \
--cc=linuxppc-dev@lists$(echo .)ozlabs.org \
--cc=ljs@kernel$(echo .)org \
--cc=maddy@linux$(echo .)ibm.com \
--cc=mpe@ellerman$(echo .)id.au \
--cc=npache@redhat$(echo .)com \
--cc=riel@surriel$(echo .)com \
--cc=ryan.roberts@arm$(echo .)com \
--cc=shakeel.butt@linux$(echo .)dev \
--cc=svens@linux$(echo .)ibm.com \
--cc=vbabka@kernel$(echo .)org \
--cc=willy@infradead$(echo .)org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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