Commit e6308be8 authored by Robert Olsson's avatar Robert Olsson Committed by David S. Miller

[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: default avatarRobert Olsson <robert.olsson@its.uu.se>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 87bf9c97
...@@ -286,6 +286,8 @@ static inline void check_tnode(const struct tnode *tn) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment