kselftest-mm-replace-usage-of-proc-self-smaps-for-__check_pmd_huge.patch removed from -mm tree
The quilt patch titled
Subject: kselftest: mm: replace usage of /proc/self/smaps for __check_pmd_huge()
has been removed from the -mm tree. Its filename was
kselftest-mm-replace-usage-of-proc-self-smaps-for-__check_pmd_huge.patch
This patch was dropped because it was merged into the mm-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
------------------------------------------------------
From: Yeoreum Yun <[email protected]>
Subject: kselftest: mm: replace usage of /proc/self/smaps for __check_pmd_huge()
Date: Thu, 01 Oct 2026 22:17:52 +0100
Since glibc commit 321e1fc73f (“malloc: Enable 2MB THP by default on AArch64”), glibc may call madvise(MADV_HUGEPAGE) for sufficiently large allocations made by memalign().
The underlying VMA may start at a different address from the aligned address returned by memalign(). Furthermore, a subsequent madvise(MADV_HUGEPAGE) call does not split the VMA because the flag is already set.
This causes split_huge_page_test to fail because the check_pmd_huge() helpers incorrectly require the address returned by memalign() to match the VMA start address reported in /proc/self/smaps.
Instead of relying on /proc/self/smaps, use /proc/self/pagemap and /proc/kpageflags to detect huge-page mappings checking PAGE_IS_HUGE and PAGE_IS_FILE according to type of huge page.
Since shmem pages are also file-backed, simply check whether the page is file-backed.
---
tools/testing/selftests/mm/vm_util.c | 78 +++++++++++++++---------- 1 file changed, 49 insertions(+), 29 deletions(-)
tools/testing/selftests/mm/vm_util.c renamed from tools/testing/selftests/mm/vm_util.c~kselftest-mm-replace-usage-of-proc-self-smaps-for-__check_pmd_huge +49 -29
@@ -351,24 +351,6 @@ err_out:return entry; } -static bool __check_pmd_huge (void *addr,char *pattern,int nr_hpages, -uint64_t hpage_size) -{ -char buffer[MAX_LINE_LENGTH ]; -uint64_t thp =-1 ; -char *entry; - - entry =__get_smap_entry (addr, pattern, buffer,sizeof (buffer)); -if (!entry) - goto err_out; - -if (sscanf (entry,"%9" SCNu64" kB" , &thp) !=1 ) -ksft_exit_fail_msg ("Reading smap error\n" ); - -err_out: -return thp == (nr_hpages * (hpage_size >>10 )); -} -static bool check_large_folios (void *addr,size_t len,int nr_hpages,uint64_t hpage_size) {
@@ -410,20 +392,51 @@ out:return ret; } -bool check_huge_anon (void *addr,size_t len,int nr_hpages,uint64_t hpage_size) +enum check_huge_type { +CHECK_HUGE_ANON , +CHECK_HUGE_FILE , +}; + +static bool check_huge_type (uint64_t categories,enum check_huge_type type) { -uint64_t pmd_pagesize =read_pmd_pagesize (); +const bool file = categories &PAGE_IS_FILE ; -if (!pmd_pagesize) -ksft_exit_fail_msg ("reading PMD pagesize failed\n" ); +switch (type) { +case CHECK_HUGE_ANON : +return !file; +case CHECK_HUGE_FILE : +return file; + } -if (hpage_size == pmd_pagesize) -return __check_pmd_huge (addr,"AnonHugePages: " , nr_hpages, hpage_size); +return false; +} -return check_large_folios (addr, len, nr_hpages, hpage_size); +static bool __check_pmd_huge (void *addr,size_t len,int nr_hpages, +uint64_t hpage_size,enum check_huge_type type) +{ +int pagemap_fd; +int nr_pmd_mappings =0 ; +uint64_t categories; +char *start = addr; +char *end = start + len; + + pagemap_fd =open (PAGEMAP_PATH ,O_RDONLY ); +if (pagemap_fd <0 ) +ksft_exit_fail_perror ("open pagemap" ); + +for (; start < end; start += hpage_size) { + categories =pagemap_scan_get_categories (pagemap_fd, start); +if (!(categories &PAGE_IS_HUGE )) +continue ; +if (check_huge_type (categories, type)) + nr_pmd_mappings++; + } +close (pagemap_fd); + +return nr_hpages == nr_pmd_mappings; } -bool check_huge_file (void *addr,size_t len,int nr_hpages,uint64_t hpage_size) +bool check_huge_anon (void *addr,size_t len,int nr_hpages,uint64_t hpage_size) {uint64_t pmd_pagesize =read_pmd_pagesize ();
@@ -431,12 +444,13 @@ bool check_huge_file(void *addr, size_tksft_exit_fail_msg ("reading PMD pagesize failed\n" );if (hpage_size == pmd_pagesize) -return __check_pmd_huge (addr,"FilePmdMapped:" , nr_hpages, hpage_size); +return __check_pmd_huge (addr, len, nr_hpages, hpage_size, +CHECK_HUGE_ANON );return check_large_folios (addr, len, nr_hpages, hpage_size); } -bool check_huge_shmem (void *addr,size_t len,int nr_hpages,uint64_t hpage_size) +bool check_huge_file (void *addr,size_t len,int nr_hpages,uint64_t hpage_size) {uint64_t pmd_pagesize =read_pmd_pagesize ();
@@ -444,11 +458,17 @@ bool check_huge_shmem(void *addr, size_tksft_exit_fail_msg ("reading PMD pagesize failed\n" );if (hpage_size == pmd_pagesize) -return __check_pmd_huge (addr,"ShmemPmdMapped:" , nr_hpages, hpage_size); +return __check_pmd_huge (addr, len, nr_hpages, hpage_size, +CHECK_HUGE_FILE );return check_large_folios (addr, len, nr_hpages, hpage_size); } +bool check_huge_shmem (void *addr,size_t len,int nr_hpages,uint64_t hpage_size) +{ +return check_huge_file (addr, len, nr_hpages, hpage_size); +} +int64_t allocate_transhuge (void *ptr,int pagemap_fd) {uint64_t ent[2 ];
_
Patches currently in -mm which might be from [email protected] are