netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Paweł Staszewski" <pstaszewski@itcare.pl>
To: Jarek Poplawski <jarkao2@gmail.com>
Cc: Linux Network Development list <netdev@vger.kernel.org>,
	Robert Olsson <robert@robur.slu.se>
Subject: Re: [PATCH net-2.6] Re: rib_trie / Fix inflate_threshold_root.	Now=15 size=11 bits
Date: Wed, 01 Jul 2009 11:43:04 +0200	[thread overview]
Message-ID: <4A4B2FA8.3040007@itcare.pl> (raw)
In-Reply-To: <20090701072409.GA12592@ff.dom.local>

Jarek Poplawski pisze:
> On Wed, Jul 01, 2009 at 06:36:51AM +0000, Jarek Poplawski wrote:
>   
>> On Wed, Jul 01, 2009 at 01:31:09AM +0200, Paweł Staszewski wrote:
>> ...
>>     
>
> It looks like Cc was shortened BTW, but I guess at least Robert is
> interested in this testing, so I add him back.
>
> Cheers,
> Jarek P.
>
>   
>>> Yes i can make tests like this.
>>> My network is splited to test clients and other normal clients
>>> so it's really no problem to make testing. - if testing clients working  
>>> then traffic from normal clients is also switched to this router (but if  
>>> traffic is not forwarded "like in this case" for testing clients then  
>>> failover switching them to working router )
>>>
>>> and other point to make this tests - is that - it is good to have all in  
>>> linux kernel networking working well :)
>>>       
>> It's extremely nice of you! On the other hand, this type of change
>> was planned to the net-next to fix possible memory problems, which
>> might have happened to you as well. So you'd probably experience this
>> problem in the future (2.6.32) anyway.
>>
>> So here is the first of 2 patches (the second in a separate message),
>> which should be tested separately, each one applied on top of the
>> 2.6.29.x (vanilla - at least fib_trie.c), after reverting the previous
>> one. So, they are again all-in-one, to eclude any misunderstanding.
>>
>> Btw., I assume there were no oopses, warnings or lockups after those
>> previous non-working patches - only no routing/forwarding.
>>
>>     
Yes on on previous patches there was / no warnings / no oopses or lockups

But now i apply this patch and i make more testing.
First boot with start of bgpd and - traffic is not forwarded
So i start to search and make only some routes (static without bgpd) 
thru this host
And all is working for this host when i make all by static routes.

So i change a little my bgp configuration and make default route to only 
one of my iBGP peers and start bgpd process
All is working and what is weird is number of routes in kernel table.
Kernel is learning routes from bgpd but very slowly - really very slowly.

In attached file there are some fib_triestats after 5min of traffic.

Without this patch (normally)
total size: reported by fib_triestats in less that 1sec is:  "Total 
size: 35769  kB"

But with this patch
Total size is growing up and in 5 min of traffic it grow to only:  
"Total size: 1005  kB"

Regards
Paweł Staszewski
 
>> Thanks,
>> Jarek P.
>> ----------> (synchronize take 6 all-in-one for 2.6.29x, .28, or .27)
>>
>> diff -Nurp a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
>> --- a/net/ipv4/fib_trie.c	2009-06-29 05:30:50.000000000 +0000
>> +++ b/net/ipv4/fib_trie.c	2009-07-01 05:15:37.000000000 +0000
>> @@ -123,6 +123,7 @@ struct tnode {
>>  	union {
>>  		struct rcu_head rcu;
>>  		struct work_struct work;
>> +		struct tnode *tnode_free;
>>  	};
>>  	struct node *child[0];
>>  };
>> @@ -161,6 +162,8 @@ static void tnode_put_child_reorg(struct
>>  static struct node *resize(struct trie *t, struct tnode *tn);
>>  static struct tnode *inflate(struct trie *t, struct tnode *tn);
>>  static struct tnode *halve(struct trie *t, struct tnode *tn);
>> +/* tnodes to free after resize(); protected by RTNL */
>> +static struct tnode *tnode_free_head;
>>  
>>  static struct kmem_cache *fn_alias_kmem __read_mostly;
>>  static struct kmem_cache *trie_leaf_kmem __read_mostly;
>> @@ -385,6 +388,24 @@ static inline void tnode_free(struct tno
>>  		call_rcu(&tn->rcu, __tnode_free_rcu);
>>  }
>>  
>> +static void tnode_free_safe(struct tnode *tn)
>> +{
>> +	BUG_ON(IS_LEAF(tn));
>> +	tn->tnode_free = tnode_free_head;
>> +	tnode_free_head = tn;
>> +}
>> +
>> +static void tnode_free_flush(void)
>> +{
>> +	struct tnode *tn;
>> +
>> +	while ((tn = tnode_free_head)) {
>> +		tnode_free_head = tn->tnode_free;
>> +		tn->tnode_free = NULL;
>> +		tnode_free(tn);
>> +	}
>> +}
>> +
>>  static struct leaf *leaf_new(void)
>>  {
>>  	struct leaf *l = kmem_cache_alloc(trie_leaf_kmem, GFP_KERNEL);
>> @@ -495,7 +516,7 @@ static struct node *resize(struct trie *
>>  
>>  	/* No children */
>>  	if (tn->empty_children == tnode_child_length(tn)) {
>> -		tnode_free(tn);
>> +		tnode_free_safe(tn);
>>  		return NULL;
>>  	}
>>  	/* One child */
>> @@ -509,7 +530,7 @@ static struct node *resize(struct trie *
>>  
>>  			/* compress one level */
>>  			node_set_parent(n, NULL);
>> -			tnode_free(tn);
>> +			tnode_free_safe(tn);
>>  			return n;
>>  		}
>>  	/*
>> @@ -670,7 +691,7 @@ static struct node *resize(struct trie *
>>  			/* compress one level */
>>  
>>  			node_set_parent(n, NULL);
>> -			tnode_free(tn);
>> +			tnode_free_safe(tn);
>>  			return n;
>>  		}
>>  
>> @@ -756,7 +777,7 @@ static struct tnode *inflate(struct trie
>>  			put_child(t, tn, 2*i, inode->child[0]);
>>  			put_child(t, tn, 2*i+1, inode->child[1]);
>>  
>> -			tnode_free(inode);
>> +			tnode_free_safe(inode);
>>  			continue;
>>  		}
>>  
>> @@ -801,9 +822,9 @@ static struct tnode *inflate(struct trie
>>  		put_child(t, tn, 2*i, resize(t, left));
>>  		put_child(t, tn, 2*i+1, resize(t, right));
>>  
>> -		tnode_free(inode);
>> +		tnode_free_safe(inode);
>>  	}
>> -	tnode_free(oldtnode);
>> +	tnode_free_safe(oldtnode);
>>  	return tn;
>>  nomem:
>>  	{
>> @@ -885,7 +906,7 @@ static struct tnode *halve(struct trie *
>>  		put_child(t, newBinNode, 1, right);
>>  		put_child(t, tn, i/2, resize(t, newBinNode));
>>  	}
>> -	tnode_free(oldtnode);
>> +	tnode_free_safe(oldtnode);
>>  	return tn;
>>  nomem:
>>  	{
>> @@ -983,12 +1004,14 @@ fib_find_node(struct trie *t, u32 key)
>>  	return NULL;
>>  }
>>  
>> -static struct node *trie_rebalance(struct trie *t, struct tnode *tn)
>> +static void trie_rebalance(struct trie *t, struct tnode *tn, bool sync)
>>  {
>>  	int wasfull;
>> -	t_key cindex, key = tn->key;
>> +	t_key cindex, key;
>>  	struct tnode *tp;
>>  
>> +	key = tn->key;
>> +
>>  	while (tn != NULL && (tp = node_parent((struct node *)tn)) != NULL) {
>>  		cindex = tkey_extract_bits(key, tp->pos, tp->bits);
>>  		wasfull = tnode_full(tp, tnode_get_child(tp, cindex));
>> @@ -999,6 +1022,10 @@ static struct node *trie_rebalance(struc
>>  
>>  		tp = node_parent((struct node *) tn);
>>  		if (!tp)
>> +			rcu_assign_pointer(t->trie, (struct node *)tn);
>> +
>> +		//tnode_free_flush();
>> +		if (!tp)
>>  			break;
>>  		tn = tp;
>>  	}
>> @@ -1007,7 +1034,12 @@ static struct node *trie_rebalance(struc
>>  	if (IS_TNODE(tn))
>>  		tn = (struct tnode *)resize(t, (struct tnode *)tn);
>>  
>> -	return (struct node *)tn;
>> +	rcu_assign_pointer(t->trie, (struct node *)tn);
>> +	if (sync)
>> +		synchronize_rcu();
>> +	tnode_free_flush();
>> +
>> +	return;
>>  }
>>  
>>  /* only used from updater-side */
>> @@ -1155,7 +1187,7 @@ static struct list_head *fib_insert_node
>>  
>>  	/* Rebalance the trie */
>>  
>> -	rcu_assign_pointer(t->trie, trie_rebalance(t, tp));
>> +	trie_rebalance(t, tp, true);
>>  done:
>>  	return fa_head;
>>  }
>> @@ -1575,7 +1607,7 @@ static void trie_leaf_remove(struct trie
>>  	if (tp) {
>>  		t_key cindex = tkey_extract_bits(l->key, tp->pos, tp->bits);
>>  		put_child(t, (struct tnode *)tp, cindex, NULL);
>> -		rcu_assign_pointer(t->trie, trie_rebalance(t, tp));
>> +		trie_rebalance(t, tp, false);
>>  	} else
>>  		rcu_assign_pointer(t->trie, NULL);
>>  
>>     
> --
> 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
>
>
>   


  parent reply	other threads:[~2009-07-01  9:43 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-25 15:48 rib_trie / Fix inflate_threshold_root. Now=15 size=11 bits Paweł Staszewski
2009-06-25 21:19 ` Eric Dumazet
2009-06-25 21:52   ` Paweł Staszewski
2009-06-25 22:54     ` Eric Dumazet
2009-06-26 10:06       ` Paweł Staszewski
2009-06-26 10:34         ` Eric Dumazet
2009-06-26 10:47           ` Paweł Staszewski
2009-06-26 10:52             ` Eric Dumazet
2009-06-26 17:26               ` Paweł Staszewski
2009-06-26  8:03   ` Jarek Poplawski
2009-06-26  9:19     ` Robert Olsson
2009-06-26  9:37       ` Jarek Poplawski
2009-06-26 10:26         ` Jorge Boncompte [DTI2]
2009-06-26 12:42         ` Robert Olsson
2009-06-26 12:54           ` Jarek Poplawski
2009-06-26 13:28             ` Jarek Poplawski
2009-06-26 13:52               ` Robert Olsson
2009-06-26 15:10                 ` Jarek Poplawski
2009-06-26 15:30                   ` Paul E. McKenney
2009-06-26 15:54                     ` Jarek Poplawski
2009-06-26 16:15                       ` Jarek Poplawski
2009-06-26 16:23                         ` Paul E. McKenney
2009-06-26 16:45                           ` Jarek Poplawski
2009-06-26 17:05                             ` Paul E. McKenney
2009-06-26 18:05                               ` Jarek Poplawski
2009-06-26 18:21                                 ` Paul E. McKenney
2009-06-26 20:19                                   ` Jarek Poplawski
2009-06-26 20:26                                 ` Robert Olsson
2009-06-26 20:37                                   ` Jarek Poplawski
2009-06-26 21:20                                     ` Jarek Poplawski
2009-06-27 19:20       ` Jarek Poplawski
2009-06-27 20:51         ` Jarek Poplawski
2009-06-28  0:28           ` Paweł Staszewski
2009-06-28 11:11           ` Robert Olsson
2009-06-29  7:57             ` Paweł Staszewski
2009-06-28 11:04         ` Robert Olsson
2009-06-28 12:03           ` Jarek Poplawski
2009-06-28 14:35           ` Jarek Poplawski
2009-06-28 15:32             ` Paweł Staszewski
2009-06-28 15:48               ` Paweł Staszewski
2009-06-28 19:56                 ` Jarek Poplawski
2009-06-28 21:36                 ` Jarek Poplawski
2009-06-29  8:08                   ` Paweł Staszewski
2009-06-29  8:47                     ` Paweł Staszewski
2009-06-29  9:27                       ` Jarek Poplawski
2009-06-29  9:43                         ` Paweł Staszewski
2009-06-29  8:33                   ` [PATCH net-2.6] " Jarek Poplawski
2009-06-29  9:51                     ` Paweł Staszewski
2009-06-29 10:47                       ` Jarek Poplawski
2009-06-29 16:24                         ` Paweł Staszewski
2009-06-29 17:09                           ` Jarek Poplawski
2009-06-30  7:09                         ` Jarek Poplawski
2009-06-30 20:16                           ` Paweł Staszewski
2009-06-30 20:41                             ` Jarek Poplawski
2009-06-30 23:31                               ` Paweł Staszewski
2009-07-01  6:36                                 ` Jarek Poplawski
     [not found]                                   ` <20090701072409.GA12592@ff.dom.local>
2009-07-01  9:43                                     ` Paweł Staszewski [this message]
2009-07-01  9:50                                       ` Paweł Staszewski
2009-07-01 10:13                                       ` Jarek Poplawski
2009-07-01 11:04                                         ` Jarek Poplawski
2009-07-01 22:17                                           ` Paweł Staszewski
2009-07-02  5:32                                             ` Jarek Poplawski
2009-07-02  5:43                                               ` Paweł Staszewski
2009-07-02  6:00                                                 ` Jarek Poplawski
2009-07-02 15:31                                                   ` Robert Olsson
2009-07-02 19:06                                                     ` Jarek Poplawski
2009-07-02 21:32                                                       ` Robert Olsson
2009-07-02 22:13                                                         ` Jarek Poplawski
2009-07-05  0:26                                                   ` Paweł Staszewski
2009-07-05  0:30                                                     ` Paweł Staszewski
2009-07-05 16:20                                                       ` Jarek Poplawski
2009-07-05 17:32                                                         ` Jarek Poplawski
2009-07-05 21:32                                                           ` Paul E. McKenney
2009-07-05 22:23                                                             ` Jarek Poplawski
2009-07-05 23:53                                                               ` Paweł Staszewski
2009-07-06  9:02                                                                 ` Jarek Poplawski
2009-07-07 22:56                                                                   ` Paweł Staszewski
2009-07-07 23:50                                                                     ` Jarek Poplawski
2009-07-09 20:34                                                                       ` Paweł Staszewski
2009-07-14 19:41                                                                         ` [PATCH net-next] " Jarek Poplawski
2009-07-15  7:43                                                                           ` Robert Olsson
2009-07-15 13:05                                                                             ` Jarek Poplawski
2009-07-17  8:08                                                                               ` Robert Olsson
2009-07-20 14:41                                                                           ` David Miller
2009-07-07 23:23                                                                   ` [PATCH net-2.6] " Paweł Staszewski
2009-07-07 23:30                                                                     ` Paweł Staszewski
2009-07-14 18:33                                                             ` [PATCH net-next] " Jarek Poplawski
2009-07-20 14:41                                                               ` David Miller
2009-07-14 21:20                                                             ` [PATCH net-next] ipv4: fib_trie: Use tnode_get_child_rcu() and node_parent_rcu() in lookups Jarek Poplawski
2009-07-20 14:41                                                               ` David Miller
2009-07-05  0:31                                                     ` [PATCH net-2.6] Re: rib_trie / Fix inflate_threshold_root. Now=15 size=11 bits Paweł Staszewski
2009-07-05 12:56                                                     ` [PATCH -stable] " Jarek Poplawski
2009-07-05 13:08                                                     ` [PATCH v2 " Jarek Poplawski
2009-07-08  2:42                                                       ` David Miller
2009-07-08  6:44                                                         ` Jarek Poplawski
2009-06-29 10:58                       ` [PATCH net-2.6] " Jarek Poplawski
2009-06-30 19:48                         ` David Miller
2009-06-30 20:14                           ` Jarek Poplawski
2009-07-10 15:29                           ` Stephen Hemminger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A4B2FA8.3040007@itcare.pl \
    --to=pstaszewski@itcare.pl \
    --cc=jarkao2@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=robert@robur.slu.se \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).