Message ID | 4AEEC0A2.1070502@gmail.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Mon, 02 Nov 2009 12:21:06 +0100 > Avoids touching device refcount in datagram_send_ctl(), thanks to RCU > > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Applied. -- 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
On Mon, Nov 02, 2009 at 12:21:06PM +0100, Eric Dumazet wrote: > Avoids touching device refcount in datagram_send_ctl(), thanks to RCU Quite a series of patches!!! I am impressed!!! Thanx, Paul > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> > --- > net/ipv6/datagram.c | 14 +++++++++----- > 1 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c > index 9f70452..e6f9cdf 100644 > --- a/net/ipv6/datagram.c > +++ b/net/ipv6/datagram.c > @@ -537,12 +537,17 @@ int datagram_send_ctl(struct net *net, > > addr_type = __ipv6_addr_type(&src_info->ipi6_addr); > > + rcu_read_lock(); > if (fl->oif) { > - dev = dev_get_by_index(net, fl->oif); > - if (!dev) > + dev = dev_get_by_index_rcu(net, fl->oif); > + if (!dev) { > + rcu_read_unlock(); > return -ENODEV; > - } else if (addr_type & IPV6_ADDR_LINKLOCAL) > + } > + } else if (addr_type & IPV6_ADDR_LINKLOCAL) { > + rcu_read_unlock(); > return -EINVAL; > + } > > if (addr_type != IPV6_ADDR_ANY) { > int strict = __ipv6_addr_src_scope(addr_type) <= IPV6_ADDR_SCOPE_LINKLOCAL; > @@ -553,8 +558,7 @@ int datagram_send_ctl(struct net *net, > ipv6_addr_copy(&fl->fl6_src, &src_info->ipi6_addr); > } > > - if (dev) > - dev_put(dev); > + rcu_read_unlock(); > > if (err) > goto exit_f; > -- > 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 -- 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
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 9f70452..e6f9cdf 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c @@ -537,12 +537,17 @@ int datagram_send_ctl(struct net *net, addr_type = __ipv6_addr_type(&src_info->ipi6_addr); + rcu_read_lock(); if (fl->oif) { - dev = dev_get_by_index(net, fl->oif); - if (!dev) + dev = dev_get_by_index_rcu(net, fl->oif); + if (!dev) { + rcu_read_unlock(); return -ENODEV; - } else if (addr_type & IPV6_ADDR_LINKLOCAL) + } + } else if (addr_type & IPV6_ADDR_LINKLOCAL) { + rcu_read_unlock(); return -EINVAL; + } if (addr_type != IPV6_ADDR_ANY) { int strict = __ipv6_addr_src_scope(addr_type) <= IPV6_ADDR_SCOPE_LINKLOCAL; @@ -553,8 +558,7 @@ int datagram_send_ctl(struct net *net, ipv6_addr_copy(&fl->fl6_src, &src_info->ipi6_addr); } - if (dev) - dev_put(dev); + rcu_read_unlock(); if (err) goto exit_f;
Avoids touching device refcount in datagram_send_ctl(), thanks to RCU Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> --- net/ipv6/datagram.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) -- 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