+static clib_mem_heap_t *
+clib_mem_create_heap_internal (void *base, uword size,
+ clib_mem_page_sz_t log2_page_sz, int is_locked,
+ char *name)
+{
+ clib_mem_heap_t *h;
+ u8 flags = 0;
+ int sz = sizeof (clib_mem_heap_t);
+
+ if (base == 0)
+ {
+ log2_page_sz = clib_mem_log2_page_size_validate (log2_page_sz);
+ size = round_pow2 (size, clib_mem_page_bytes (log2_page_sz));
+ base = clib_mem_vm_map_internal (0, log2_page_sz, size, -1, 0,
+ "main heap");
+
+ if (base == CLIB_MEM_VM_MAP_FAILED)
+ return 0;
+
+ flags = CLIB_MEM_HEAP_F_UNMAP_ON_DESTROY;
+ }
+ else
+ log2_page_sz = CLIB_MEM_PAGE_SZ_UNKNOWN;
+
+ if (is_locked)
+ flags |= CLIB_MEM_HEAP_F_LOCKED;
+
+ h = base;
+ h->base = base;
+ h->size = size;
+ h->log2_page_sz = log2_page_sz;
+ h->flags = flags;
+ sz = strlen (name);
+ strcpy (h->name, name);
+ sz = round_pow2 (sz + sizeof (clib_mem_heap_t), 16);
+ h->mspace = create_mspace_with_base (base + sz, size - sz, is_locked);
+
+ mspace_disable_expand (h->mspace);
+
+ CLIB_MEM_POISON (mspace_least_addr (h->mspace),
+ mspace_footprint (h->mspace));
+
+ return h;
+}
+