- uword *old_heap;
-
- if (im->mtrie_heap_size == 0)
- im->mtrie_heap_size = IP4_FIB_DEFAULT_MTRIE_HEAP_SIZE;
-
-again:
- if (im->mtrie_hugetlb)
- {
- void *rv;
- int mmap_flags, mmap_flags_huge;
- uword htlb_pagesize = clib_mem_get_default_hugepage_size ();
- if (htlb_pagesize == 0)
- {
- clib_warning ("WARNING: htlb pagesize == 0");
- im->mtrie_hugetlb = 0;
- goto again;
- }
- /* Round the allocation request to an even number of huge pages */
- im->mtrie_heap_size = (im->mtrie_heap_size + (htlb_pagesize - 1)) &
- ~(htlb_pagesize - 1);
- mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS;
- mmap_flags_huge = (mmap_flags | MAP_HUGETLB | MAP_LOCKED |
- min_log2 (htlb_pagesize) << MAP_HUGE_SHIFT);
- rv = mmap (0, im->mtrie_heap_size,
- PROT_READ | PROT_WRITE, mmap_flags_huge, -1, 0);
- if (rv == MAP_FAILED)
- {
- /* Failure when running as root should be logged... */
- if (geteuid () == 0)
- clib_warning ("ip4 mtrie htlb map failed: not enough pages?");
- im->mtrie_hugetlb = 0;
- goto again;
- }
- if (mlock (rv, im->mtrie_heap_size))
- clib_warning ("WARNING: couldn't lock mtrie heap at %llx", rv);
- im->mtrie_mheap = create_mspace_with_base (rv, im->mtrie_heap_size,
- 1 /* locked */ );
- }
- else
- {
- im->mtrie_mheap = create_mspace (im->mtrie_heap_size, 1 /* locked */ );
- }