[IPV4]: fib_trie root-node expansion
The patch below introduces special thresholds to keep root node in the trie large. This gives a flatter tree at the cost of a modest memory increase. Overall it seems to be gain and this was also proposed by one the authors of the paper in recent a seminar. Main table after loading 123 k routes. Aver depth: 3.30 Max depth: 9 Root-node size 12 bits Total size: 4044 kB With the patch: Aver depth: 2.78 Max depth: 8 Root-node size 15 bits Total size: 4150 kB An increase of 8-10% was seen in forwading performance for an rDoS attack. Signed-off-by: Robert Olsson <robert.olsson@its.uu.se> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
87bf9c97b4
commit
e6308be85a
@@ -286,6 +286,8 @@ static inline void check_tnode(const struct tnode *tn)
|
|||||||
|
|
||||||
static int halve_threshold = 25;
|
static int halve_threshold = 25;
|
||||||
static int inflate_threshold = 50;
|
static int inflate_threshold = 50;
|
||||||
|
static int halve_threshold_root = 15;
|
||||||
|
static int inflate_threshold_root = 25;
|
||||||
|
|
||||||
|
|
||||||
static void __alias_free_mem(struct rcu_head *head)
|
static void __alias_free_mem(struct rcu_head *head)
|
||||||
@@ -449,6 +451,8 @@ static struct node *resize(struct trie *t, struct tnode *tn)
|
|||||||
int i;
|
int i;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
struct tnode *old_tn;
|
struct tnode *old_tn;
|
||||||
|
int inflate_threshold_use;
|
||||||
|
int halve_threshold_use;
|
||||||
|
|
||||||
if (!tn)
|
if (!tn)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -541,10 +545,17 @@ static struct node *resize(struct trie *t, struct tnode *tn)
|
|||||||
|
|
||||||
check_tnode(tn);
|
check_tnode(tn);
|
||||||
|
|
||||||
|
/* Keep root node larger */
|
||||||
|
|
||||||
|
if(!tn->parent)
|
||||||
|
inflate_threshold_use = inflate_threshold_root;
|
||||||
|
else
|
||||||
|
inflate_threshold_use = inflate_threshold;
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
while ((tn->full_children > 0 &&
|
while ((tn->full_children > 0 &&
|
||||||
50 * (tn->full_children + tnode_child_length(tn) - tn->empty_children) >=
|
50 * (tn->full_children + tnode_child_length(tn) - tn->empty_children) >=
|
||||||
inflate_threshold * tnode_child_length(tn))) {
|
inflate_threshold_use * tnode_child_length(tn))) {
|
||||||
|
|
||||||
old_tn = tn;
|
old_tn = tn;
|
||||||
tn = inflate(t, tn);
|
tn = inflate(t, tn);
|
||||||
@@ -564,10 +575,18 @@ static struct node *resize(struct trie *t, struct tnode *tn)
|
|||||||
* node is above threshold.
|
* node is above threshold.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Keep root node larger */
|
||||||
|
|
||||||
|
if(!tn->parent)
|
||||||
|
halve_threshold_use = halve_threshold_root;
|
||||||
|
else
|
||||||
|
halve_threshold_use = halve_threshold;
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
while (tn->bits > 1 &&
|
while (tn->bits > 1 &&
|
||||||
100 * (tnode_child_length(tn) - tn->empty_children) <
|
100 * (tnode_child_length(tn) - tn->empty_children) <
|
||||||
halve_threshold * tnode_child_length(tn)) {
|
halve_threshold_use * tnode_child_length(tn)) {
|
||||||
|
|
||||||
old_tn = tn;
|
old_tn = tn;
|
||||||
tn = halve(t, tn);
|
tn = halve(t, tn);
|
||||||
|
Reference in New Issue
Block a user