From: Eric Dumazet <dada1@cosmosbay.com>
To: David Miller <davem@davemloft.net>, Dipankar Sarma <dipankar@in.ibm.com>
Cc: netdev@vger.kernel.org
Subject: Re: [IPV4] ROUTE: ip_rt_dump() is unecessary slow
Date: Tue, 08 Jan 2008 07:37:43 +0100 [thread overview]
Message-ID: <47831A37.5000607@cosmosbay.com> (raw)
In-Reply-To: <20080107.221537.178212902.davem@davemloft.net>
[-- Attachment #1: Type: text/plain, Size: 1581 bytes --]
David Miller a écrit :
> From: Eric Dumazet <dada1@cosmosbay.com>
> Date: Tue, 08 Jan 2008 07:11:30 +0100
>
>> @@ -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;
>>
>
> Can you explain to me why this rcu_dereference() can be removed?
Very good question, but honestly I really dont see why it was there at the
first place :
"struct seq_file" is private to this thread, so seq.private is
also private and cannot change while this thread runs rt_cache_get_next().
Reading it once (as guaranted bu rcu_dereference()) or several time if
compiler really is dumb enough wont change the result...
>
> The rest of your patch is OK and once I understand the above
> I'll add it to net-2.6, thanks!
>
Maybe we can first have an Ack from Dipankar Sarma, I can repost the patch
with a more precise ChangeLog and wait his answer ?
[NET] ROUTE: fix rcu_dereference() uses in /proc/net/rt_cache
In rt_cache_get_next(), no need to guard seq->private by a rcu_dereference()
since seq is private to the thread running this function. Reading seq.private
once (as guaranted bu rcu_dereference()) or several time if compiler really is
dumb enough wont change the result.
But we miss real spots where rcu_dereference() are needed, both in
rt_cache_get_first() and rt_cache_get_next()
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
[-- Attachment #2: route_rcu.patch --]
[-- Type: text/plain, Size: 1011 bytes --]
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;
}
next prev parent reply other threads:[~2008-01-08 6:38 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-07 18:30 [IPV4] ROUTE: ip_rt_dump() is unecessary slow Eric Dumazet
2008-01-08 5:52 ` David Miller
2008-01-08 6:11 ` Eric Dumazet
2008-01-08 6:15 ` David Miller
2008-01-08 6:37 ` Eric Dumazet [this message]
2008-01-09 6:02 ` Herbert Xu
2008-01-09 7:38 ` [NET] ROUTE: fix rcu_dereference() uses in /proc/net/rt_cache Eric Dumazet
2008-01-09 9:46 ` Herbert Xu
2008-01-09 10:37 ` Eric Dumazet
2008-01-09 14:22 ` Paul E. McKenney
2008-01-09 14:31 ` David Miller
2008-01-09 14:43 ` Paul E. McKenney
2008-01-09 17:36 ` Eric Dumazet
2008-01-10 11:56 ` David Miller
2008-01-10 14:06 ` [DECNET] ROUTE: fix rcu_dereference() uses in /proc/net/decnet_cache Eric Dumazet
2008-01-11 6:35 ` David Miller
2008-01-10 23:10 ` [NET] ROUTE: fix rcu_dereference() uses in /proc/net/rt_cache Jarek Poplawski
2008-01-10 23:51 ` Paul E. McKenney
2008-01-11 14:13 ` Jarek Poplawski
2008-01-11 0:00 ` Herbert Xu
2008-01-11 8:30 ` Jarek Poplawski
2008-01-11 9:11 ` Jarek Poplawski
2008-01-11 9:23 ` Jarek Poplawski
2008-01-11 10:38 ` Herbert Xu
2008-01-11 11:30 ` Jarek Poplawski
2008-01-11 10:37 ` Herbert Xu
2008-01-11 12:31 ` Jarek Poplawski
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=47831A37.5000607@cosmosbay.com \
--to=dada1@cosmosbay.com \
--cc=davem@davemloft.net \
--cc=dipankar@in.ibm.com \
--cc=netdev@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.