FIB: elide cover walk for insert of host route 05/12105/2
authorNeale Ranns <nranns@cisco.com>
Wed, 25 Apr 2018 08:41:24 +0000 (01:41 -0700)
committerDave Barach <openvpp@barachs.net>
Mon, 30 Apr 2018 15:03:40 +0000 (15:03 +0000)
Change-Id: I2d39e56ff605e3a24927d6330d65d0406f588381
Signed-off-by: Neale Ranns <nranns@cisco.com>
src/vnet/fib/fib_entry.c
src/vnet/fib/fib_entry.h
src/vnet/fib/fib_table.c

index cd1300d..a12edcb 100644 (file)
@@ -1427,6 +1427,19 @@ fib_entry_get_best_source (fib_node_index_t entry_index)
     return (fib_entry_src_get_source(bsrc));
 }
 
+/**
+ * Return !0 is the entry represents a host prefix
+ */
+int
+fib_entry_is_host (fib_node_index_t fib_entry_index)
+{
+    fib_prefix_t pfx;
+
+    fib_entry_get_prefix(fib_entry_index, &pfx);
+
+    return (fib_prefix_is_host(&pfx));
+}
+
 /**
  * Return !0 is the entry is reoslved, i.e. will return a valid forwarding
  * chain
index ddaf914..dcc310e 100644 (file)
@@ -613,6 +613,7 @@ extern int fib_entry_is_sourced(fib_node_index_t fib_entry_index,
 
 extern fib_node_index_t fib_entry_get_path_list(fib_node_index_t fib_entry_index);
 extern int fib_entry_is_resolved(fib_node_index_t fib_entry_index);
+extern int fib_entry_is_host(fib_node_index_t fib_entry_index);
 extern void fib_entry_set_flow_hash_config(fib_node_index_t fib_entry_index,
                                            flow_hash_config_t hash_config);
 
index d0bc336..c37ac1d 100644 (file)
@@ -197,10 +197,18 @@ fib_table_post_insert_actions (fib_table_t *fib_table,
 
         /*
          * inform the covering entry that a new more specific
-         * has been inserted beneath it
+         * has been inserted beneath it.
+         * If the prefix that has been inserted is a host route
+         * then it is not possible that it will be the cover for any
+         * other entry, so we can elide the walk. This is particularly
+         * beneficial since there are often many host entries sharing the
+         * same cover (i.e. ADJ or RR sourced entries).
          */
-       fib_entry_cover_change_notify(fib_entry_cover_index,
-                                     fib_entry_index);
+        if (!fib_entry_is_host(fib_entry_index))
+        {
+            fib_entry_cover_change_notify(fib_entry_cover_index,
+                                          fib_entry_index);
+        }
     }
 }