1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

memory: move initialization of hugepages to hugepage.c

This commit is contained in:
Steffen Vogel 2018-12-04 10:46:02 +01:00
parent 9d6c7ecefa
commit 772003983d
4 changed files with 38 additions and 28 deletions

View file

@ -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.

View file

@ -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);

View file

@ -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;
}

View file

@ -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;
}