Re: rib_trie / Fix inflate_threshold_root. Now=15 size=11 bits
From: Jarek Poplawski <hidden>
Date: 2009-06-26 20:37:30
On Fri, Jun 26, 2009 at 10:26:53PM +0200, Robert Olsson wrote:
Yes looks like a good solution but maybe it safest to synchronize unconditionally?
Hmm... I lost around half an hour for this doubt... Sure! (Unless there are some strange cases which very often create and destroy very small tables?) Thanks, Jarek P.
quoted hunk ↗ jump to hunk
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 012cf5a..9cb8623 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c@@ -1028,8 +1028,11 @@ static void trie_rebalance(struct trie *t, struct tnode *tn) } /* Handle last (top) tnode */ - if (IS_TNODE(tn)) + if (IS_TNODE(tn)) { + /* force memory freeing after last changes */ + synchronize_rcu(); tn = (struct tnode *)resize(t, (struct tnode *)tn); + } rcu_assign_pointer(t->trie, (struct node *)tn); tnode_free_flush();Cheers --ro Jarek Poplawski writes: > net/ipv4/fib_trie.c | 8 ++++++-- > 1 files changed, 6 insertions(+), 2 deletions(-) > > diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c > index 012cf5a..98b31a1 100644 > --- a/net/ipv4/fib_trie.c > +++ b/net/ipv4/fib_trie.c > @@ -1008,7 +1008,7 @@ static void trie_rebalance(struct trie *t, struct tnode *tn) > { > int wasfull; > t_key cindex, key; > - struct tnode *tp; > + struct tnode *tp, *oldtnode = tn; > > key = tn->key; > > @@ -1028,8 +1028,12 @@ static void trie_rebalance(struct trie *t, struct tnode *tn) > } > > /* Handle last (top) tnode */ > - if (IS_TNODE(tn)) > + if (IS_TNODE(tn)) { > + /* force memory freeing after last changes */ > + if (oldtnode != tn) > + synchronize_rcu(); > tn = (struct tnode *)resize(t, (struct tnode *)tn); > + } > > rcu_assign_pointer(t->trie, (struct node *)tn); > tnode_free_flush(); > -- > To unsubscribe from this list: send the line "unsubscribe netdev" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html