A later patch removes rt6i_table from rt6_info. Save the ipv6
table for a VRF in net_vrf. fib tables can not be deleted so
no reference counting or locking is required.

Signed-off-by: David Ahern <dsah...@gmail.com>
---
 drivers/net/vrf.c | 25 ++++++-------------------
 1 file changed, 6 insertions(+), 19 deletions(-)

diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
index c6be49d3a9eb..c0ffe20772f3 100644
--- a/drivers/net/vrf.c
+++ b/drivers/net/vrf.c
@@ -48,6 +48,9 @@ static unsigned int vrf_net_id;
 struct net_vrf {
        struct rtable __rcu     *rth;
        struct rt6_info __rcu   *rt6;
+#if IS_ENABLED(CONFIG_IPV6)
+       struct fib6_table       *fib6_table;
+#endif
        u32                     tb_id;
 };
 
@@ -496,7 +499,6 @@ static int vrf_rt6_create(struct net_device *dev)
        int flags = DST_HOST | DST_NOPOLICY | DST_NOXFRM;
        struct net_vrf *vrf = netdev_priv(dev);
        struct net *net = dev_net(dev);
-       struct fib6_table *rt6i_table;
        struct rt6_info *rt6;
        int rc = -ENOMEM;
 
@@ -504,8 +506,8 @@ static int vrf_rt6_create(struct net_device *dev)
        if (!ipv6_mod_enabled())
                return 0;
 
-       rt6i_table = fib6_new_table(net, vrf->tb_id);
-       if (!rt6i_table)
+       vrf->fib6_table = fib6_new_table(net, vrf->tb_id);
+       if (!vrf->fib6_table)
                goto out;
 
        /* create a dst for routing packets out a VRF device */
@@ -513,7 +515,6 @@ static int vrf_rt6_create(struct net_device *dev)
        if (!rt6)
                goto out;
 
-       rt6->rt6i_table = rt6i_table;
        rt6->dst.output = vrf_output6;
 
        rcu_assign_pointer(vrf->rt6, rt6);
@@ -945,22 +946,8 @@ static struct rt6_info *vrf_ip6_route_lookup(struct net 
*net,
                                             int flags)
 {
        struct net_vrf *vrf = netdev_priv(dev);
-       struct fib6_table *table = NULL;
-       struct rt6_info *rt6;
-
-       rcu_read_lock();
-
-       /* fib6_table does not have a refcnt and can not be freed */
-       rt6 = rcu_dereference(vrf->rt6);
-       if (likely(rt6))
-               table = rt6->rt6i_table;
-
-       rcu_read_unlock();
-
-       if (!table)
-               return NULL;
 
-       return ip6_pol_route(net, table, ifindex, fl6, skb, flags);
+       return ip6_pol_route(net, vrf->fib6_table, ifindex, fl6, skb, flags);
 }
 
 static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev,
-- 
2.11.0

Reply via email to