Hi Mike!
On 4/29/26 2:12 AM, Mike Rapoport wrote:
> From: "Mike Rapoport (Microsoft)" <[email protected]>
>
> hugepage_dio test fails if there are no free huge pages prepared by a
> wrapper script.
>
> Add setup of HugeTLB pages to the test and make sure that the original
> settings are restored on the test exit.
>
> Signed-off-by: Mike Rapoport (Microsoft) <[email protected]>
> ---
> tools/testing/selftests/mm/hugetlb_dio.c | 10 ++--------
> 1 file changed, 2 insertions(+), 8 deletions(-)
>
> diff --git a/tools/testing/selftests/mm/hugetlb_dio.c
> b/tools/testing/selftests/mm/hugetlb_dio.c
> index 47019433ddaf..fb4600570e13 100644
> --- a/tools/testing/selftests/mm/hugetlb_dio.c
> +++ b/tools/testing/selftests/mm/hugetlb_dio.c
> @@ -85,8 +85,6 @@ static void run_dio_using_hugetlb(int fd, unsigned int
> start_off,
>
> /* Get the default huge page size */
> h_pagesize = default_huge_page_size();
> - if (!h_pagesize)
> - ksft_exit_fail_msg("Unable to determine huge page size\n");
>
> /* Reset file position since fd is shared across tests */
> if (lseek(fd, 0, SEEK_SET) < 0)
> @@ -94,10 +92,6 @@ static void run_dio_using_hugetlb(int fd, unsigned int
> start_off,
>
> /* Get the free huge pages before allocation */
> free_hpage_b = hugetlb_free_default_pages();
> - if (free_hpage_b == 0) {
> - close(fd);
> - ksft_exit_skip("No free hugepage, exiting!\n");
> - }
>
> /* Allocate a hugetlb page */
> orig_buffer = mmap(NULL, h_pagesize, mmap_prot, mmap_flags, -1, 0);
> @@ -141,8 +135,8 @@ int main(void)
>
> ksft_print_header();
>
> - /* Check if huge pages are free */
> - if (!hugetlb_free_default_pages())
> + /* request a huge page */
> + if (!hugetlb_setup_default(1))
> ksft_exit_skip("No free hugepage, exiting\n");
Before applying the patch, I get the following output:
TAP version 13
1..4
# No. Free pages before allocation : 112
# No. Free pages after munmap : 112
ok 1 free huge pages from 0-12288
# No. Free pages before allocation : 112
# No. Free pages after munmap : 112
ok 2 free huge pages from 0-10240
# No. Free pages before allocation : 112
# No. Free pages after munmap : 112
ok 3 free huge pages from 2048-12288
# No. Free pages before allocation : 112
# No. Free pages after munmap : 112
ok 4 free huge pages from 2048-14336
# Totals: pass:4 fail:0 xfail:0 xpass:0 skip:0 error:0
After applying the patch, I get this:
TAP version 13
# [INFO] detected hugetlb page size: 2048 KiB
# [INFO] detected hugetlb page size: 32768 KiB
# [INFO] detected hugetlb page size: 64 KiB
# [INFO] detected hugetlb page size: 1048576 KiB
1..0 # SKIP No free hugepage, exiting
even when I have 112 free and 128 total hugepages of size 2MB (default
for my system).
Could it be because hugetlb_setup_default(1) here is trying to set the
default hugetlb pool size to exactly 1, and then checking whether there
is exactly 1 free hugepage, instead of simply checking whether at least
1 free hugepage is available?
>
> fd = open("/tmp", O_TMPFILE | O_RDWR | O_DIRECT, 0664);