X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fvppinfra%2Fmem.h;h=e565757ed3eef4c6d210f3c8c5dbea7391470d29;hb=78af0a8c5ff1a33ff8dccb1b2ea6ffadb8ef7b62;hp=04c26d218aaf0ee41a4e3f2e13fbc6e1a3057bf9;hpb=b7b929931a07fbb27b43d5cd105f366c3e29807e;p=vpp.git diff --git a/src/vppinfra/mem.h b/src/vppinfra/mem.h index 04c26d218aa..e565757ed3e 100644 --- a/src/vppinfra/mem.h +++ b/src/vppinfra/mem.h @@ -60,6 +60,27 @@ /* Per CPU heaps. */ extern void *clib_per_cpu_mheaps[CLIB_MAX_MHEAPS]; +always_inline void +clib_mem_set_thread_index (void) +{ + /* + * Find an unused slot in the per-cpu-mheaps array, + * and grab it for this thread. We need to be able to + * push/pop the thread heap without affecting other thread(s). + */ + int i; + if (__os_thread_index != 0) + return; + for (i = 0; i < ARRAY_LEN (clib_per_cpu_mheaps); i++) + if (clib_atomic_bool_cmp_and_swap (&clib_per_cpu_mheaps[i], + 0, clib_per_cpu_mheaps[0])) + { + os_set_thread_index (i); + break; + } + ASSERT (__os_thread_index > 0); +} + always_inline void * clib_mem_get_per_cpu_heap (void) { @@ -232,7 +253,7 @@ clib_mem_realloc (void *p, uword new_size, uword old_size) copy_size = old_size; else copy_size = new_size; - clib_memcpy (q, p, copy_size); + clib_memcpy_fast (q, p, copy_size); clib_mem_free (p); } return q; @@ -251,6 +272,14 @@ clib_mem_size (void *p) #endif } +always_inline void +clib_mem_free_s (void *p) +{ + uword size = clib_mem_size (p); + memset_s_inline (p, size, 0, size); + clib_mem_free (p); +} + always_inline void * clib_mem_get_heap (void) { @@ -274,6 +303,8 @@ void clib_mem_validate (void); void clib_mem_trace (int enable); +int clib_mem_is_traced (void); + typedef struct { /* Total number of objects allocated. */ @@ -386,11 +417,13 @@ typedef struct uword requested_va; /**< Request fixed position mapping */ } clib_mem_vm_alloc_t; +clib_error_t *clib_mem_create_fd (char *name, int *fdp); clib_error_t *clib_mem_create_hugetlb_fd (char *name, int *fdp); clib_error_t *clib_mem_vm_ext_alloc (clib_mem_vm_alloc_t * a); void clib_mem_vm_ext_free (clib_mem_vm_alloc_t * a); -u64 clib_mem_vm_get_page_size (int fd); -int clib_mem_vm_get_log2_page_size (int fd); +u64 clib_mem_get_fd_page_size (int fd); +uword clib_mem_get_default_hugepage_size (void); +int clib_mem_get_fd_log2_page_size (int fd); u64 *clib_mem_vm_get_paddr (void *mem, int log2_page_size, int n_pages); typedef struct @@ -404,6 +437,8 @@ typedef struct clib_error_t *clib_mem_vm_ext_map (clib_mem_vm_map_t * a); void clib_mem_vm_randomize_va (uword * requested_va, u32 log2_page_size); void mheap_trace (void *v, int enable); +uword clib_mem_trace_enable_disable (uword enable); +void clib_mem_trace (int enable); #include /* clib_panic */