Re: [PATCH v3 42/54] selftests/mm: hugetlb-soft-online: add setup of HugeTLB pages

Sarthak Sharma
2026-05-05T07:17:11Z

Hi Mike!

On 4/29/26 2:12 AM, Mike Rapoport wrote:
> From: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
>
> hugetlb-soft-online test uses open coded access to /proc to determine
> availability of huge pages and fails if there are no enough free huget
> pages..
>
> Replace open coded access to /proc with hugepage helpers and 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) <rppt@kernel.org>

The test is hugetlb-soft-offline, so let's change the commit title and
commit message to say "offine" instead of "online".

I have run the test before and after applying the patch. Before the
patch, it failed with an mmap error when hugepages were not
preallocated. After applying the patch, the test correctly allocates the
required hugepages and the test passes.

Tested-by: Sarthak Sharma <sarthak.sharma@arm.com>

> ---
> .../selftests/mm/hugetlb-soft-offline.c | 45 ++++---------------
> 1 file changed, 8 insertions(+), 37 deletions(-)
>
> diff --git a/tools/testing/selftests/mm/hugetlb-soft-offline.c b/tools/testing/selftests/mm/hugetlb-soft-offline.c
> index a8bc02688085..bc202e4ed2bd 100644
> --- a/tools/testing/selftests/mm/hugetlb-soft-offline.c
> +++ b/tools/testing/selftests/mm/hugetlb-soft-offline.c
> @@ -6,9 +6,7 @@
> * - if enable_soft_offline = 1, a hugepage should be dissolved and
> * nr_hugepages/free_hugepages should be reduced by 1.
> *
> - * Before running, make sure more than 2 hugepages of default_hugepagesz
> - * are allocated. For example, if /proc/meminfo/Hugepagesize is 2048kB:
> - * echo 8 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
> + * The test allocates 8 default hugepages
> */
>
> #define _GNU_SOURCE
> @@ -25,6 +23,7 @@
> #include <sys/types.h>
>
> #include "kselftest.h"
> +#include "hugepage_settings.h"
>
> #ifndef MADV_SOFT_OFFLINE
> #define MADV_SOFT_OFFLINE 101
> @@ -100,32 +99,6 @@ static int set_enable_soft_offline(int value)
> return 0;
> }
>
> -static int read_nr_hugepages(unsigned long hugepage_size,
> - unsigned long *nr_hugepages)
> -{
> - char buffer[256] = {0};
> - char cmd[256] = {0};
> -
> - sprintf(cmd, "cat /sys/kernel/mm/hugepages/hugepages-%ldkB/nr_hugepages",
> - hugepage_size);
> - FILE *cmdfile = popen(cmd, "r");
> -
> - if (cmdfile == NULL) {
> - ksft_perror(EPREFIX "failed to popen nr_hugepages");
> - return -1;
> - }
> -
> - if (!fgets(buffer, sizeof(buffer), cmdfile)) {
> - ksft_perror(EPREFIX "failed to read nr_hugepages");
> - pclose(cmdfile);
> - return -1;
> - }
> -
> - *nr_hugepages = atoll(buffer);
> - pclose(cmdfile);
> - return 0;
> -}
> -
> static int create_hugetlbfs_file(struct statfs *file_stat)
> {
> int fd;
> @@ -177,20 +150,14 @@ static void test_soft_offline_common(int enable_soft_offline)
> ksft_exit_fail_msg("Failed to set enable_soft_offline\n");
> }
>
> - if (read_nr_hugepages(hugepagesize_kb, &nr_hugepages_before) != 0) {
> - close(fd);
> - ksft_exit_fail_msg("Failed to read nr_hugepages\n");
> - }
> + nr_hugepages_before = hugetlb_nr_default_pages();
>
> ksft_print_msg("Before MADV_SOFT_OFFLINE nr_hugepages=%ld\n",
> nr_hugepages_before);
>
> ret = do_soft_offline(fd, 2 * file_stat.f_bsize, expect_errno);
>
> - if (read_nr_hugepages(hugepagesize_kb, &nr_hugepages_after) != 0) {
> - close(fd);
> - ksft_exit_fail_msg("Failed to read nr_hugepages\n");
> - }
> + nr_hugepages_after = hugetlb_nr_default_pages();
>
> ksft_print_msg("After MADV_SOFT_OFFLINE nr_hugepages=%ld\n",
> nr_hugepages_after);
> @@ -219,6 +186,10 @@ static void test_soft_offline_common(int enable_soft_offline)
> int main(int argc, char **argv)
> {
> ksft_print_header();
> +
> + if (!hugetlb_setup_default(8))
> + ksft_exit_skip("not enough hugetlb pages\n");
> +
> ksft_set_plan(2);
>
> test_soft_offline_common(1);