All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Zi Yan" <ziy@nvidia.com>
To: "Baolin Wang" <baolin.wang@linux.alibaba.com>,
	<akpm@linux-foundation.org>, <david@kernel.org>, <ljs@kernel.org>
Cc: <liam@infradead.org>, <nico.pache@linux.dev>, <dev.jain@arm.com>,
	<ryan.roberts@arm.com>, <baohua@kernel.org>,
	<lance.yang@linux.dev>, <usama.arif@linux.dev>,
	<linux-mm@kvack.org>, <linux-kselftest@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 3/4] selftests: mm: implement the mTHP-sized hugepage check helpers
Date: Wed, 05 Aug 2026 11:59:55 -0400	[thread overview]
Message-ID: <DKH4VJXGIUNU.2ZENW7583Q6K5@nvidia.com> (raw)
In-Reply-To: <eb75f6d510fb48f14e25fde85e5a5e2b67cef394.1785564857.git.baolin.wang@linux.alibaba.com>

On Sat Aug 1, 2026 at 2:26 AM EDT, Baolin Wang wrote:
> Implement mTHP-sized hugepage checking helpers using gather_folio_orders().
> Also rename the existing PMD-sized huge page check function to
> __check_pmd_huge() for clarity.
>
> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
> ---
>  tools/testing/selftests/mm/vm_util.c | 60 ++++++++++++++++++++++++++--
>  1 file changed, 56 insertions(+), 4 deletions(-)
>
> diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c
> index 09e5d5cabe21..1240d783669c 100644
> --- a/tools/testing/selftests/mm/vm_util.c
> +++ b/tools/testing/selftests/mm/vm_util.c
> @@ -15,6 +15,10 @@
>  #define SMAP_FILE_PATH "/proc/self/smaps"
>  #define STATUS_FILE_PATH "/proc/self/status"
>  #define MAX_LINE_LENGTH 500
> +#define PAGEMAP_PATH "/proc/self/pagemap"
> +#define KPAGEFLAGS_PATH "/proc/kpageflags"
> +#define GET_ORDER(nr_pages)    (31 - __builtin_clz(nr_pages))

This is a fast way of getting log2, but there is no check of the type of
nr_pages. What prevents one using it on a long variable?

At least you can convert nr_pages to unsigned int and add a comment.

> +#define NR_ORDERS 20

Why 20? mTHP orders can only be in [1, pmd_order - 1] and different arch
has different pmd_orders. check_large_folios() probably should just cap
NR_ORDERS at pmd_order.

>  
>  unsigned int __page_size;
>  unsigned int __page_shift;
> @@ -348,7 +352,7 @@ char *__get_smap_entry(void *addr, const char *pattern, char *buf, size_t len)
>  	return entry;
>  }
>  
> -bool __check_huge(void *addr, char *pattern, int nr_hpages,
> +static bool __check_pmd_huge(void *addr, char *pattern, int nr_hpages,
>  		  uint64_t hpage_size)
>  {
>  	char buffer[MAX_LINE_LENGTH];
> @@ -366,19 +370,67 @@ bool __check_huge(void *addr, char *pattern, int nr_hpages,
>  	return thp == (nr_hpages * (hpage_size >> 10));
>  }
>  
> +static bool check_large_folios(void *addr, unsigned long size, int nr_hpages, uint64_t hpage_size)
> +{
> +	int order = 0, pagesize = getpagesize();
> +	int nr_pages = hpage_size / pagesize;
> +	int pagemap_fd, kpageflags_fd;
> +	int orders[NR_ORDERS], status;

NR_ORDERS is a constant, so you can put orders on stack. I think you can
rename it to MAX_NR_ORDERS, use 20, and check pmd_order is not bigger
than MAX_NR_ORDERS.

> +	bool ret = false;
> +
> +	if (nr_pages > 0)
> +		order = GET_ORDER(nr_pages);

This funciton can fail early if nr_pages is 0.

> +
> +	if (!order || order >= NR_ORDERS)
> +		ksft_exit_fail_msg("invalid order\n");

It should check against pmd_order.

> +
> +	memset(orders, 0, sizeof(int) * NR_ORDERS);
> +	pagemap_fd = open(PAGEMAP_PATH, O_RDONLY);
> +	if (pagemap_fd == -1)
> +		ksft_exit_fail_msg("read pagemap fail\n");
> +
> +	kpageflags_fd = open(KPAGEFLAGS_PATH, O_RDONLY);
> +	if (kpageflags_fd == -1) {
> +		close(pagemap_fd);
> +		ksft_exit_fail_msg("read kpageflags fail\n");
> +	}
> +
> +	status = gather_folio_orders(addr, size, pagemap_fd,
> +			kpageflags_fd, orders, NR_ORDERS);
> +	if (status)
> +		goto out;
> +
> +	if (orders[order] == nr_hpages)
> +		ret = true;
> +
> +out:
> +	close(pagemap_fd);
> +	close(kpageflags_fd);
> +	return ret;
> +}
> +
>  bool check_huge_anon(void *addr, unsigned long size, int nr_hpages, uint64_t hpage_size)
>  {
> -	return __check_huge(addr, "AnonHugePages: ", nr_hpages, hpage_size);
> +	if (hpage_size == read_pmd_pagesize())

read_pmd_pagesize() can fail and return 0. Either you need a check here
or add a ksft_exit_fail_msg() in read_pmd_pagesize() to remove the
burden from all callers.

> +		return __check_pmd_huge(addr, "AnonHugePages: ", nr_hpages, hpage_size);
> +
> +	return check_large_folios(addr, size, nr_hpages, hpage_size);
>  }
>  
>  bool check_huge_file(void *addr, unsigned long size, int nr_hpages, uint64_t hpage_size)
>  {
> -	return __check_huge(addr, "FilePmdMapped:", nr_hpages, hpage_size);
> +	if (hpage_size == read_pmd_pagesize())
> +		return __check_pmd_huge(addr, "FilePmdMapped:", nr_hpages, hpage_size);
> +
> +	return check_large_folios(addr, size, nr_hpages, hpage_size);
>  }
>  
>  bool check_huge_shmem(void *addr, unsigned long size, int nr_hpages, uint64_t hpage_size)
>  {
> -	return __check_huge(addr, "ShmemPmdMapped:", nr_hpages, hpage_size);
> +	if (hpage_size == read_pmd_pagesize())
> +		return __check_pmd_huge(addr, "ShmemPmdMapped:", nr_hpages, hpage_size);
> +
> +	return check_large_folios(addr, size, nr_hpages, hpage_size);
>  }
>  
>  int64_t allocate_transhuge(void *ptr, int pagemap_fd)

All read_pmd_pagesize()s above need to be handled.


-- 
Best Regards,
Yan, Zi



  parent reply	other threads:[~2026-08-05 16:00 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-01  6:26 [PATCH v2 0/4] add anon mTHP collapse test cases Baolin Wang
2026-08-01  6:26 ` [PATCH v2 1/4] selftests: mm: extend the check_huge() to support mTHP check Baolin Wang
2026-08-04 20:38   ` Nico Pache (Red Hat)
2026-08-05 15:31   ` Zi Yan
2026-08-06  0:47     ` Baolin Wang
2026-08-01  6:26 ` [PATCH v2 2/4] selftests: mm: move gather_after_split_folio_orders() into vm_util.c file Baolin Wang
2026-08-04 20:38   ` Nico Pache (Red Hat)
2026-08-05 15:32   ` Zi Yan
2026-08-01  6:26 ` [PATCH v2 3/4] selftests: mm: implement the mTHP-sized hugepage check helpers Baolin Wang
2026-08-04 20:38   ` Nico Pache (Red Hat)
2026-08-05 15:59   ` Zi Yan [this message]
2026-08-06  1:08     ` Baolin Wang
2026-08-01  6:26 ` [PATCH v2 4/4] selftests: mm: add mTHP collapse test cases Baolin Wang
2026-08-04 20:38   ` Nico Pache (Red Hat)
2026-08-05 16:46   ` Zi Yan
2026-08-06  1:17     ` Baolin Wang
2026-08-06  1:25       ` Zi Yan
2026-08-06  1:30         ` Baolin Wang
2026-08-06  2:04           ` Zi Yan
2026-08-06  2:09             ` Baolin Wang
2026-08-04 20:38 ` [PATCH v2 0/4] add anon " Nico Pache (Red Hat)
2026-08-05  5:08   ` Baolin Wang
2026-08-05 15:14 ` Kiryl Shutsemau
2026-08-06  1:19   ` Baolin Wang

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=DKH4VJXGIUNU.2ZENW7583Q6K5@nvidia.com \
    --to=ziy@nvidia.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=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=ljs@kernel.org \
    --cc=nico.pache@linux.dev \
    --cc=ryan.roberts@arm.com \
    --cc=usama.arif@linux.dev \
    /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.