diff --git a/config.h b/config.h index 087f7b3f9..f40f333a9 100644 --- a/config.h +++ b/config.h @@ -24,6 +24,10 @@ #define DEFAULT_VALUES 64 #define DEFAULT_QUEUELEN 1024 +/** Number of hugepages which are requested from the the kernel. + * @see https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt */ +#define DEFAULT_NR_HUGEPAGES 25 + /** Width of log output in characters */ #define LOG_WIDTH 132 diff --git a/include/villas/kernel/kernel.h b/include/villas/kernel/kernel.h index 10e750468..300866e1c 100644 --- a/include/villas/kernel/kernel.h +++ b/include/villas/kernel/kernel.h @@ -12,6 +12,8 @@ #include +#include "config.h" + //#include /** Check if current process has capability \p cap. @@ -19,7 +21,13 @@ * @retval 0 If capabilty is present. * @retval <0 If capability is not present. */ -//int kernel_check_cap(cap_value_t cap): +//int kernel_check_cap(cap_value_t cap); + +/** Get number of reserved hugepages. */ +int kernel_get_nr_hugepages(); + +/** Set number of reserved hugepages. */ +int kernel_set_nr_hugepages(int nr); /** Checks for realtime (PREEMPT_RT) patched kernel. * diff --git a/include/villas/memory.h b/include/villas/memory.h index f6e3064f5..e546c106b 100644 --- a/include/villas/memory.h +++ b/include/villas/memory.h @@ -44,6 +44,9 @@ struct memzone { size_t len; }; +/** Initilialize memory subsystem */ +int memory_init(); + /** Allocate \p len bytes memory of type \p m. * * @retval NULL If allocation failed. diff --git a/lib/kernel/kernel.c b/lib/kernel/kernel.c index b2c9b94cc..00a0818e7 100644 --- a/lib/kernel/kernel.c +++ b/lib/kernel/kernel.c @@ -152,6 +152,38 @@ int kernel_get_cacheline_size() return sysconf(_SC_LEVEL1_ICACHE_LINESIZE); } +int kernel_get_nr_hugepages() +{ + FILE *f; + int nr, ret; + + f = fopen(PROCFS_PATH "/sys/vm/nr_hugepages", "r"); + if (!f) + serror("Failed to open %s", PROCFS_PATH "/sys/vm/nr_hugepages"); + + ret = fscanf(f, "%d", &nr); + if (ret != 1) + nr = -1; + + fclose(f); + + return nr; +} + +int kernel_set_nr_hugepages(int nr) +{ + FILE *f; + + f = fopen(PROCFS_PATH "/sys/vm/nr_hugepages", "w"); + if (!f) + serror("Failed to open %s", PROCFS_PATH "/sys/vm/nr_hugepages"); + + fprintf(f, "%d\n", nr); + fclose(f); + + return 0; +} + #if 0 int kernel_check_cap(cap_value_t cap) { diff --git a/lib/memory.c b/lib/memory.c index 2f46161b3..2e3120450 100644 --- a/lib/memory.c +++ b/lib/memory.c @@ -12,11 +12,26 @@ /* Required to allocate hugepages on Apple OS X */ #ifdef __MACH__ #include +#elif defined(__linux__) + #include "kernel/kernel.h" #endif #include "log.h" #include "memory.h" +int memory_init() +{ +#ifdef __linux__ + int nr = kernel_get_nr_hugepages(); + + debug(DBG_MEM | 2, "System has %d reserved hugepages", nr); + + if (nr < DEFAULT_NR_HUGEPAGES) + kernel_set_nr_hugepages(DEFAULT_NR_HUGEPAGES); +#endif + return 0; +} + void * memory_alloc(const struct memtype *m, size_t len) { debug(DBG_MEM | 2, "Allocating %#zx bytes of %s memory", len, m->name); diff --git a/src/node.c b/src/node.c index 93c42b1fc..a578f507a 100644 --- a/src/node.c +++ b/src/node.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -124,6 +125,9 @@ int main(int argc, char *argv[]) info("Initialize real-time system"); rt_init(settings.affinity, settings.priority); + + info("Initialize memory system"); + memory_init(); info("Initialize signals"); signals_init(); diff --git a/src/pipe.c b/src/pipe.c index 2226c917d..16c4e0a35 100644 --- a/src/pipe.c +++ b/src/pipe.c @@ -225,6 +225,9 @@ int main(int argc, char *argv[]) info("Initialize real-time system"); rt_init(settings.affinity, settings.priority); + info("Initialize memory system"); + memory_init(); + /* Initialize node */ node = list_lookup(&nodes, argv[2]); if (!node) diff --git a/src/test.c b/src/test.c index bb31796d0..18d8e8eef 100644 --- a/src/test.c +++ b/src/test.c @@ -87,6 +87,9 @@ int main(int argc, char *argv[]) log_init(); cfg_parse(argv[1], &config, &settings, &nodes, NULL); + info("Initialize memory system"); + memory_init(); + node = list_lookup(&nodes, argv[3]); if (!node) error("There's no node with the name '%s'", argv[3]); diff --git a/tests/Makefile.inc b/tests/Makefile.inc index 9bac51525..277851453 100644 --- a/tests/Makefile.inc +++ b/tests/Makefile.inc @@ -8,7 +8,6 @@ TEST_LDLIBS = $(LDLIBS) -lcriterion -lvillas -pthread tests: $(BUILDDIR)/testsuite run-tests: tests - echo 25 > /proc/sys/vm/nr_hugepages $(BUILDDIR)/testsuite # Compile