Hi Mike! On 4/29/26 2:12 AM, Mike Rapoport wrote: > From: "Mike Rapoport (Microsoft)" <[email protected]> > > 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) <[email protected]>
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 <[email protected]> > --- > .../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);

