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

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
Loading
Loading
Loading
Loading
+16 −9
Original line number Diff line number Diff line
@@ -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)