diff --git a/include/villas/memory.h b/include/villas/memory.h index 9a33c1ff1..cce816e2c 100644 --- a/include/villas/memory.h +++ b/include/villas/memory.h @@ -71,6 +71,8 @@ struct memory_allocation { /** Initilialize memory subsystem */ int memory_init(int hugepages); +int memory_lock(size_t lock); + /** Allocate \p len bytes memory of type \p m. * * @retval NULL If allocation failed. diff --git a/include/villas/memory_type.h b/include/villas/memory_type.h index 2196a7158..0b5a348e7 100644 --- a/include/villas/memory_type.h +++ b/include/villas/memory_type.h @@ -62,7 +62,7 @@ extern struct memory_type memory_hugepage; struct memory_type * memory_ib(struct node *n, struct memory_type *parent); struct memory_type * memory_managed(void *ptr, size_t len); -int memory_hugepage_init(); +int memory_hugepage_init(int hugepages); struct memory_type * memory_type_lookup(enum memory_type_flags flags); diff --git a/lib/memory.c b/lib/memory.c index c1e4fa9cb..7f5ad406c 100644 --- a/lib/memory.c +++ b/lib/memory.c @@ -55,36 +55,25 @@ int memory_init(int hugepages) info("Initialize memory sub-system: #hugepages=%d", hugepages); - /* Initialize hugepage allocator */ - ret = memory_hugepage_init(); + ret = memory_hugepage_init(hugepages); if (ret) return ret; + size_t lock = kernel_get_hugepage_size() * hugepages; + + ret = memory_lock(lock); + if (ret) + return ret; + + return 0; +} + +int memory_lock(size_t lock) +{ #if defined(__linux__) && defined(__x86_64__) - int pagecnt, pagesz; + int ret; struct rlimit l; - pagecnt = kernel_get_nr_hugepages(); - if (pagecnt < hugepages) { - if (getuid() == 0) { - kernel_set_nr_hugepages(hugepages); - debug(LOG_MEM | 2, "Increased number of reserved hugepages from %d to %d", pagecnt, hugepages); - } - else { - warning("Failed to reserved hugepages. Please re-run as super-user or reserve manually via:"); - warning(" $ echo %d > /proc/sys/vm/nr_hugepages", hugepages); - - return -1; - } - } - - pagesz = kernel_get_hugepage_size(); - if (pagesz < 0) - return -1; - - /* Amount of memory which should be lockable */ - size_t lock = pagesz * hugepages; - ret = getrlimit(RLIMIT_MEMLOCK, &l); if (ret) return ret; @@ -111,6 +100,7 @@ int memory_init(int hugepages) debug(LOG_MEM | 2, "Increased ressource limit of locked memory to %zd bytes", lock); } #endif + return 0; } @@ -125,13 +115,13 @@ void * memory_alloc_aligned(struct memory_type *m, size_t len, size_t alignment) struct memory_allocation *ma = m->alloc(m, len, alignment); if (ma == NULL) { - warning("memory_alloc_aligned: allocating memory for memory_allocation failed for memory type %s. Reason: %s", m->name, strerror(errno) ); + warning("Memory allocation of type %s failed. reason=%s", m->name, strerror(errno) ); return NULL; } ret = hash_table_insert(&allocations, ma->address, ma); if (ret) { - warning("memory_alloc_aligned: Inserting into hash table failed!"); + warning("Inserting into hash table failed!"); return NULL; } diff --git a/lib/memory/hugepage.c b/lib/memory/hugepage.c index 7af15e99d..80c5128a7 100644 --- a/lib/memory/hugepage.c +++ b/lib/memory/hugepage.c @@ -45,7 +45,7 @@ static size_t pgsz = -1; static size_t hugepgsz = -1; -int memory_hugepage_init() +int memory_hugepage_init(int hugepages) { pgsz = kernel_get_page_size(); if (pgsz < 0) @@ -55,6 +55,24 @@ int memory_hugepage_init() if (hugepgsz < 0) return -1; +#if defined(__linux__) && defined(__x86_64__) + int pagecnt; + + pagecnt = kernel_get_nr_hugepages(); + if (pagecnt < hugepages) { + if (getuid() == 0) { + kernel_set_nr_hugepages(hugepages); + debug(LOG_MEM | 2, "Increased number of reserved hugepages from %d to %d", pagecnt, hugepages); + } + else { + warning("Failed to reserved hugepages. Please re-run as super-user or reserve manually via:"); + warning(" $ echo %d > /proc/sys/vm/nr_hugepages", hugepages); + + return -1; + } + } +#endif + return 0; }