ipv4: RCU changes in __mkroute_input()
authorEric Dumazet <eric.dumazet@gmail.com>
Thu, 3 Jun 2010 04:13:21 +0000 (04:13 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 Jun 2010 03:01:51 +0000 (20:01 -0700)
Avoid two atomic ops on output device refcount

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

index 1cfe0d199e7ce5a1d465e817b77f9952c82ae16a..7b8eacd5ac26c70397af547120f7a5c47834d749 100644 (file)
@@ -1957,22 +1957,22 @@ static void ip_handle_martian_source(struct net_device *dev,
 #endif
 }
 
+/* called in rcu_read_lock() section */
 static int __mkroute_input(struct sk_buff *skb,
                           struct fib_result *res,
                           struct in_device *in_dev,
                           __be32 daddr, __be32 saddr, u32 tos,
                           struct rtable **result)
 {
-
        struct rtable *rth;
        int err;
        struct in_device *out_dev;
-       unsigned flags = 0;
+       unsigned int flags = 0;
        __be32 spec_dst;
        u32 itag;
 
        /* get a working reference to the output device */
-       out_dev = in_dev_get(FIB_RES_DEV(*res));
+       out_dev = __in_dev_get_rcu(FIB_RES_DEV(*res));
        if (out_dev == NULL) {
                if (net_ratelimit())
                        printk(KERN_CRIT "Bug in ip_route_input" \
@@ -2053,8 +2053,6 @@ static int __mkroute_input(struct sk_buff *skb,
        *result = rth;
        err = 0;
  cleanup:
-       /* release the working reference to the output device */
-       in_dev_put(out_dev);
        return err;
 }