Commit 3dc40cf8 authored by Paolo Bonzini's avatar Paolo Bonzini

selftests: KVM: skip hugetlb tests if huge pages are not available

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: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 53293cb8
...@@ -165,26 +165,33 @@ size_t get_trans_hugepagesz(void) ...@@ -165,26 +165,33 @@ size_t get_trans_hugepagesz(void)
size_t get_def_hugetlb_pagesz(void) size_t get_def_hugetlb_pagesz(void)
{ {
char buf[64]; char buf[64];
const char *tag = "Hugepagesize:"; const char *hugepagesize = "Hugepagesize:";
const char *hugepages_total = "HugePages_Total:";
FILE *f; FILE *f;
f = fopen("/proc/meminfo", "r"); f = fopen("/proc/meminfo", "r");
TEST_ASSERT(f != NULL, "Error in opening /proc/meminfo"); TEST_ASSERT(f != NULL, "Error in opening /proc/meminfo");
while (fgets(buf, sizeof(buf), f) != NULL) { 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); fclose(f);
return strtoull(buf + strlen(tag), NULL, 10) << 10; return strtoull(buf + strlen(hugepagesize), NULL, 10) << 10;
} }
} }
if (feof(f)) if (feof(f)) {
TEST_FAIL("HUGETLB is not configured in host kernel"); fprintf(stderr, "HUGETLB is not configured in host kernel");
else exit(KSFT_SKIP);
TEST_FAIL("Error in reading /proc/meminfo"); }
fclose(f); TEST_FAIL("Error in reading /proc/meminfo");
return 0;
} }
#define ANON_FLAGS (MAP_PRIVATE | MAP_ANONYMOUS) #define ANON_FLAGS (MAP_PRIVATE | MAP_ANONYMOUS)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment