Memory leak in load-balance maps 47/6247/1
authorNeale Ranns <nranns@cisco.com>
Tue, 18 Apr 2017 19:56:45 +0000 (12:56 -0700)
committerNeale Ranns <nranns@cisco.com>
Tue, 18 Apr 2017 19:57:31 +0000 (19:57 +0000)
Change-Id: Iec67ae1232e346d5e0000e0b4c997fdc31865bc6
Signed-off-by: Neale Ranns <nranns@cisco.com>
src/vnet/dpo/load_balance_map.c
src/vnet/fib/fib_test.c

index 70ce1bf..4e27e5d 100644 (file)
@@ -415,6 +415,14 @@ load_balance_map_init (load_balance_map_t *lbm,
     return (lbm);
 }
 
     return (lbm);
 }
 
+static void
+load_balance_map_destroy (load_balance_map_t *lbm)
+{
+    vec_free(lbm->lbm_paths);
+    vec_free(lbm->lbm_buckets);
+    pool_put(load_balance_map_pool, lbm);
+}
+
 index_t
 load_balance_map_add_or_lock (u32 n_buckets,
                               u32 sum_of_weights,
 index_t
 load_balance_map_add_or_lock (u32 n_buckets,
                               u32 sum_of_weights,
@@ -434,6 +442,7 @@ load_balance_map_add_or_lock (u32 n_buckets,
     else
     {
         lbm = load_balance_map_get(lbmi);
     else
     {
         lbm = load_balance_map_get(lbmi);
+        load_balance_map_destroy(tmp);
     }
 
     lbm->lbm_locks++;
     }
 
     lbm->lbm_locks++;
@@ -468,9 +477,7 @@ load_balance_map_unlock (index_t lbmi)
     if (0 == lbm->lbm_locks)
     {
         load_balance_map_db_remove(lbm);
     if (0 == lbm->lbm_locks)
     {
         load_balance_map_db_remove(lbm);
-        vec_free(lbm->lbm_paths);
-        vec_free(lbm->lbm_buckets);
-        pool_put(load_balance_map_pool, lbm);
+        load_balance_map_destroy(lbm);
     }
 }
 
     }
 }
 
index c58dc5a..cbb5640 100644 (file)
@@ -717,6 +717,7 @@ fib_test_v4 (void)
     const load_balance_t *lb;
     test_main_t *tm;
     u32 fib_index;
     const load_balance_t *lb;
     test_main_t *tm;
     u32 fib_index;
+    int lb_count;
     int ii;
 
     /* via 10.10.10.1 */
     int ii;
 
     /* via 10.10.10.1 */
@@ -730,6 +731,9 @@ fib_test_v4 (void)
 
     tm = &test_main;
 
 
     tm = &test_main;
 
+    /* record the nubmer of load-balances in use before we start */
+    lb_count = pool_elts(load_balance_pool);
+
     /* Find or create FIB table 11 */
     fib_index = fib_table_find_or_create_and_lock(FIB_PROTOCOL_IP4, 11);
 
     /* Find or create FIB table 11 */
     fib_index = fib_table_find_or_create_and_lock(FIB_PROTOCOL_IP4, 11);
 
@@ -3154,7 +3158,7 @@ fib_test_v4 (void)
              "LB maps's bucket 1 is %d",
              lbm->lbm_buckets[1]);
 
              "LB maps's bucket 1 is %d",
              lbm->lbm_buckets[1]);
 
-    load_balance_map_unlock(lb->lb_map);
+    load_balance_map_unlock(lbmi);
 
     /*
      * add it back. again 
 
     /*
      * add it back. again 
@@ -3249,7 +3253,7 @@ fib_test_v4 (void)
                  "LB Map for 200.200.200.200/32 at %d is %d",
                  ii, lbm->lbm_buckets[ii]);
     }
                  "LB Map for 200.200.200.200/32 at %d is %d",
                  ii, lbm->lbm_buckets[ii]);
     }
-
+    load_balance_map_unlock(lbmi);
 
     /*
      * tidy up
 
     /*
      * tidy up
@@ -3850,6 +3854,10 @@ fib_test_v4 (void)
             fib_entry_pool_size());
     FIB_TEST((ENBR-5 == pool_elts(fib_urpf_list_pool)), "uRPF pool size is %d",
             pool_elts(fib_urpf_list_pool));
             fib_entry_pool_size());
     FIB_TEST((ENBR-5 == pool_elts(fib_urpf_list_pool)), "uRPF pool size is %d",
             pool_elts(fib_urpf_list_pool));
+    FIB_TEST((0 == pool_elts(load_balance_map_pool)), "LB-map pool size is %d",
+             pool_elts(load_balance_map_pool));
+    FIB_TEST((lb_count == pool_elts(load_balance_pool)), "LB pool size is %d",
+             pool_elts(load_balance_pool));
 
     return 0;
 }
 
     return 0;
 }