David Miller a écrit :
From: Eric Dumazet <[EMAIL PROTECTED]>
Date: Mon, 7 Jan 2008 19:30:02 +0100
I noticed "ip route list cache x.y.z.t" can be *very* slow.
While strace-ing -T it I also noticed that first part of route cache is
fetched quite fast :
...
The following patch corrects this performance/latency problem, removing
quadratic behavior.
Signed-off-by: Eric Dumazet <[EMAIL PROTECTED]>
I think removing quadratic behavior is a bug fix, thus applied
to net-2.6, thanks Eric :-)
You are the boss :)
I had another patch to submit, so I based it no net-2.6, please just say me if
you prefer a net-2/6.25 one, as it's not a critical bug fix...
Thank you
[IPV4] ROUTE: fix rcu_dereference() uses in /proc/net/rt_cache
Signed-off-by: Eric Dumazet <[EMAIL PROTECTED]>
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index d337706..3b7562f 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -278,7 +278,7 @@ static struct rtable *rt_cache_get_first(struct seq_file
*seq)
for (st->bucket = rt_hash_mask; st->bucket >= 0; --st->bucket) {
rcu_read_lock_bh();
- r = rt_hash_table[st->bucket].chain;
+ r = rcu_dereference(rt_hash_table[st->bucket].chain);
if (r)
break;
rcu_read_unlock_bh();
@@ -288,15 +288,15 @@ static struct rtable *rt_cache_get_first(struct seq_file
*seq)
static struct rtable *rt_cache_get_next(struct seq_file *seq, struct rtable *r)
{
- struct rt_cache_iter_state *st = rcu_dereference(seq->private);
+ struct rt_cache_iter_state *st = seq->private;
- r = r->u.dst.rt_next;
+ r = rcu_dereference(r->u.dst.rt_next);
while (!r) {
rcu_read_unlock_bh();
if (--st->bucket < 0)
break;
rcu_read_lock_bh();
- r = rt_hash_table[st->bucket].chain;
+ r = rcu_dereference(rt_hash_table[st->bucket].chain);
}
return r;
}