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]>
---
 .../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);
-- 
2.53.0


Reply via email to