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;
 };
 
        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;
 
        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 */
        if (!rt6)
                goto out;
 
-       rt6->rt6i_table = rt6i_table;
        rt6->dst.output = vrf_output6;
 
        rcu_assign_pointer(vrf->rt6, rt6);
                                             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,