pppoe: RCU locking in get_item_by_addr()
authorEric Dumazet <eric.dumazet@gmail.com>
Sun, 1 Nov 2009 19:51:22 +0000 (19:51 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Nov 2009 07:55:13 +0000 (23:55 -0800)
Use dev_get_by_name_rcu() instead of dev_get_by_name(),
to avoid touching device refcount in hotpath.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/pppoe.c

index 2559991..60c8d23 100644 (file)
@@ -250,20 +250,19 @@ static inline struct pppox_sock *get_item_by_addr(struct net *net,
 {
        struct net_device *dev;
        struct pppoe_net *pn;
-       struct pppox_sock *pppox_sock;
+       struct pppox_sock *pppox_sock = NULL;
 
        int ifindex;
 
-       dev = dev_get_by_name(net, sp->sa_addr.pppoe.dev);
-       if (!dev)
-               return NULL;
-
-       ifindex = dev->ifindex;
-       pn = net_generic(net, pppoe_net_id);
-       pppox_sock = get_item(pn, sp->sa_addr.pppoe.sid,
+       rcu_read_lock();
+       dev = dev_get_by_name_rcu(net, sp->sa_addr.pppoe.dev);
+       if (dev) {
+               ifindex = dev->ifindex;
+               pn = net_generic(net, pppoe_net_id);
+               pppox_sock = get_item(pn, sp->sa_addr.pppoe.sid,
                                sp->sa_addr.pppoe.remote, ifindex);
-       dev_put(dev);
-
+       }
+       rcu_read_unlock();
        return pppox_sock;
 }