From: Zi Yan <ziy@nvidia.com>
To: Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@kernel.org>,
"Matthew Wilcox (Oracle)" <willy@infradead.org>,
Song Liu <songliubraving@fb.com>
Cc: Chris Mason <clm@fb.com>, David Sterba <dsterba@suse.com>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
Lorenzo Stoakes <ljs@kernel.org>, Zi Yan <ziy@nvidia.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
"Liam R. Howlett" <Liam.Howlett@oracle.com>,
Nico Pache <npache@redhat.com>,
Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
Barry Song <baohua@kernel.org>, Lance Yang <lance.yang@linux.dev>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>, Shuah Khan <shuah@kernel.org>,
<linux-btrfs@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<linux-fsdevel@vger.kernel.org>, <linux-mm@kvack.org>,
<linux-kselftest@vger.kernel.org>
Subject: Re: [PATCH v5 11/14] selftests/mm: remove READ_ONLY_THP_FOR_FS in khugepaged
Date: Thu, 30 Apr 2026 11:16:12 -0400 [thread overview]
Message-ID: <B1D68BA2-11D2-4053-B715-F7704ED784DA@nvidia.com> (raw)
In-Reply-To: <20260429153538.727855-7-ziy@nvidia.com>
On 29 Apr 2026, at 11:35, Zi Yan wrote:
> Change the requirement to a file system with large folio support and the
> supported order needs to include PMD_ORDER.
>
> Also add tests of opening a file with read write permission and populating
> folios with writes. Reuse the XFS image from split_huge_page_test.
>
> Signed-off-by: Zi Yan <ziy@nvidia.com>
> ---
> tools/testing/selftests/mm/khugepaged.c | 131 +++++++++++++++-------
> tools/testing/selftests/mm/run_vmtests.sh | 12 +-
> 2 files changed, 102 insertions(+), 41 deletions(-)
>
> diff --git a/tools/testing/selftests/mm/khugepaged.c b/tools/testing/selftests/mm/khugepaged.c
> index a6bb9d50363d2..80b913185c643 100644
> --- a/tools/testing/selftests/mm/khugepaged.c
> +++ b/tools/testing/selftests/mm/khugepaged.c
> @@ -49,7 +49,8 @@ struct mem_ops {
> const char *name;
> };
>
> -static struct mem_ops *file_ops;
> +static struct mem_ops *read_only_file_ops;
> +static struct mem_ops *read_write_file_ops;
> static struct mem_ops *anon_ops;
> static struct mem_ops *shmem_ops;
>
> @@ -112,7 +113,8 @@ static void restore_settings(int sig)
> static void save_settings(void)
> {
> printf("Save THP and khugepaged settings...");
> - if (file_ops && finfo.type == VMA_FILE)
> + if ((read_only_file_ops || read_write_file_ops) &&
> + finfo.type == VMA_FILE)
> thp_set_read_ahead_path(finfo.dev_queue_read_ahead_path);
> thp_save_settings();
>
> @@ -364,11 +366,14 @@ static bool anon_check_huge(void *addr, int nr_hpages)
> return check_huge_anon(addr, nr_hpages, hpage_pmd_size);
> }
>
> -static void *file_setup_area(int nr_hpages)
> +static void *file_setup_area_common(int nr_hpages, bool read_only)
> {
> int fd;
> void *p;
> unsigned long size;
> + int open_opt = read_only ? O_RDONLY : O_RDWR;
> + int mmap_prot = read_only ? PROT_READ : (PROT_READ | PROT_WRITE);
> + int mmap_opt = read_only ? MAP_PRIVATE : MAP_SHARED;
>
> unlink(finfo.path); /* Cleanup from previous failed tests */
> printf("Creating %s for collapse%s...", finfo.path,
> @@ -399,14 +404,15 @@ static void *file_setup_area(int nr_hpages)
> munmap(p, size);
> success("OK");
>
> - printf("Opening %s read only for collapse...", finfo.path);
> - finfo.fd = open(finfo.path, O_RDONLY, 777);
> + printf("Opening %s %s for collapse...", finfo.path,
> + read_only ? "read only" : "read-write");
> + finfo.fd = open(finfo.path, open_opt, 777);
> if (finfo.fd < 0) {
> perror("open()");
> exit(EXIT_FAILURE);
> }
> - p = mmap(BASE_ADDR, size, PROT_READ,
> - MAP_PRIVATE, finfo.fd, 0);
> + p = mmap(BASE_ADDR, size, mmap_prot,
> + mmap_opt, finfo.fd, 0);
> if (p == MAP_FAILED || p != BASE_ADDR) {
> perror("mmap()");
> exit(EXIT_FAILURE);
> @@ -418,6 +424,16 @@ static void *file_setup_area(int nr_hpages)
> return p;
> }
>
> +static void *file_setup_read_only_area(int nr_hpages)
> +{
> + return file_setup_area_common(nr_hpages, /* read_only= */ true);
> +}
> +
> +static void *file_setup_read_write_area(int nr_hpages)
> +{
> + return file_setup_area_common(nr_hpages, /* read_only= */ false);
> +}
> +
> static void file_cleanup_area(void *p, unsigned long size)
> {
> munmap(p, size);
> @@ -425,14 +441,25 @@ static void file_cleanup_area(void *p, unsigned long size)
> unlink(finfo.path);
> }
>
> -static void file_fault(void *p, unsigned long start, unsigned long end)
> +static void file_fault_common(void *p, unsigned long start, unsigned long end,
> + int madv_ops)
> {
> - if (madvise(((char *)p) + start, end - start, MADV_POPULATE_READ)) {
> + if (madvise(((char *)p) + start, end - start, madv_ops)) {
> perror("madvise(MADV_POPULATE_READ");
Sashiko:
Since madv_ops can now be either MADV_POPULATE_READ or MADV_POPULATE_WRITE,
will this hardcoded error message be misleading if the write fault path
fails?
Answer:
Will send a fixup.
> exit(EXIT_FAILURE);
> }
> }
>
> +static void file_fault_read(void *p, unsigned long start, unsigned long end)
> +{
> + file_fault_common(p, start, end, MADV_POPULATE_READ);
> +}
> +
> +static void file_fault_write(void *p, unsigned long start, unsigned long end)
> +{
> + file_fault_common(p, start, end, MADV_POPULATE_WRITE);
> +}
> +
> static bool file_check_huge(void *addr, int nr_hpages)
> {
> switch (finfo.type) {
> @@ -488,10 +515,18 @@ static struct mem_ops __anon_ops = {
> .name = "anon",
> };
>
> -static struct mem_ops __file_ops = {
> - .setup_area = &file_setup_area,
> +static struct mem_ops __read_only_file_ops = {
> + .setup_area = &file_setup_read_only_area,
> .cleanup_area = &file_cleanup_area,
> - .fault = &file_fault,
> + .fault = &file_fault_read,
> + .check_huge = &file_check_huge,
> + .name = "file",
> +};
> +
> +static struct mem_ops __read_write_file_ops = {
> + .setup_area = &file_setup_read_write_area,
> + .cleanup_area = &file_cleanup_area,
> + .fault = &file_fault_write,
> .check_huge = &file_check_huge,
> .name = "file",
Sashiko:
Both __read_only_file_ops and __read_write_file_ops use "file" for their
name fields. Since the TEST() macro uses this name to format the test
execution logs, won't this cause both configurations to produce identical log
output?
Answer:
file_setup_area_common() changes handle it.
Best Regards,
Yan, Zi
next prev parent reply other threads:[~2026-04-30 15:16 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-29 15:29 [PATCH v5 00/14] Remove CONFIG_READ_ONLY_THP_FOR_FS and enable file THP for writable files Zi Yan
2026-04-29 15:29 ` [PATCH v5 01/14] mm/khugepaged: remove READ_ONLY_THP_FOR_FS check Zi Yan
2026-04-30 14:37 ` Zi Yan
2026-04-30 15:04 ` Andrew Morton
2026-05-04 3:48 ` Nico Pache
2026-04-29 15:29 ` [PATCH v5 02/14] mm/khugepaged: add folio dirty check after try_to_unmap() Zi Yan
2026-04-30 15:11 ` Zi Yan
2026-05-04 3:53 ` Nico Pache
2026-05-06 5:23 ` Lance Yang
2026-04-29 15:29 ` [PATCH v5 03/14] mm/huge_memory: remove READ_ONLY_THP_FOR_FS from file_thp_enabled() Zi Yan
2026-05-04 3:57 ` Nico Pache
2026-04-29 15:29 ` [PATCH v5 04/14] mm/khugepaged: remove READ_ONLY_THP_FOR_FS check in hugepage_enabled() Zi Yan
2026-05-04 4:00 ` Nico Pache
2026-04-29 15:35 ` [PATCH v5 05/14] mm: remove READ_ONLY_THP_FOR_FS Kconfig option Zi Yan
2026-05-04 4:02 ` Nico Pache
2026-04-29 15:35 ` [PATCH v5 06/14] mm: fs: remove filemap_nr_thps*() functions and their users Zi Yan
2026-04-29 15:35 ` [PATCH v5 07/14] fs: remove nr_thps from struct address_space Zi Yan
2026-05-04 4:11 ` Nico Pache
2026-04-29 15:35 ` [PATCH v5 08/14] mm/huge_memory: remove folio split check for READ_ONLY_THP_FOR_FS Zi Yan
2026-04-29 15:35 ` [PATCH v5 09/14] mm/truncate: use folio_split() in truncate_inode_partial_folio() Zi Yan
2026-04-30 15:12 ` Zi Yan
2026-04-29 15:35 ` [PATCH v5 10/14] fs/btrfs: remove a comment referring to READ_ONLY_THP_FOR_FS Zi Yan
2026-04-29 15:35 ` [PATCH v5 11/14] selftests/mm: remove READ_ONLY_THP_FOR_FS in khugepaged Zi Yan
2026-04-30 15:16 ` Zi Yan [this message]
2026-04-30 15:27 ` Zi Yan
2026-05-04 4:23 ` Nico Pache
2026-05-04 10:11 ` Nico Pache
2026-04-29 15:35 ` [PATCH v5 12/14] selftests/mm: remove READ_ONLY_THP_FOR_FS code from guard-regions Zi Yan
2026-04-29 15:35 ` [PATCH v5 13/14] mm/khugepaged: enable clean pagecache folio collapse for writable files Zi Yan
2026-04-30 15:18 ` Zi Yan
2026-04-29 15:35 ` [PATCH v5 14/14] selftests/mm: add writable-file collapse tests for khugepaged Zi Yan
2026-04-29 16:13 ` [PATCH v5 00/14] Remove CONFIG_READ_ONLY_THP_FOR_FS and enable file THP for writable files Andrew Morton
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=B1D68BA2-11D2-4053-B715-F7704ED784DA@nvidia.com \
--to=ziy@nvidia.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=brauner@kernel.org \
--cc=clm@fb.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=dsterba@suse.com \
--cc=jack@suse.cz \
--cc=lance.yang@linux.dev \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=mhocko@suse.com \
--cc=npache@redhat.com \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shuah@kernel.org \
--cc=songliubraving@fb.com \
--cc=surenb@google.com \
--cc=vbabka@kernel.org \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
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