summaryrefslogtreecommitdiffstats
path: root/src/kernel/tests/lib/tst_hugepage.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/tests/lib/tst_hugepage.c')
-rw-r--r--src/kernel/tests/lib/tst_hugepage.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/kernel/tests/lib/tst_hugepage.c b/src/kernel/tests/lib/tst_hugepage.c
new file mode 100644
index 0000000..1d0e62e
--- /dev/null
+++ b/src/kernel/tests/lib/tst_hugepage.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2019 Red Hat, Inc.
+ */
+
+#define TST_NO_DEFAULT_MAIN
+
+#include "tst_test.h"
+#include "tst_hugepage.h"
+
+unsigned long tst_hugepages;
+char *nr_opt;
+char *Hopt;
+
+size_t tst_get_hugepage_size(void)
+{
+ if (access(PATH_HUGEPAGES, F_OK))
+ return 0;
+
+ return SAFE_READ_MEMINFO("Hugepagesize:") * 1024;
+}
+
+unsigned long tst_request_hugepages(unsigned long hpages)
+{
+ unsigned long val, max_hpages;
+
+ if (access(PATH_HUGEPAGES, F_OK)) {
+ tst_hugepages = 0;
+ goto out;
+ }
+
+ if (nr_opt)
+ tst_hugepages = SAFE_STRTOL(nr_opt, 1, LONG_MAX);
+ else
+ tst_hugepages = hpages;
+
+ SAFE_FILE_PRINTF("/proc/sys/vm/drop_caches", "3");
+ max_hpages = SAFE_READ_MEMINFO("MemFree:") / SAFE_READ_MEMINFO("Hugepagesize:");
+
+ if (tst_hugepages > max_hpages) {
+ tst_res(TINFO, "Requested number(%lu) of hugepages is too large, "
+ "limiting to 80%% of the max hugepage count %lu",
+ tst_hugepages, max_hpages);
+ tst_hugepages = max_hpages * 0.8;
+
+ if (tst_hugepages < 1)
+ goto out;
+ }
+
+ tst_sys_conf_save("?/proc/sys/vm/nr_hugepages");
+ SAFE_FILE_PRINTF(PATH_NR_HPAGES, "%lu", tst_hugepages);
+ SAFE_FILE_SCANF(PATH_NR_HPAGES, "%lu", &val);
+ if (val != tst_hugepages)
+ tst_brk(TCONF, "nr_hugepages = %lu, but expect %lu. "
+ "Not enough hugepages for testing.",
+ val, tst_hugepages);
+
+ tst_res(TINFO, "%lu hugepage(s) reserved", tst_hugepages);
+out:
+ return tst_hugepages;
+}