+#define CLIB_MAX_NUMAS 16
+#define CLIB_MEM_VM_MAP_FAILED ((void *) ~0)
+#define CLIB_MEM_ERROR (-1)
+
+typedef enum
+{
+ CLIB_MEM_PAGE_SZ_UNKNOWN = 0,
+ CLIB_MEM_PAGE_SZ_DEFAULT = 1,
+ CLIB_MEM_PAGE_SZ_DEFAULT_HUGE = 2,
+ CLIB_MEM_PAGE_SZ_4K = 12,
+ CLIB_MEM_PAGE_SZ_16K = 14,
+ CLIB_MEM_PAGE_SZ_64K = 16,
+ CLIB_MEM_PAGE_SZ_1M = 20,
+ CLIB_MEM_PAGE_SZ_2M = 21,
+ CLIB_MEM_PAGE_SZ_16M = 24,
+ CLIB_MEM_PAGE_SZ_32M = 25,
+ CLIB_MEM_PAGE_SZ_512M = 29,
+ CLIB_MEM_PAGE_SZ_1G = 30,
+ CLIB_MEM_PAGE_SZ_16G = 34,
+} clib_mem_page_sz_t;
+
+typedef struct _clib_mem_vm_map_hdr
+{
+ /* base address */
+ uword base_addr;
+
+ /* number of pages */
+ uword num_pages;
+
+ /* page size (log2) */
+ clib_mem_page_sz_t log2_page_sz;
+
+ /* file descriptor, -1 if memory is not shared */
+ int fd;
+
+ /* allocation mame */
+#define CLIB_VM_MAP_HDR_NAME_MAX_LEN 64
+ char name[CLIB_VM_MAP_HDR_NAME_MAX_LEN];
+
+ /* linked list */
+ struct _clib_mem_vm_map_hdr *prev, *next;
+} clib_mem_vm_map_hdr_t;
+
+#define foreach_clib_mem_heap_flag \
+ _(0, LOCKED, "locked") \
+ _(1, UNMAP_ON_DESTROY, "unmap-on-destroy")
+
+typedef enum
+{
+#define _(i, v, s) CLIB_MEM_HEAP_F_##v = (1 << i),
+ foreach_clib_mem_heap_flag
+#undef _
+} clib_mem_heap_flag_t;
+
+typedef struct
+{
+ /* base address */
+ void *base;
+
+ /* dlmalloc mspace */
+ void *mspace;
+
+ /* heap size */
+ uword size;
+
+ /* page size (log2) */
+ clib_mem_page_sz_t log2_page_sz:8;
+
+ /* flags */
+ clib_mem_heap_flag_t flags:8;
+
+ /* name - _MUST_ be last */
+ char name[0];
+} clib_mem_heap_t;
+
+typedef struct
+{
+ /* log2 system page size */
+ clib_mem_page_sz_t log2_page_sz;
+
+ /* log2 system default hugepage size */
+ clib_mem_page_sz_t log2_default_hugepage_sz;
+
+ /* bitmap of available numa nodes */
+ u32 numa_node_bitmap;
+
+ /* per CPU heaps */
+ void *per_cpu_mheaps[CLIB_MAX_MHEAPS];
+
+ /* per NUMA heaps */
+ void *per_numa_mheaps[CLIB_MAX_NUMAS];
+
+ /* memory maps */
+ clib_mem_vm_map_hdr_t *first_map, *last_map;
+
+ /* map lock */
+ u8 map_lock;
+
+ /* last error */
+ clib_error_t *error;
+} clib_mem_main_t;
+
+extern clib_mem_main_t clib_mem_main;