From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 917182E92B8 for ; Wed, 3 Sep 2025 22:23:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756938225; cv=none; b=VEzCV6/rL+LfvXDxbgj6L9NAmttfqZCKNmrC11/hUtXqbSKEsTRRTzAmzTuqxiPu+SmnDkJ4H/bHAEj8ZZltujixpmwke9o9RSYRtlJfEAgnQkSyYn8UaKLIy1KTc5SBOaax5vcT5Jqe+IMDrTP+mxa7TMLPnm432RsfbnhDY00= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756938225; c=relaxed/simple; bh=cYUzJEl1pc3HRsO51jui4POixOh6KTIiPDgV9UN7Fz8=; h=Date:To:From:Subject:Message-Id; b=vA3fwUp2HhjKL+AH6c8HF8t0HPa7OlOqIf2JxVcHGkyldQeJTD3v3SU2gz/aXckrtcCKa3zALOpHUw6dY6IcZw1xENVcFW/ZcRR+Q6NFaev0XtlQncdHfzcChKiw6tG3AK6U5MI77D4WEQH0Ato3F0DBlnTCLbbABM4XYl8M9/g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux-foundation.org header.i=@linux-foundation.org header.b=0DCm+FH3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux-foundation.org header.i=@linux-foundation.org header.b="0DCm+FH3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0AAD7C4CEE7; Wed, 3 Sep 2025 22:23:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linux-foundation.org; s=korg; t=1756938225; bh=cYUzJEl1pc3HRsO51jui4POixOh6KTIiPDgV9UN7Fz8=; h=Date:To:From:Subject:From; b=0DCm+FH3OfkfTOzdmiM8l4mKKnZTt0TfX7G8ZBQtmTAy1FtWbehaDokFnTB/U1DaP l1CEK/upIFGuhK5cyIdH2oeuWk6IUZMqWjvs1cdPeymrXS/9RGVWti8APWhy22MK1/ 0alalcW/7vXEa/GrnCW/h8MNHOJuhU2/QKpgiMhg= Date: Wed, 03 Sep 2025 15:23:44 -0700 To: mm-commits@vger.kernel.org,ziy@nvidia.com,ryan.roberts@arm.com,richard.weiyang@gmail.com,npache@redhat.com,lorenzo.stoakes@oracle.com,liam.howlett@oracle.com,dev.jain@arm.com,baolin.wang@linux.alibaba.com,baohua@kernel.org,david@redhat.com,akpm@linux-foundation.org From: Andrew Morton Subject: + selftests-mm-split_huge_page_test-cleanups-for-split_pte_mapped_thp-test.patch added to mm-new branch Message-Id: <20250903222345.0AAD7C4CEE7@smtp.kernel.org> Precedence: bulk X-Mailing-List: mm-commits@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: The patch titled Subject: selftests/mm: split_huge_page_test: cleanups for split_pte_mapped_thp test has been added to the -mm mm-new branch. Its filename is selftests-mm-split_huge_page_test-cleanups-for-split_pte_mapped_thp-test.patch This patch will shortly appear at https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/selftests-mm-split_huge_page_test-cleanups-for-split_pte_mapped_thp-test.patch This patch will later appear in the mm-new branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Note, mm-new is a provisional staging ground for work-in-progress patches, and acceptance into mm-new is a notification for others take notice and to finish up reviews. Please do not hesitate to respond to review feedback and post updated versions to replace or incrementally fixup patches in mm-new. Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next via the mm-everything branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm and is updated there every 2-3 working days ------------------------------------------------------ From: David Hildenbrand Subject: selftests/mm: split_huge_page_test: cleanups for split_pte_mapped_thp test Date: Wed, 3 Sep 2025 09:02:53 +0200 There is room for improvement, so let's clean up a bit: (1) Define "4" as a constant. (2) SKIP if we fail to allocate all THPs (e.g., fragmented) and add recovery code for all other failure cases: no need to exit the test. (3) Rename "len" to thp_area_size, and "one_page" to "thp_area". (4) Allocate a new area "page_area" into which we will mremap the pages; add "page_area_size". Now we can easily merge the two mremap instances into a single one. (5) Iterate THPs instead of bytes when checking for missed THPs after mremap. (6) Rename "pte_mapped2" to "tmp", used to verify mremap(MAP_FIXED) result. (7) Split the corruption test from the failed-split test, so we can just iterate bytes vs. thps naturally. (8) Extend comments and clarify why we are using mremap in the first place. Link: https://lkml.kernel.org/r/20250903070253.34556-3-david@redhat.com Signed-off-by: David Hildenbrand Reviewed-by: Zi Yan Reviewed-by: Wei Yang Cc: Baolin Wang Cc: Barry Song Cc: Dev Jain Cc: Liam Howlett Cc: Lorenzo Stoakes Cc: Mariano Pache Cc: Ryan Roberts Signed-off-by: Andrew Morton --- tools/testing/selftests/mm/split_huge_page_test.c | 117 +++++++----- 1 file changed, 71 insertions(+), 46 deletions(-) --- a/tools/testing/selftests/mm/split_huge_page_test.c~selftests-mm-split_huge_page_test-cleanups-for-split_pte_mapped_thp-test +++ a/tools/testing/selftests/mm/split_huge_page_test.c @@ -389,67 +389,92 @@ static void split_pmd_thp_to_order(int o static void split_pte_mapped_thp(void) { - char *one_page, *pte_mapped, *pte_mapped2; - size_t len = 4 * pmd_pagesize; - uint64_t thp_size; + const size_t nr_thps = 4; + const size_t thp_area_size = nr_thps * pmd_pagesize; + const size_t page_area_size = nr_thps * pagesize; + char *thp_area, *tmp, *page_area = MAP_FAILED; size_t i; - one_page = mmap((void *)(1UL << 30), len, PROT_READ | PROT_WRITE, + thp_area = mmap((void *)(1UL << 30), thp_area_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if (one_page == MAP_FAILED) - ksft_exit_fail_msg("Fail to allocate memory: %s\n", strerror(errno)); - - madvise(one_page, len, MADV_HUGEPAGE); - - for (i = 0; i < len; i++) - one_page[i] = (char)i; + if (thp_area == MAP_FAILED) { + ksft_test_result_fail("Fail to allocate memory: %s\n", strerror(errno)); + return; + } - if (!check_huge_anon(one_page, 4, pmd_pagesize)) - ksft_exit_fail_msg("No THP is allocated\n"); + madvise(thp_area, thp_area_size, MADV_HUGEPAGE); - /* remap the first pagesize of first THP */ - pte_mapped = mremap(one_page, pagesize, pagesize, MREMAP_MAYMOVE); + for (i = 0; i < thp_area_size; i++) + thp_area[i] = (char)i; - /* remap the Nth pagesize of Nth THP */ - for (i = 1; i < 4; i++) { - pte_mapped2 = mremap(one_page + pmd_pagesize * i + pagesize * i, - pagesize, pagesize, - MREMAP_MAYMOVE|MREMAP_FIXED, - pte_mapped + pagesize * i); - if (pte_mapped2 == MAP_FAILED) - ksft_exit_fail_msg("mremap failed: %s\n", strerror(errno)); + if (!check_huge_anon(thp_area, nr_thps, pmd_pagesize)) { + ksft_test_result_skip("Not all THPs allocated\n"); + goto out; } - /* smap does not show THPs after mremap, use kpageflags instead */ - thp_size = 0; - for (i = 0; i < pagesize * 4; i++) - if (i % pagesize == 0 && - is_backed_by_folio(&pte_mapped[i], pmd_order, pagemap_fd, kpageflags_fd)) - thp_size++; - - if (thp_size != 4) - ksft_exit_fail_msg("Some THPs are missing during mremap\n"); + /* + * To challenge spitting code, we will mremap a single page of each + * THP (page[i] of thp[i]) in the thp_area into page_area. This will + * replace the PMD mappings in the thp_area by PTE mappings first, + * but leaving the THP unsplit, to then create a page-sized hole in + * the thp_area. + * We will then manually trigger splitting of all THPs through the + * single mremap'ed pages of each THP in the page_area. + */ + page_area = mmap(NULL, page_area_size, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (page_area == MAP_FAILED) { + ksft_test_result_fail("Fail to allocate memory: %s\n", strerror(errno)); + goto out; + } - /* split all remapped THPs */ - write_debugfs(PID_FMT, getpid(), (uint64_t)pte_mapped, - (uint64_t)pte_mapped + pagesize * 4, 0); + for (i = 0; i < nr_thps; i++) { + tmp = mremap(thp_area + pmd_pagesize * i + pagesize * i, + pagesize, pagesize, MREMAP_MAYMOVE|MREMAP_FIXED, + page_area + pagesize * i); + if (tmp != MAP_FAILED) + continue; + ksft_test_result_fail("mremap failed: %s\n", strerror(errno)); + goto out; + } - /* smap does not show THPs after mremap, use kpageflags instead */ - thp_size = 0; - for (i = 0; i < pagesize * 4; i++) { - if (pte_mapped[i] != (char)i) - ksft_exit_fail_msg("%ld byte corrupted\n", i); + /* + * Verify that our THPs were not split yet. Note that + * check_huge_anon() cannot be used as it checks for PMD mappings. + */ + for (i = 0; i < nr_thps; i++) { + if (is_backed_by_folio(page_area + i * pagesize, pmd_order, + pagemap_fd, kpageflags_fd)) + continue; + ksft_test_result_fail("THP %zu missing after mremap\n", i); + goto out; + } - if (i % pagesize == 0 && - !is_backed_by_folio(&pte_mapped[i], 0, pagemap_fd, kpageflags_fd)) - thp_size++; + /* Split all THPs through the remapped pages. */ + write_debugfs(PID_FMT, getpid(), (uint64_t)page_area, + (uint64_t)page_area + page_area_size, 0); + + /* Corruption during mremap or split? */ + for (i = 0; i < page_area_size; i++) { + if (page_area[i] == (char)i) + continue; + ksft_test_result_fail("%zu byte corrupted\n", i); + goto out; } - if (thp_size) - ksft_exit_fail_msg("Still %ld THPs not split\n", thp_size); + /* Split failed? */ + for (i = 0; i < nr_thps; i++) { + if (is_backed_by_folio(page_area + i * pagesize, 0, + pagemap_fd, kpageflags_fd)) + continue; + ksft_test_result_fail("THP %zu not split\n", i); + } ksft_test_result_pass("Split PTE-mapped huge pages successful\n"); - munmap(one_page, len); +out: + munmap(thp_area, thp_area_size); + if (page_area != MAP_FAILED) + munmap(page_area, page_area_size); } static void split_file_backed_thp(int order) _ Patches currently in -mm which might be from david@redhat.com are mm-migrate-remove-migratepage_unmap.patch mm-migrate-remove-migratepage_unmap-fix.patch treewide-remove-migratepage_success.patch mm-huge_memory-move-more-common-code-into-insert_pmd.patch mm-huge_memory-move-more-common-code-into-insert_pud.patch mm-huge_memory-support-huge-zero-folio-in-vmf_insert_folio_pmd.patch fs-dax-use-vmf_insert_folio_pmd-to-insert-the-huge-zero-folio.patch mm-huge_memory-mark-pmd-mappings-of-the-huge-zero-folio-special.patch powerpc-ptdump-rename-struct-pgtable_level-to-struct-ptdump_pglevel.patch mm-rmap-convert-enum-rmap_level-to-enum-pgtable_level.patch mm-memory-convert-print_bad_pte-to-print_bad_page_map.patch mm-memory-convert-print_bad_pte-to-print_bad_page_map-fix.patch mm-memory-factor-out-common-code-from-vm_normal_page_.patch mm-introduce-and-use-vm_normal_page_pud.patch mm-rename-vm_ops-find_special_page-to-vm_ops-find_normal_page.patch prctl-extend-pr_set_thp_disable-to-optionally-exclude-vm_hugepage.patch mm-huge_memory-convert-tva_flags-to-enum-tva_type.patch mm-huge_memory-respect-madv_collapse-with-pr_thp_disable_except_advised.patch mm-stop-making-sparsemem_vmemmap-user-selectable.patch arm64-kconfig-drop-superfluous-select-sparsemem_vmemmap.patch s390-kconfig-drop-superfluous-select-sparsemem_vmemmap.patch x86-kconfig-drop-superfluous-select-sparsemem_vmemmap.patch wireguard-selftests-remove-config_sparsemem_vmemmap=y-from-qemu-kernel-config.patch mm-page_alloc-reject-unreasonable-folio-compound-page-sizes-in-alloc_contig_range_noprof.patch mm-memremap-reject-unreasonable-folio-compound-page-sizes-in-memremap_pages.patch mm-hugetlb-check-for-unreasonable-folio-sizes-when-registering-hstate.patch mm-mm_init-make-memmap_init_compound-look-more-like-prep_compound_page.patch mm-sanity-check-maximum-folio-size-in-folio_set_order.patch mm-limit-folio-compound-page-sizes-in-problematic-kernel-configs.patch mm-simplify-folio_page-and-folio_page_idx.patch mm-hugetlb-cleanup-hugetlb_folio_init_tail_vmemmap.patch mm-mm-percpu-km-drop-nth_page-usage-within-single-allocation.patch fs-hugetlbfs-remove-nth_page-usage-within-folio-in-adjust_range_hwpoison.patch fs-hugetlbfs-cleanup-folio-in-adjust_range_hwpoison.patch mm-pagewalk-drop-nth_page-usage-within-folio-in-folio_walk_start.patch mm-gup-drop-nth_page-usage-within-folio-when-recording-subpages.patch mm-gup-remove-record_subpages.patch io_uring-zcrx-remove-nth_page-usage-within-folio.patch mips-mm-convert-__flush_dcache_pages-to-__flush_dcache_folio_pages.patch mm-cma-refuse-handing-out-non-contiguous-page-ranges.patch dma-remap-drop-nth_page-in-dma_common_contiguous_remap.patch scatterlist-disallow-non-contigous-page-ranges-in-a-single-sg-entry.patch ata-libata-sff-drop-nth_page-usage-within-sg-entry.patch drm-i915-gem-drop-nth_page-usage-within-sg-entry.patch mspro_block-drop-nth_page-usage-within-sg-entry.patch memstick-drop-nth_page-usage-within-sg-entry.patch mmc-drop-nth_page-usage-within-sg-entry.patch scsi-scsi_lib-drop-nth_page-usage-within-sg-entry.patch scsi-sg-drop-nth_page-usage-within-sg-entry.patch vfio-pci-drop-nth_page-usage-within-sg-entry.patch crypto-remove-nth_page-usage-within-sg-entry.patch mm-gup-drop-nth_page-usage-in-unpin_user_page_range_dirty_lock.patch kfence-drop-nth_page-usage.patch block-update-comment-of-struct-bio_vec-regarding-nth_page.patch mm-remove-nth_page.patch selftests-mm-split_huge_page_test-fix-occasional-is_backed_by_folio-wrong-results.patch selftests-mm-split_huge_page_test-cleanups-for-split_pte_mapped_thp-test.patch