diff options
Diffstat (limited to 'src/vppinfra/linux/mem.c')
-rw-r--r-- | src/vppinfra/linux/mem.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/src/vppinfra/linux/mem.c b/src/vppinfra/linux/mem.c index 3b752cf43cf..734f5c4788c 100644 --- a/src/vppinfra/linux/mem.c +++ b/src/vppinfra/linux/mem.c @@ -28,9 +28,9 @@ #include <vppinfra/mem.h> #include <vppinfra/lock.h> #include <vppinfra/time.h> +#include <vppinfra/bitmap.h> #include <vppinfra/format.h> #include <vppinfra/clib_error.h> -#include <vppinfra/linux/sysfs.h> #ifndef F_LINUX_SPECIFIC_BASE #define F_LINUX_SPECIFIC_BASE 1024 @@ -99,9 +99,10 @@ legacy_get_log2_default_hugepage_size (void) } void -clib_mem_main_init () +clib_mem_main_init (void) { clib_mem_main_t *mm = &clib_mem_main; + long sysconf_page_size; uword page_size; void *va; int fd; @@ -110,7 +111,12 @@ clib_mem_main_init () return; /* system page size */ - page_size = sysconf (_SC_PAGESIZE); + sysconf_page_size = sysconf (_SC_PAGESIZE); + if (sysconf_page_size < 0) + { + clib_panic ("Could not determine the page size"); + } + page_size = sysconf_page_size; mm->log2_page_sz = min_log2 (page_size); /* default system hugeppage size */ @@ -261,7 +267,7 @@ clib_mem_vm_create_fd (clib_mem_page_sz_t log2_page_size, char *fmt, ...) /* memfd_create maximum string size is 249 chars without trailing zero */ if (vec_len (s) > 249) - _vec_len (s) = 249; + vec_set_len (s, 249); vec_add1 (s, 0); /* memfd_create introduced in kernel 3.17, we don't support older kernels */ @@ -455,14 +461,12 @@ clib_mem_vm_map_internal (void *base, clib_mem_page_sz_t log2_page_sz, else mm->first_map = hdr; - CLIB_MEM_UNPOISON (hdr, sys_page_sz); + clib_mem_unpoison (hdr, sys_page_sz); hdr->next = 0; hdr->prev = mm->last_map; snprintf (hdr->name, CLIB_VM_MAP_HDR_NAME_MAX_LEN - 1, "%s", (char *) name); mm->last_map = hdr; - map_unlock (); - hdr->base_addr = (uword) base; hdr->log2_page_sz = log2_page_sz; hdr->num_pages = size >> log2_page_sz; @@ -470,7 +474,9 @@ clib_mem_vm_map_internal (void *base, clib_mem_page_sz_t log2_page_sz, hdr->name[CLIB_VM_MAP_HDR_NAME_MAX_LEN - 1] = 0; mprotect (hdr, sys_page_sz, PROT_NONE); - CLIB_MEM_UNPOISON (base, size); + map_unlock (); + + clib_mem_unpoison (base, size); return base; } @@ -608,8 +614,8 @@ __clib_export int clib_mem_set_numa_affinity (u8 numa_node, int force) { clib_mem_main_t *mm = &clib_mem_main; - long unsigned int mask[16] = { 0 }; - int mask_len = sizeof (mask) * 8 + 1; + clib_bitmap_t *bmp = 0; + int rv; /* no numa support */ if (mm->numa_node_bitmap == 0) @@ -625,19 +631,21 @@ clib_mem_set_numa_affinity (u8 numa_node, int force) return 0; } - mask[0] = 1 << numa_node; + bmp = clib_bitmap_set (bmp, numa_node, 1); - if (syscall (__NR_set_mempolicy, force ? MPOL_BIND : MPOL_PREFERRED, mask, - mask_len)) - goto error; + rv = syscall (__NR_set_mempolicy, force ? MPOL_BIND : MPOL_PREFERRED, bmp, + vec_len (bmp) * sizeof (bmp[0]) * 8 + 1); + clib_bitmap_free (bmp); vec_reset_length (mm->error); - return 0; -error: - vec_reset_length (mm->error); - mm->error = clib_error_return_unix (mm->error, (char *) __func__); - return CLIB_MEM_ERROR; + if (rv) + { + mm->error = clib_error_return_unix (mm->error, (char *) __func__); + return CLIB_MEM_ERROR; + } + + return 0; } __clib_export int |