selftests: KVM: skip hugetlb tests if huge pages are not available
authorPaolo Bonzini <pbonzini@redhat.com>
Tue, 14 Mar 2023 12:35:16 +0000 (08:35 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 14 Mar 2023 14:20:06 +0000 (10:20 -0400)
Right now, if KVM memory stress tests are run with hugetlb sources but hugetlb is
not available (either in the kernel or because /proc/sys/vm/nr_hugepages is 0)
the test will fail with a memory allocation error.

This makes it impossible to add tests that default to hugetlb-backed memory,
because on a machine with a default configuration they will fail.  Therefore,
check HugePages_Total as well and, if zero, direct the user to enable hugepages
in procfs.  Furthermore, return KSFT_SKIP whenever hugetlb is not available.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/lib/test_util.c

index 5c22fa4..b772193 100644 (file)
@@ -165,26 +165,33 @@ size_t get_trans_hugepagesz(void)
 size_t get_def_hugetlb_pagesz(void)
 {
        char buf[64];
-       const char *tag = "Hugepagesize:";
+       const char *hugepagesize = "Hugepagesize:";
+       const char *hugepages_total = "HugePages_Total:";
        FILE *f;
 
        f = fopen("/proc/meminfo", "r");
        TEST_ASSERT(f != NULL, "Error in opening /proc/meminfo");
 
        while (fgets(buf, sizeof(buf), f) != NULL) {
-               if (strstr(buf, tag) == buf) {
+               if (strstr(buf, hugepages_total) == buf) {
+                       unsigned long long total = strtoull(buf + strlen(hugepages_total), NULL, 10);
+                       if (!total) {
+                               fprintf(stderr, "HUGETLB is not enabled in /proc/sys/vm/nr_hugepages\n");
+                               exit(KSFT_SKIP);
+                       }
+               }
+               if (strstr(buf, hugepagesize) == buf) {
                        fclose(f);
-                       return strtoull(buf + strlen(tag), NULL, 10) << 10;
+                       return strtoull(buf + strlen(hugepagesize), NULL, 10) << 10;
                }
        }
 
-       if (feof(f))
-               TEST_FAIL("HUGETLB is not configured in host kernel");
-       else
-               TEST_FAIL("Error in reading /proc/meminfo");
+       if (feof(f)) {
+               fprintf(stderr, "HUGETLB is not configured in host kernel");
+               exit(KSFT_SKIP);
+       }
 
-       fclose(f);
-       return 0;
+       TEST_FAIL("Error in reading /proc/meminfo");
 }
 
 #define ANON_FLAGS     (MAP_PRIVATE | MAP_ANONYMOUS)