* [PATCH v2 1/3] selftests/mm: make file-backed THP split work by writing PMD size data
@ 2025-01-22 16:19 Zi Yan
2025-01-22 16:19 ` [PATCH v2 2/3] mm/huge_memory: allow split shmem large folio to any lower order Zi Yan
2025-01-22 16:19 ` [PATCH v2 3/3] selftests/mm: test splitting file-backed THP " Zi Yan
0 siblings, 2 replies; 4+ messages in thread
From: Zi Yan @ 2025-01-22 16:19 UTC (permalink / raw)
To: linux-mm, Andrew Morton, Baolin Wang, David Hildenbrand
Cc: Kirill A . Shutemov, Matthew Wilcox (Oracle),
Ryan Roberts, Hugh Dickins, Yang Shi, Miaohe Lin, Kefeng Wang,
Yu Zhao, John Hubbard, linux-kselftest, linux-kernel, Zi Yan
Commit acd7ccb284b8 ("mm: shmem: add large folio support for tmpfs")
changes huge=always to allocate THP/mTHP based on write size and
split_huge_page_test does not write PMD size data, so file-back THP is not
created during the test. Fix it by writing PMD size data.
Signed-off-by: Zi Yan <ziy@nvidia.com>
---
V1 -> V2: write PMD size data instead of setting
/sys/kernel/mm/transparent_hugepage/shmem_enabled to "force".
.../selftests/mm/split_huge_page_test.c | 52 ++++++++++++++++---
1 file changed, 44 insertions(+), 8 deletions(-)
diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/testing/selftests/mm/split_huge_page_test.c
index 3f353f3d070f..ba498aaaf857 100644
--- a/tools/testing/selftests/mm/split_huge_page_test.c
+++ b/tools/testing/selftests/mm/split_huge_page_test.c
@@ -265,14 +265,28 @@ void split_file_backed_thp(void)
{
int status;
int fd;
- ssize_t num_written;
char tmpfs_template[] = "/tmp/thp_split_XXXXXX";
const char *tmpfs_loc = mkdtemp(tmpfs_template);
char testfile[INPUT_MAX];
+ ssize_t num_written, num_read;
+ char *file_buf1, *file_buf2;
uint64_t pgoff_start = 0, pgoff_end = 1024;
+ int i;
ksft_print_msg("Please enable pr_debug in split_huge_pages_in_file() for more info.\n");
+ file_buf1 = (char *)malloc(pmd_pagesize);
+ file_buf2 = (char *)malloc(pmd_pagesize);
+
+ if (!file_buf1 || !file_buf2) {
+ ksft_print_msg("cannot allocate file buffers\n");
+ goto out;
+ }
+
+ for (i = 0; i < pmd_pagesize; i++)
+ file_buf1[i] = (char)i;
+ memset(file_buf2, 0, pmd_pagesize);
+
status = mount("tmpfs", tmpfs_loc, "tmpfs", 0, "huge=always,size=4m");
if (status)
@@ -281,26 +295,45 @@ void split_file_backed_thp(void)
status = snprintf(testfile, INPUT_MAX, "%s/thp_file", tmpfs_loc);
if (status >= INPUT_MAX) {
ksft_exit_fail_msg("Fail to create file-backed THP split testing file\n");
+ goto cleanup;
}
- fd = open(testfile, O_CREAT|O_WRONLY, 0664);
+ fd = open(testfile, O_CREAT|O_RDWR, 0664);
if (fd == -1) {
ksft_perror("Cannot open testing file");
goto cleanup;
}
- /* write something to the file, so a file-backed THP can be allocated */
- num_written = write(fd, tmpfs_loc, strlen(tmpfs_loc) + 1);
- close(fd);
+ /* write pmd size data to the file, so a file-backed THP can be allocated */
+ num_written = write(fd, file_buf1, pmd_pagesize);
- if (num_written < 1) {
- ksft_perror("Fail to write data to testing file");
- goto cleanup;
+ if (num_written == -1 || num_written != pmd_pagesize) {
+ ksft_perror("Failed to write data to testing file");
+ goto close_file;
}
/* split the file-backed THP */
write_debugfs(PATH_FMT, testfile, pgoff_start, pgoff_end, 0);
+ /* check file content after split */
+ status = lseek(fd, 0, SEEK_SET);
+ if (status == -1) {
+ ksft_perror("Cannot lseek file");
+ goto close_file;
+ }
+
+ num_read = read(fd, file_buf2, num_written);
+ if (num_read == -1 || num_read != num_written) {
+ ksft_perror("Cannot read file content back");
+ goto close_file;
+ }
+
+ if (strncmp(file_buf1, file_buf2, pmd_pagesize) != 0) {
+ ksft_print_msg("File content changed\n");
+ goto close_file;
+ }
+
+ close(fd);
status = unlink(testfile);
if (status) {
ksft_perror("Cannot remove testing file");
@@ -321,9 +354,12 @@ void split_file_backed_thp(void)
ksft_test_result_pass("File-backed THP split test done\n");
return;
+close_file:
+ close(fd);
cleanup:
umount(tmpfs_loc);
rmdir(tmpfs_loc);
+out:
ksft_exit_fail_msg("Error occurred\n");
}
--
2.45.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 2/3] mm/huge_memory: allow split shmem large folio to any lower order
2025-01-22 16:19 [PATCH v2 1/3] selftests/mm: make file-backed THP split work by writing PMD size data Zi Yan
@ 2025-01-22 16:19 ` Zi Yan
2025-01-22 17:58 ` Yang Shi
2025-01-22 16:19 ` [PATCH v2 3/3] selftests/mm: test splitting file-backed THP " Zi Yan
1 sibling, 1 reply; 4+ messages in thread
From: Zi Yan @ 2025-01-22 16:19 UTC (permalink / raw)
To: linux-mm, Andrew Morton, Baolin Wang, David Hildenbrand
Cc: Kirill A . Shutemov, Matthew Wilcox (Oracle),
Ryan Roberts, Hugh Dickins, Yang Shi, Miaohe Lin, Kefeng Wang,
Yu Zhao, John Hubbard, linux-kselftest, linux-kernel, Zi Yan
Commit 4d684b5f92ba ("mm: shmem: add large folio support for tmpfs") has
added large folio support to shmem. Remove the restriction in
split_huge_page*().
Signed-off-by: Zi Yan <ziy@nvidia.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
---
mm/huge_memory.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 3d3ebdc002d5..deb4e72daeb9 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -3299,7 +3299,7 @@ static void __split_huge_page(struct page *page, struct list_head *list,
/* Some pages can be beyond EOF: drop them from page cache */
if (tail->index >= end) {
if (shmem_mapping(folio->mapping))
- nr_dropped++;
+ nr_dropped += new_nr;
else if (folio_test_clear_dirty(tail))
folio_account_cleaned(tail,
inode_to_wb(folio->mapping->host));
@@ -3465,12 +3465,6 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
return -EINVAL;
}
} else if (new_order) {
- /* Split shmem folio to non-zero order not supported */
- if (shmem_mapping(folio->mapping)) {
- VM_WARN_ONCE(1,
- "Cannot split shmem folio to non-0 order");
- return -EINVAL;
- }
/*
* No split if the file system does not support large folio.
* Note that we might still have THPs in such mappings due to
--
2.45.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 3/3] selftests/mm: test splitting file-backed THP to any lower order.
2025-01-22 16:19 [PATCH v2 1/3] selftests/mm: make file-backed THP split work by writing PMD size data Zi Yan
2025-01-22 16:19 ` [PATCH v2 2/3] mm/huge_memory: allow split shmem large folio to any lower order Zi Yan
@ 2025-01-22 16:19 ` Zi Yan
1 sibling, 0 replies; 4+ messages in thread
From: Zi Yan @ 2025-01-22 16:19 UTC (permalink / raw)
To: linux-mm, Andrew Morton, Baolin Wang, David Hildenbrand
Cc: Kirill A . Shutemov, Matthew Wilcox (Oracle),
Ryan Roberts, Hugh Dickins, Yang Shi, Miaohe Lin, Kefeng Wang,
Yu Zhao, John Hubbard, linux-kselftest, linux-kernel, Zi Yan
Now split_huge_page*() supports shmem THP split to any lower order.
Test it.
The test now reads file content out after split to check if the split
corrupts the file data.
Signed-off-by: Zi Yan <ziy@nvidia.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Tested-by: Baolin Wang <baolin.wang@linux.alibaba.com>
---
tools/testing/selftests/mm/split_huge_page_test.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/testing/selftests/mm/split_huge_page_test.c
index ba498aaaf857..e0304046b1a0 100644
--- a/tools/testing/selftests/mm/split_huge_page_test.c
+++ b/tools/testing/selftests/mm/split_huge_page_test.c
@@ -261,7 +261,7 @@ void split_pte_mapped_thp(void)
close(kpageflags_fd);
}
-void split_file_backed_thp(void)
+void split_file_backed_thp(int order)
{
int status;
int fd;
@@ -313,7 +313,7 @@ void split_file_backed_thp(void)
}
/* split the file-backed THP */
- write_debugfs(PATH_FMT, testfile, pgoff_start, pgoff_end, 0);
+ write_debugfs(PATH_FMT, testfile, pgoff_start, pgoff_end, order);
/* check file content after split */
status = lseek(fd, 0, SEEK_SET);
@@ -351,7 +351,7 @@ void split_file_backed_thp(void)
ksft_exit_fail_msg("cannot remove tmp dir: %s\n", strerror(errno));
ksft_print_msg("Please check dmesg for more information\n");
- ksft_test_result_pass("File-backed THP split test done\n");
+ ksft_test_result_pass("File-backed THP split to order %d test done\n", order);
return;
close_file:
@@ -517,7 +517,7 @@ int main(int argc, char **argv)
if (argc > 1)
optional_xfs_path = argv[1];
- ksft_set_plan(1+8+2+9);
+ ksft_set_plan(1+8+1+9+9);
pagesize = getpagesize();
pageshift = ffs(pagesize) - 1;
@@ -534,7 +534,8 @@ int main(int argc, char **argv)
split_pmd_thp_to_order(i);
split_pte_mapped_thp();
- split_file_backed_thp();
+ for (i = 0; i < 9; i++)
+ split_file_backed_thp(i);
created_tmp = prepare_thp_fs(optional_xfs_path, fs_loc_template,
&fs_loc);
--
2.45.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 2/3] mm/huge_memory: allow split shmem large folio to any lower order
2025-01-22 16:19 ` [PATCH v2 2/3] mm/huge_memory: allow split shmem large folio to any lower order Zi Yan
@ 2025-01-22 17:58 ` Yang Shi
0 siblings, 0 replies; 4+ messages in thread
From: Yang Shi @ 2025-01-22 17:58 UTC (permalink / raw)
To: Zi Yan, linux-mm, Andrew Morton, Baolin Wang, David Hildenbrand
Cc: Kirill A . Shutemov, Matthew Wilcox (Oracle),
Ryan Roberts, Hugh Dickins, Miaohe Lin, Kefeng Wang, Yu Zhao,
John Hubbard, linux-kselftest, linux-kernel
On 1/22/25 8:19 AM, Zi Yan wrote:
> Commit 4d684b5f92ba ("mm: shmem: add large folio support for tmpfs") has
> added large folio support to shmem. Remove the restriction in
> split_huge_page*().
Reviewed-by: Yang Shi <yang@os.amperecomputing.com>
>
> Signed-off-by: Zi Yan <ziy@nvidia.com>
> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
> ---
> mm/huge_memory.c | 8 +-------
> 1 file changed, 1 insertion(+), 7 deletions(-)
>
> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> index 3d3ebdc002d5..deb4e72daeb9 100644
> --- a/mm/huge_memory.c
> +++ b/mm/huge_memory.c
> @@ -3299,7 +3299,7 @@ static void __split_huge_page(struct page *page, struct list_head *list,
> /* Some pages can be beyond EOF: drop them from page cache */
> if (tail->index >= end) {
> if (shmem_mapping(folio->mapping))
> - nr_dropped++;
> + nr_dropped += new_nr;
> else if (folio_test_clear_dirty(tail))
> folio_account_cleaned(tail,
> inode_to_wb(folio->mapping->host));
> @@ -3465,12 +3465,6 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list,
> return -EINVAL;
> }
> } else if (new_order) {
> - /* Split shmem folio to non-zero order not supported */
> - if (shmem_mapping(folio->mapping)) {
> - VM_WARN_ONCE(1,
> - "Cannot split shmem folio to non-0 order");
> - return -EINVAL;
> - }
> /*
> * No split if the file system does not support large folio.
> * Note that we might still have THPs in such mappings due to
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-01-22 17:58 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-01-22 16:19 [PATCH v2 1/3] selftests/mm: make file-backed THP split work by writing PMD size data Zi Yan
2025-01-22 16:19 ` [PATCH v2 2/3] mm/huge_memory: allow split shmem large folio to any lower order Zi Yan
2025-01-22 17:58 ` Yang Shi
2025-01-22 16:19 ` [PATCH v2 3/3] selftests/mm: test splitting file-backed THP " Zi Yan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox