ip6mr: switch ip6mr_get_route() to rcu_read_lock()
authorEric Dumazet <edumazet@google.com>
Thu, 23 Jun 2022 04:34:45 +0000 (04:34 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Jun 2022 10:34:38 +0000 (11:34 +0100)
Like ipmr_get_route(), we can use standard RCU here.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/ip6mr.c

index 8a751a3..08ac177 100644 (file)
@@ -2290,7 +2290,7 @@ int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm,
        if (!mrt)
                return -ENOENT;
 
-       read_lock(&mrt_lock);
+       rcu_read_lock();
        cache = ip6mr_cache_find(mrt, &rt->rt6i_src.addr, &rt->rt6i_dst.addr);
        if (!cache && skb->dev) {
                int vif = ip6mr_find_vif(mrt, skb->dev);
@@ -2308,14 +2308,14 @@ int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm,
 
                dev = skb->dev;
                if (!dev || (vif = ip6mr_find_vif(mrt, dev)) < 0) {
-                       read_unlock(&mrt_lock);
+                       rcu_read_unlock();
                        return -ENODEV;
                }
 
                /* really correct? */
                skb2 = alloc_skb(sizeof(struct ipv6hdr), GFP_ATOMIC);
                if (!skb2) {
-                       read_unlock(&mrt_lock);
+                       rcu_read_unlock();
                        return -ENOMEM;
                }
 
@@ -2338,13 +2338,13 @@ int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm,
                iph->daddr = rt->rt6i_dst.addr;
 
                err = ip6mr_cache_unresolved(mrt, vif, skb2, dev);
-               read_unlock(&mrt_lock);
+               rcu_read_unlock();
 
                return err;
        }
 
        err = mr_fill_mroute(mrt, skb, &cache->_c, rtm);
-       read_unlock(&mrt_lock);
+       rcu_read_unlock();
        return err;
 }