From 298d1162e664662fc59bbf4bd63a51a085794230 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 2 Apr 2017 00:14:17 +0200 Subject: [PATCH] increase limit of locked memory automatically during initlialization --- .gitlab-ci.yml | 6 ------ include/villas/kernel/kernel.h | 6 ++++++ lib/kernel/kernel.c | 28 ++++++++++++++++++++++++++++ lib/memory.c | 31 +++++++++++++++++++++++++++---- packaging/Makefile.inc | 2 +- 5 files changed, 62 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 25fc66201..8244e6773 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -78,8 +78,6 @@ packages: coverage: stage: test - before_script: - - ulimit -l 1073741824 script: - make coverage COVERAGE=1 artifacts: @@ -96,8 +94,6 @@ unit: stage: test dependencies: - build - before_script: - - ulimit -l 1073741824 script: - make run-unit-tests image: $DOCKER_REGISTRY/villas-dev @@ -108,8 +104,6 @@ integration: stage: test dependencies: - build - before_script: - - ulimit -l 1073741824 - make install script: - make run-integration-tests diff --git a/include/villas/kernel/kernel.h b/include/villas/kernel/kernel.h index cdb868be3..b8a54af81 100644 --- a/include/villas/kernel/kernel.h +++ b/include/villas/kernel/kernel.h @@ -62,6 +62,12 @@ int kernel_module_set_param(const char *module, const char *param, const char *v /** Get cacheline size in bytes */ int kernel_get_cacheline_size(); +/** Get the size of a standard page in bytes. */ +int kernel_get_page_size(); + +/** Get the size of a huge page in bytes. */ +int kernel_get_hugepage_size(); + /** Set SMP affinity of IRQ */ int kernel_irq_setaffinity(unsigned irq, uintmax_t new, uintmax_t *old); diff --git a/lib/kernel/kernel.c b/lib/kernel/kernel.c index 9ce6131c8..f4969ef62 100644 --- a/lib/kernel/kernel.c +++ b/lib/kernel/kernel.c @@ -145,6 +145,34 @@ int kernel_get_cacheline_size() return sysconf(_SC_LEVEL1_ICACHE_LINESIZE); } +int kernel_get_page_size() +{ + return sysconf(_SC_PAGESIZE); +} + +/* There is no sysconf interface to get the hugepage size */ +int kernel_get_hugepage_size() +{ + char *key, *value, *unit, *line = NULL; + size_t len = 0; + FILE *f; + + f = fopen(PROCFS_PATH "/meminfo", "r"); + if (!f) + return -1; + + while (getline(&line, &len, f) != -1) { + key = strtok(line, ": "); + value = strtok(NULL, " "); + unit = strtok(NULL, "\n"); + + if (!strcmp(key, "Hugepagesize") && !strcmp(unit, "kB")) + return strtoul(value, NULL, 10) * 1024; + } + + return -1; +} + int kernel_get_nr_hugepages() { FILE *f; diff --git a/lib/memory.c b/lib/memory.c index 15ae7e794..f906f0d1c 100644 --- a/lib/memory.c +++ b/lib/memory.c @@ -6,6 +6,8 @@ #include #include +#include +#include /* Required to allocate hugepages on Apple OS X */ #ifdef __MACH__ @@ -21,13 +23,34 @@ int memory_init(int hugepages) { #ifdef __linux__ + int ret, pagecnt, pagesz; + struct rlimit l; + info("Initialize memory sub-system"); - int nr = kernel_get_nr_hugepages(); - - if (nr < hugepages) { INDENT + pagecnt = kernel_get_nr_hugepages(); + if (pagecnt < hugepages) { INDENT kernel_set_nr_hugepages(hugepages); - debug(LOG_MEM | 2, "Reserved %d hugepages (was %d)", hugepages, nr); + debug(LOG_MEM | 2, "Reserved %d hugepages (was %d)", hugepages, pagecnt); + } + + pagesz = kernel_get_hugepage_size(); + if (pagesz < 0) + return -1; + + ret = getrlimit(RLIMIT_MEMLOCK, &l); + if (ret) + return ret; + + if (l.rlim_cur < pagesz * pagecnt) { + l.rlim_cur = pagesz * pagecnt; + l.rlim_max = l.rlim_cur; + + ret = setrlimit(RLIMIT_MEMLOCK, &l); + if (ret) + return ret; + + debug(LOG_MEM | 2, "Increased ressource limit of locked memory to %d bytes", pagesz * pagecnt); } #endif return 0; diff --git a/packaging/Makefile.inc b/packaging/Makefile.inc index 0d823382d..a81ceb6a3 100644 --- a/packaging/Makefile.inc +++ b/packaging/Makefile.inc @@ -24,7 +24,7 @@ deploy-rpm: # Docker targets run-docker-dev: - docker run -it -p 80:80 -p 443:443 -p 1234:1234 --privileged --cap-add sys_nic --ulimit memlock=1073741824 --security-opt seccomp:unconfined -v $(PWD):/villas villas-dev + docker run -it -p 80:80 -p 443:443 -p 1234:1234 --privileged --cap-add sys_nic --security-opt seccomp:unconfined -v $(PWD):/villas villas-dev docker-dev: docker build -f Dockerfile.dev -t villas-dev $(SRCDIR)