]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/mm: hugetlb-soft-offline: add setup of HugeTLB pages
authorMike Rapoport (Microsoft) <rppt@kernel.org>
Mon, 11 May 2026 16:28:27 +0000 (19:28 +0300)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 21 Jun 2026 18:37:28 +0000 (11:37 -0700)
hugetlb-soft-offline 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.

Link: https://lore.kernel.org/20260511162840.375890-44-rppt@kernel.org
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Tested-by: Luiz Capitulino <luizcap@redhat.com>
Tested-by: Sarthak Sharma <sarthak.sharma@arm.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Barry Song <baohua@kernel.org>
Cc: David Hildenbrand <david@kernel.org>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Donet Tom <donettom@linux.ibm.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Lance Yang <lance.yang@linux.dev>
Cc: Leon Romanovsky <leon@kernel.org>
Cc: Liam Howlett <liam@infradead.org>
Cc: Li Wang <li.wang@linux.dev>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Nico Pache <npache@redhat.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/hugetlb-soft-offline.c

index a8bc02688085743cd420667447d3a028110a1d86..bc202e4ed2bda743dc2891ae074159c2d7907ecb 100644 (file)
@@ -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);