* [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option
@ 2025-01-22 12:40 Zi Yan
2025-01-22 12:40 ` [PATCH 2/3] mm/huge_memory: allow split shmem large folio to any lower order Zi Yan
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Zi Yan @ 2025-01-22 12:40 UTC (permalink / raw)
To: linux-mm, Andrew Morton, Baolin Wang
Cc: Kirill A . Shutemov, Matthew Wilcox (Oracle),
Ryan Roberts, Hugh Dickins, David Hildenbrand, 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.
Set /sys/kernel/mm/transparent_hugepage/shmem_enabled to "force" to force
THP allocation.
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>
---
.../selftests/mm/split_huge_page_test.c | 48 +++++++++++++++++--
1 file changed, 45 insertions(+), 3 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..8e15fc9dce3a 100644
--- a/tools/testing/selftests/mm/split_huge_page_test.c
+++ b/tools/testing/selftests/mm/split_huge_page_test.c
@@ -264,15 +264,46 @@ void split_pte_mapped_thp(void)
void split_file_backed_thp(void)
{
int status;
- int fd;
- ssize_t num_written;
+ int fd, shmem_sysctl_fd;
+ ssize_t num_written, num_read;
char tmpfs_template[] = "/tmp/thp_split_XXXXXX";
const char *tmpfs_loc = mkdtemp(tmpfs_template);
- char testfile[INPUT_MAX];
+ char testfile[INPUT_MAX], sysctl_buf[INPUT_MAX] = {0};
uint64_t pgoff_start = 0, pgoff_end = 1024;
+ const char *shmem_sysctl = "/sys/kernel/mm/transparent_hugepage/shmem_enabled";
+ char *opt1, *opt2;
ksft_print_msg("Please enable pr_debug in split_huge_pages_in_file() for more info.\n");
+ shmem_sysctl_fd = open(shmem_sysctl, O_RDWR);
+ if (shmem_sysctl_fd == -1) {
+ ksft_perror("cannot open shmem sysctl");
+ goto out;
+ }
+
+ num_read = read(shmem_sysctl_fd, sysctl_buf, INPUT_MAX);
+ if (num_read < 1) {
+ ksft_perror("Failed to read shmem sysctl");
+ goto cleanup_sysctl;
+ }
+
+ opt1 = strchr(sysctl_buf, '[');
+ opt2 = strchr(sysctl_buf, ']');
+ if (!opt1 || !opt2) {
+ ksft_perror("cannot read shmem sysctl config");
+ goto cleanup_sysctl;
+ }
+
+ /* get existing shmem sysctl config into sysctl_buf */
+ strncpy(sysctl_buf, opt1 + 1, opt2 - opt1 - 1);
+ memset(sysctl_buf + (opt2 - opt1 - 1), 0, INPUT_MAX);
+
+ num_written = write(shmem_sysctl_fd, "force", sizeof("force"));
+ if (num_written < 1) {
+ ksft_perror("Fail to write force to shmem sysctl");
+ goto cleanup_sysctl;
+ }
+
status = mount("tmpfs", tmpfs_loc, "tmpfs", 0, "huge=always,size=4m");
if (status)
@@ -317,13 +348,24 @@ void split_file_backed_thp(void)
if (status)
ksft_exit_fail_msg("cannot remove tmp dir: %s\n", strerror(errno));
+ num_written = write(shmem_sysctl_fd, sysctl_buf, strlen(sysctl_buf) + 1);
+ if (num_written < 1)
+ ksft_perror("Fail to restore shmem sysctl");
+
+ close(shmem_sysctl_fd);
ksft_print_msg("Please check dmesg for more information\n");
ksft_test_result_pass("File-backed THP split test done\n");
return;
cleanup:
+ num_written = write(shmem_sysctl_fd, sysctl_buf, strlen(sysctl_buf) + 1);
+ if (num_written < 1)
+ ksft_perror("Fail to restore shmem sysctl");
umount(tmpfs_loc);
rmdir(tmpfs_loc);
+cleanup_sysctl:
+ close(shmem_sysctl_fd);
+out:
ksft_exit_fail_msg("Error occurred\n");
}
--
2.45.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/3] mm/huge_memory: allow split shmem large folio to any lower order
2025-01-22 12:40 [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option Zi Yan
@ 2025-01-22 12:40 ` Zi Yan
2025-01-22 14:27 ` David Hildenbrand
2025-01-22 12:40 ` [PATCH 3/3] selftests/mm: test splitting file-backed THP " Zi Yan
2025-01-22 14:26 ` [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option David Hildenbrand
2 siblings, 1 reply; 8+ messages in thread
From: Zi Yan @ 2025-01-22 12:40 UTC (permalink / raw)
To: linux-mm, Andrew Morton, Baolin Wang
Cc: Kirill A . Shutemov, Matthew Wilcox (Oracle),
Ryan Roberts, Hugh Dickins, David Hildenbrand, 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] 8+ messages in thread
* [PATCH 3/3] selftests/mm: test splitting file-backed THP to any lower order.
2025-01-22 12:40 [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option Zi Yan
2025-01-22 12:40 ` [PATCH 2/3] mm/huge_memory: allow split shmem large folio to any lower order Zi Yan
@ 2025-01-22 12:40 ` Zi Yan
2025-01-22 14:26 ` [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option David Hildenbrand
2 siblings, 0 replies; 8+ messages in thread
From: Zi Yan @ 2025-01-22 12:40 UTC (permalink / raw)
To: linux-mm, Andrew Morton, Baolin Wang
Cc: Kirill A . Shutemov, Matthew Wilcox (Oracle),
Ryan Roberts, Hugh Dickins, David Hildenbrand, 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>
---
.../selftests/mm/split_huge_page_test.c | 32 ++++++++++++++-----
1 file changed, 24 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 8e15fc9dce3a..13ad5ac7d178 100644
--- a/tools/testing/selftests/mm/split_huge_page_test.c
+++ b/tools/testing/selftests/mm/split_huge_page_test.c
@@ -261,14 +261,16 @@ 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, shmem_sysctl_fd;
ssize_t num_written, num_read;
char tmpfs_template[] = "/tmp/thp_split_XXXXXX";
const char *tmpfs_loc = mkdtemp(tmpfs_template);
- char testfile[INPUT_MAX], sysctl_buf[INPUT_MAX] = {0};
+ char testfile[INPUT_MAX];
+ char sysctl_buf[INPUT_MAX] = {0};
+ char file_buf[INPUT_MAX] = {0};
uint64_t pgoff_start = 0, pgoff_end = 1024;
const char *shmem_sysctl = "/sys/kernel/mm/transparent_hugepage/shmem_enabled";
char *opt1, *opt2;
@@ -314,7 +316,7 @@ void split_file_backed_thp(void)
ksft_exit_fail_msg("Fail to create file-backed THP split testing file\n");
}
- 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;
@@ -322,7 +324,6 @@ void split_file_backed_thp(void)
/* 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);
if (num_written < 1) {
ksft_perror("Fail to write data to testing file");
@@ -330,8 +331,22 @@ 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 */
+ num_read = lseek(fd, 0, SEEK_SET);
+ if (num_read == -1) {
+ ksft_perror("Cannot lseek file");
+ goto cleanup;
+ }
+ num_read = read(fd, file_buf, num_written);
+ if (num_read < 1 || strncmp(file_buf, tmpfs_loc, num_read)) {
+ ksft_print_msg("File content changed, origin: %s, now: %s\n", tmpfs_loc, file_buf);
+ goto cleanup;
+ }
+
+ close(fd);
status = unlink(testfile);
if (status) {
ksft_perror("Cannot remove testing file");
@@ -354,7 +369,7 @@ void split_file_backed_thp(void)
close(shmem_sysctl_fd);
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;
cleanup:
@@ -523,7 +538,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;
@@ -540,7 +555,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] 8+ messages in thread
* Re: [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option
2025-01-22 12:40 [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option Zi Yan
2025-01-22 12:40 ` [PATCH 2/3] mm/huge_memory: allow split shmem large folio to any lower order Zi Yan
2025-01-22 12:40 ` [PATCH 3/3] selftests/mm: test splitting file-backed THP " Zi Yan
@ 2025-01-22 14:26 ` David Hildenbrand
2025-01-22 15:16 ` Zi Yan
2 siblings, 1 reply; 8+ messages in thread
From: David Hildenbrand @ 2025-01-22 14:26 UTC (permalink / raw)
To: Zi Yan, linux-mm, Andrew Morton, Baolin Wang
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
On 22.01.25 13:40, Zi Yan wrote:
> 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.
Just curious, why can't we write PMD size data instead, to avoid messing
with the "force" option?
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] mm/huge_memory: allow split shmem large folio to any lower order
2025-01-22 12:40 ` [PATCH 2/3] mm/huge_memory: allow split shmem large folio to any lower order Zi Yan
@ 2025-01-22 14:27 ` David Hildenbrand
0 siblings, 0 replies; 8+ messages in thread
From: David Hildenbrand @ 2025-01-22 14:27 UTC (permalink / raw)
To: Zi Yan, linux-mm, Andrew Morton, Baolin Wang
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
On 22.01.25 13:40, 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*().
>
> 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
Acked-by: David Hildenbrand <david@redhat.com>
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option
2025-01-22 14:26 ` [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option David Hildenbrand
@ 2025-01-22 15:16 ` Zi Yan
2025-01-22 15:27 ` David Hildenbrand
0 siblings, 1 reply; 8+ messages in thread
From: Zi Yan @ 2025-01-22 15:16 UTC (permalink / raw)
To: David Hildenbrand, linux-mm, Andrew Morton, Baolin Wang
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
On Wed Jan 22, 2025 at 9:26 AM EST, David Hildenbrand wrote:
> On 22.01.25 13:40, Zi Yan wrote:
>> 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.
>
> Just curious, why can't we write PMD size data instead, to avoid messing
> with the "force" option?
It also works. I used "force", because I notice that it is intended for
testing. Using it might be more future proof, in case huge=always changes
its semantics again in the future.
--
Best Regards,
Yan, Zi
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option
2025-01-22 15:16 ` Zi Yan
@ 2025-01-22 15:27 ` David Hildenbrand
2025-01-22 15:42 ` Zi Yan
0 siblings, 1 reply; 8+ messages in thread
From: David Hildenbrand @ 2025-01-22 15:27 UTC (permalink / raw)
To: Zi Yan, linux-mm, Andrew Morton, Baolin Wang
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
On 22.01.25 16:16, Zi Yan wrote:
> On Wed Jan 22, 2025 at 9:26 AM EST, David Hildenbrand wrote:
>> On 22.01.25 13:40, Zi Yan wrote:
>>> 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.
>>
>> Just curious, why can't we write PMD size data instead, to avoid messing
>> with the "force" option?
>
> It also works. I used "force", because I notice that it is intended for
> testing. Using it might be more future proof, in case huge=always changes
> its semantics again in the future.
I recall discussing with Hugh in an upstream call that "force" is a
relict from older times, so naturally I would have just adjusted the
test case to trigger the PMD scenario. No strong opinion, though, was
just wondering.
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option
2025-01-22 15:27 ` David Hildenbrand
@ 2025-01-22 15:42 ` Zi Yan
0 siblings, 0 replies; 8+ messages in thread
From: Zi Yan @ 2025-01-22 15:42 UTC (permalink / raw)
To: David Hildenbrand, linux-mm, Andrew Morton, Baolin Wang
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
On Wed Jan 22, 2025 at 10:27 AM EST, David Hildenbrand wrote:
> On 22.01.25 16:16, Zi Yan wrote:
>> On Wed Jan 22, 2025 at 9:26 AM EST, David Hildenbrand wrote:
>>> On 22.01.25 13:40, Zi Yan wrote:
>>>> 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.
>>>
>>> Just curious, why can't we write PMD size data instead, to avoid messing
>>> with the "force" option?
>>
>> It also works. I used "force", because I notice that it is intended for
>> testing. Using it might be more future proof, in case huge=always changes
>> its semantics again in the future.
>
> I recall discussing with Hugh in an upstream call that "force" is a
> relict from older times, so naturally I would have just adjusted the
> test case to trigger the PMD scenario. No strong opinion, though, was
> just wondering.
Got it. Let me change it and resend. Thank you for the feedback.
--
Best Regards,
Yan, Zi
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-01-22 15:42 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-01-22 12:40 [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option Zi Yan
2025-01-22 12:40 ` [PATCH 2/3] mm/huge_memory: allow split shmem large folio to any lower order Zi Yan
2025-01-22 14:27 ` David Hildenbrand
2025-01-22 12:40 ` [PATCH 3/3] selftests/mm: test splitting file-backed THP " Zi Yan
2025-01-22 14:26 ` [PATCH 1/3] selftests/mm: make file-backed THP split work by setting force option David Hildenbrand
2025-01-22 15:16 ` Zi Yan
2025-01-22 15:27 ` David Hildenbrand
2025-01-22 15:42 ` Zi Yan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox