ip: use main heap for mtrie 96/28896/7
authorDamjan Marion <damarion@cisco.com>
Wed, 16 Sep 2020 15:06:45 +0000 (17:06 +0200)
committerNeale Ranns <nranns@cisco.com>
Mon, 21 Sep 2020 14:04:19 +0000 (14:04 +0000)
Main heap can be hugepage backed so it is more efficient to use
main heap instead of allocating special heap just for mtrie....

Type: improvement
Change-Id: I210912ab8567c043205ddfc10fdcfde9a0fa7757
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/vnet/fib/ip4_fib.c
src/vnet/ip/ip4.h
src/vnet/ip/ip4_mtrie.c

index 5b12aa6..9142c63 100644 (file)
@@ -106,14 +106,11 @@ ip4_create_fib_with_table_id (u32 table_id,
 {
     fib_table_t *fib_table;
     ip4_fib_t *v4_fib;
-    void *old_heap;
 
     pool_get(ip4_main.fibs, fib_table);
     clib_memset(fib_table, 0, sizeof(*fib_table));
 
-    old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap);
     pool_get_aligned(ip4_main.v4_fibs, v4_fib, CLIB_CACHE_LINE_BYTES);
-    clib_mem_set_heap (old_heap);
 
     ASSERT((fib_table - ip4_main.fibs) ==
            (v4_fib - ip4_main.v4_fibs));
@@ -333,8 +330,6 @@ ip4_fib_table_entry_insert (ip4_fib_t *fib,
        /*
         * adding a new entry
         */
-        uword *old_heap;
-        old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap);
 
        if (NULL == hash) {
            hash = hash_create (32 /* elts */, sizeof (uword));
@@ -343,7 +338,6 @@ ip4_fib_table_entry_insert (ip4_fib_t *fib,
        }
        hash = hash_set(hash, key, fib_entry_index);
        fib->fib_entry_by_dst_address[len] = hash;
-        clib_mem_set_heap (old_heap);
     }
     else
     {
@@ -371,11 +365,7 @@ ip4_fib_table_entry_remove (ip4_fib_t *fib,
     }
     else
     {
-        uword *old_heap;
-
-        old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap);
        hash_unset(hash, key);
-        clib_mem_set_heap (old_heap);
     }
 
     fib->fib_entry_by_dst_address[len] = hash;
@@ -571,10 +561,9 @@ ip4_fib_table_show_one (ip4_fib_t *fib,
 u8 *
 format_ip4_fib_table_memory (u8 * s, va_list * args)
 {
-    s = format(s, "%=30s %=6d %=12ld\n",
+    s = format(s, "%=30s %=6d\n",
                "IPv4 unicast",
-               pool_elts(ip4_main.fibs),
-               mspace_footprint(ip4_main.mtrie_mheap));
+               pool_elts(ip4_main.fibs));
     return (s);
 }
 
@@ -640,13 +629,12 @@ ip4_show_fib (vlib_main_t * vm,
 
         if (memory)
         {
-            uword mtrie_size, hash_size, *old_heap;
+            uword mtrie_size, hash_size;
 
 
             mtrie_size = ip4_fib_mtrie_memory_usage(&fib->mtrie);
             hash_size = 0;
 
-            old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap);
            for (i = 0; i < ARRAY_LEN (fib->fib_entry_by_dst_address); i++)
            {
                uword * hash = fib->fib_entry_by_dst_address[i];
@@ -655,7 +643,6 @@ ip4_show_fib (vlib_main_t * vm,
                     hash_size += hash_bytes(hash);
                 }
             }
-            clib_mem_set_heap (old_heap);
 
             if (verbose)
                 vlib_cli_output (vm, "%U mtrie:%d hash:%d",
@@ -725,8 +712,6 @@ ip4_show_fib (vlib_main_t * vm,
                          total_mtrie_memory,
                          total_hash_memory,
                          total_mtrie_memory + total_hash_memory);
-        vlib_cli_output (vm, "\nMtrie Mheap Usage: %U\n",
-                         format_mheap, ip4_main.mtrie_mheap, 1);
     }
     return 0;
 }
index f5ed938..8fba33f 100644 (file)
@@ -170,9 +170,6 @@ typedef struct ip4_main_t
   /** Use hugetlb pages for the Mtries */
   int mtrie_hugetlb;
 
-  /** The memory heap for the mtries */
-  void *mtrie_mheap;
-
   /** ARP throttling */
   throttle_t arp_throttle;
 
index b5d0a89..7bfcf98 100644 (file)
@@ -176,12 +176,9 @@ ply_create (ip4_fib_mtrie_t * m,
            u32 leaf_prefix_len, u32 ply_base_len)
 {
   ip4_fib_mtrie_8_ply_t *p;
-  void *old_heap;
   /* Get cache aligned ply. */
 
-  old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap);
   pool_get_aligned (ip4_ply_pool, p, CLIB_CACHE_LINE_BYTES);
-  clib_mem_set_heap (old_heap);
 
   ply_8_init (p, init_leaf, leaf_prefix_len, ply_base_len);
   return ip4_fib_mtrie_leaf_set_next_ply_index (p - ip4_ply_pool);
@@ -798,55 +795,10 @@ static clib_error_t *
 ip4_mtrie_module_init (vlib_main_t * vm)
 {
   CLIB_UNUSED (ip4_fib_mtrie_8_ply_t * p);
-  ip4_main_t *im = &ip4_main;
   clib_error_t *error = NULL;
-  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 */ );
-    }
 
   /* Burn one ply so index 0 is taken */
-  old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap);
   pool_get (ip4_ply_pool, p);
-  clib_mem_set_heap (old_heap);
 
   return (error);
 }