From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: Kiryl Shutsemau <kirill@shutemov.name>
Cc: akpm@linux-foundation.org, david@kernel.org,
nico.pache@linux.dev, baolin.wang@linux.alibaba.com,
baohua@kernel.org, dev.jain@arm.com, hughd@google.com,
lance.yang@linux.dev, liam@infradead.org, mhocko@suse.com,
rppt@kernel.org, ryan.roberts@arm.com, shuah@kernel.org,
surenb@google.com, usama.arif@linux.dev, vbabka@kernel.org,
ziy@nvidia.com, usama.anjum@arm.com, agordeev@linux.ibm.com,
linux-mm@kvack.org, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org, kas@kernel.org
Subject: Re: [PATCH v4 07/19] selftests/mm: move is_backed_by_folio() into vm_util
Date: Tue, 18 Aug 2026 11:14:42 +0100 [thread overview]
Message-ID: <aoQwizWbYM7_T72f@lucifer> (raw)
In-Reply-To: <20260815015901.1236937-8-kirill@shutemov.name>
On Sat, Aug 15, 2026 at 02:58:49AM +0100, Kiryl Shutsemau wrote:
> From: "Kiryl Shutsemau (Meta)" <kas@kernel.org>
>
> Checking that an address range is backed by a folio of a given order is
> useful to any test that builds or collapses large folios. mTHP collapse
> coverage in the khugepaged selftest needs exactly that.
>
> split_huge_page_test.c already has the building block:
> is_backed_by_folio() reads the compound head and tail flags from
> /proc/kpageflags to classify the folio behind a page.
>
> Move it into vm_util so other tests can use it. No functional change.
>
> Assisted-by: Claude-Code:claude-opus-5
> Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Tested-by: Muhammad Usama Anjum <usama.anjum@arm.com>
> Signed-off-by: Kiryl Shutsemau (Meta) <kas@kernel.org>
LGTM so:
Acked-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
> ---
> .../selftests/mm/split_huge_page_test.c | 62 -------------------
> tools/testing/selftests/mm/vm_util.c | 62 +++++++++++++++++++
> tools/testing/selftests/mm/vm_util.h | 2 +
> 3 files changed, 64 insertions(+), 62 deletions(-)
>
> diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/testing/selftests/mm/split_huge_page_test.c
> index 86a603692826..0adfe7dde7e5 100644
> --- a/tools/testing/selftests/mm/split_huge_page_test.c
> +++ b/tools/testing/selftests/mm/split_huge_page_test.c
> @@ -42,68 +42,6 @@ const char *kpageflags_proc = "/proc/kpageflags";
> int pagemap_fd;
> int kpageflags_fd;
>
> -static bool is_backed_by_folio(char *vaddr, int order, int pagemap_fd,
> - int kpageflags_fd)
> -{
> - const uint64_t folio_head_flags = KPF_THP | KPF_COMPOUND_HEAD;
> - const uint64_t folio_tail_flags = KPF_THP | KPF_COMPOUND_TAIL;
> - const unsigned long nr_pages = 1UL << order;
> - unsigned long pfn_head;
> - uint64_t pfn_flags;
> - unsigned long pfn;
> - unsigned long i;
> -
> - pfn = pagemap_get_pfn(pagemap_fd, vaddr);
> -
> - /* non present page */
> - if (pfn == -1UL)
> - return false;
> -
> - if (pageflags_get(pfn, kpageflags_fd, &pfn_flags))
> - goto fail;
> -
> - /* check for order-0 pages */
> - if (!order) {
> - if (pfn_flags & (folio_head_flags | folio_tail_flags))
> - return false;
> - return true;
> - }
> -
> - /* non THP folio */
> - if (!(pfn_flags & KPF_THP))
> - return false;
> -
> - pfn_head = pfn & ~(nr_pages - 1);
> -
> - if (pageflags_get(pfn_head, kpageflags_fd, &pfn_flags))
> - goto fail;
> -
> - /* head PFN has no compound_head flag set */
> - if ((pfn_flags & folio_head_flags) != folio_head_flags)
> - return false;
> -
> - /* check all tail PFN flags */
> - for (i = 1; i < nr_pages; i++) {
> - if (pageflags_get(pfn_head + i, kpageflags_fd, &pfn_flags))
> - goto fail;
> - if ((pfn_flags & folio_tail_flags) != folio_tail_flags)
> - return false;
> - }
> -
> - /*
> - * check the PFN after this folio, but if its flags cannot be obtained,
> - * assume this folio has the expected order
> - */
> - if (pageflags_get(pfn_head + nr_pages, kpageflags_fd, &pfn_flags))
> - return true;
> -
> - /* If we find another tail page, then the folio is larger. */
> - return (pfn_flags & folio_tail_flags) != folio_tail_flags;
> -fail:
> - ksft_exit_fail_msg("Failed to get folio info\n");
> - return false;
> -}
> -
> static int check_after_split_folio_orders(char *vaddr_start, size_t len,
> int pagemap_fd, int kpageflags_fd, int orders[], int nr_orders)
> {
> diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c
> index 80bc9f597b52..5db1a7774f49 100644
> --- a/tools/testing/selftests/mm/vm_util.c
> +++ b/tools/testing/selftests/mm/vm_util.c
> @@ -494,6 +494,68 @@ int pageflags_get(unsigned long pfn, int kpageflags_fd, uint64_t *flags)
> return 0;
> }
>
> +bool is_backed_by_folio(char *vaddr, int order, int pagemap_fd,
> + int kpageflags_fd)
> +{
> + const uint64_t folio_head_flags = KPF_THP | KPF_COMPOUND_HEAD;
> + const uint64_t folio_tail_flags = KPF_THP | KPF_COMPOUND_TAIL;
> + const unsigned long nr_pages = 1UL << order;
> + unsigned long pfn_head;
> + uint64_t pfn_flags;
> + unsigned long pfn;
> + unsigned long i;
> +
> + pfn = pagemap_get_pfn(pagemap_fd, vaddr);
> +
> + /* non present page */
> + if (pfn == -1UL)
> + return false;
> +
> + if (pageflags_get(pfn, kpageflags_fd, &pfn_flags))
> + goto fail;
> +
> + /* check for order-0 pages */
> + if (!order) {
> + if (pfn_flags & (folio_head_flags | folio_tail_flags))
> + return false;
> + return true;
> + }
> +
> + /* non THP folio */
> + if (!(pfn_flags & KPF_THP))
> + return false;
> +
> + pfn_head = pfn & ~(nr_pages - 1);
> +
> + if (pageflags_get(pfn_head, kpageflags_fd, &pfn_flags))
> + goto fail;
> +
> + /* head PFN has no compound_head flag set */
> + if ((pfn_flags & folio_head_flags) != folio_head_flags)
> + return false;
> +
> + /* check all tail PFN flags */
> + for (i = 1; i < nr_pages; i++) {
> + if (pageflags_get(pfn_head + i, kpageflags_fd, &pfn_flags))
> + goto fail;
> + if ((pfn_flags & folio_tail_flags) != folio_tail_flags)
> + return false;
> + }
> +
> + /*
> + * check the PFN after this folio, but if its flags cannot be obtained,
> + * assume this folio has the expected order
> + */
> + if (pageflags_get(pfn_head + nr_pages, kpageflags_fd, &pfn_flags))
> + return true;
> +
> + /* If we find another tail page, then the folio is larger. */
> + return (pfn_flags & folio_tail_flags) != folio_tail_flags;
> +fail:
> + ksft_exit_fail_msg("Failed to get folio info\n");
> + return false;
> +}
> +
> /* If `ioctls' non-NULL, the allowed ioctls will be returned into the var */
> int uffd_register_with_ioctls(int uffd, void *addr, uint64_t len,
> bool miss, bool wp, bool minor, uint64_t *ioctls)
> diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h
> index 9a49af88702e..56a28ce7d029 100644
> --- a/tools/testing/selftests/mm/vm_util.h
> +++ b/tools/testing/selftests/mm/vm_util.h
> @@ -97,6 +97,8 @@ int64_t allocate_transhuge(void *ptr, int pagemap_fd);
> int pageflags_get(unsigned long pfn, int kpageflags_fd, uint64_t *flags);
> int gather_folio_orders(char *vaddr_start, size_t len,
> int pagemap_fd, int kpageflags_fd, int orders[], int nr_orders);
> +bool is_backed_by_folio(char *vaddr, int order, int pagemap_fd,
> + int kpageflags_fd);
>
> int uffd_register(int uffd, void *addr, uint64_t len,
> bool miss, bool wp, bool minor);
> --
> 2.54.0
>
--
Cheers, Lorenzo
next prev parent reply other threads:[~2026-08-18 10:15 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-15 1:58 [PATCH v4 00/19] selftests/mm: improve khugepaged coverage Kiryl Shutsemau
2026-08-15 1:58 ` [PATCH v4 01/19] selftests/mm: raise the khugepaged test-case cap Kiryl Shutsemau
2026-08-18 9:11 ` Lorenzo Stoakes (ARM)
2026-08-15 1:58 ` [PATCH v4 02/19] selftests/mm: skip collapse_compound_extreme() where the PMD is too large Kiryl Shutsemau
2026-08-18 9:22 ` Lorenzo Stoakes (ARM)
2026-08-15 1:58 ` [PATCH v4 03/19] selftests/mm: scale khugepaged's collapse wait with the PMD size Kiryl Shutsemau
2026-08-18 10:04 ` Lorenzo Stoakes (ARM)
2026-08-23 19:17 ` Kiryl Shutsemau
2026-08-15 1:58 ` [PATCH v4 04/19] selftests/mm: skip khugepaged page cache cases without a PMD folio Kiryl Shutsemau
2026-08-18 10:07 ` Lorenzo Stoakes (ARM)
2026-08-23 19:44 ` Kiryl Shutsemau
2026-08-20 8:40 ` Mike Rapoport
2026-08-15 1:58 ` [PATCH v4 05/19] selftests/mm: make the swap cases' swapout reliable Kiryl Shutsemau
2026-08-18 10:11 ` Lorenzo Stoakes (ARM)
2026-08-20 8:40 ` Mike Rapoport
2026-08-23 19:49 ` Kiryl Shutsemau
2026-08-15 1:58 ` [PATCH v4 06/19] selftests/mm: stop khugepaged during the MADV_COLLAPSE cases Kiryl Shutsemau
2026-08-18 10:12 ` Lorenzo Stoakes (ARM)
2026-08-20 8:40 ` Mike Rapoport
2026-08-15 1:58 ` [PATCH v4 07/19] selftests/mm: move is_backed_by_folio() into vm_util Kiryl Shutsemau
2026-08-18 10:14 ` Lorenzo Stoakes (ARM) [this message]
2026-08-15 1:58 ` [PATCH v4 08/19] selftests/mm: add folio-order check for address ranges Kiryl Shutsemau
2026-08-18 10:25 ` Lorenzo Stoakes (ARM)
2026-09-07 12:59 ` Kiryl Shutsemau
2026-08-20 8:40 ` Mike Rapoport
2026-08-15 1:58 ` [PATCH v4 09/19] selftests/mm: add folio-order detection self-check Kiryl Shutsemau
2026-08-18 10:30 ` Lorenzo Stoakes (ARM)
2026-09-07 13:11 ` Kiryl Shutsemau
2026-08-20 8:40 ` Mike Rapoport
2026-08-15 1:58 ` [PATCH v4 10/19] selftests/mm: add khugepaged completion barrier helper Kiryl Shutsemau
2026-08-18 10:34 ` Lorenzo Stoakes (ARM)
2026-08-20 8:40 ` Mike Rapoport
2026-08-15 1:58 ` [PATCH v4 11/19] selftests/mm: add order-parameterized khugepaged collapse cases Kiryl Shutsemau
2026-08-18 10:38 ` Lorenzo Stoakes (ARM)
2026-08-20 8:40 ` Mike Rapoport
2026-08-15 1:58 ` [PATCH v4 12/19] selftests/mm: parameterize the mixed-source collapse case by source order Kiryl Shutsemau
2026-08-18 10:47 ` Lorenzo Stoakes (ARM)
2026-08-20 8:40 ` Mike Rapoport
2026-09-07 13:40 ` Kiryl Shutsemau
2026-08-15 1:58 ` [PATCH v4 13/19] selftests/mm: cover a shared-source collapse write race Kiryl Shutsemau
2026-08-20 8:40 ` Mike Rapoport
2026-08-15 1:58 ` [PATCH v4 14/19] selftests/mm: run every supported collapse order by default Kiryl Shutsemau
2026-08-20 8:40 ` Mike Rapoport
2026-08-15 1:58 ` [PATCH v4 15/19] selftests/mm: check that one khugepaged pass collapses one window Kiryl Shutsemau
2026-08-15 1:58 ` [PATCH v4 16/19] selftests/mm: add khugepaged race harness Kiryl Shutsemau
2026-08-15 1:58 ` [PATCH v4 17/19] selftests/mm: race collapse of windows with holes Kiryl Shutsemau
2026-08-15 1:59 ` [PATCH v4 18/19] selftests/mm: add memory-pressure threads to the khugepaged race harness Kiryl Shutsemau
2026-08-15 1:59 ` [PATCH v4 19/19] selftests/mm: zap whole PTE tables in " Kiryl Shutsemau
2026-08-20 8:40 ` [PATCH v4 00/19] selftests/mm: improve khugepaged coverage Mike Rapoport
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=aoQwizWbYM7_T72f@lucifer \
--to=ljs@kernel.org \
--cc=agordeev@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=hughd@google.com \
--cc=kas@kernel.org \
--cc=kirill@shutemov.name \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.com \
--cc=nico.pache@linux.dev \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shuah@kernel.org \
--cc=surenb@google.com \
--cc=usama.anjum@arm.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=ziy@nvidia.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.