nexthop: Add a dedicated flag for multipath next-hop groups
authorPetr Machata <petrm@nvidia.com>
Thu, 11 Mar 2021 18:03:14 +0000 (19:03 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 12 Mar 2021 00:12:59 +0000 (16:12 -0800)
With the introduction of resilient nexthop groups, there will be two types
of multipath groups: the current hash-threshold "mpath" ones, and resilient
groups. Both are multipath, but to determine the fact, the system needs to
consider two flags. This might prove costly in the datapath. Therefore,
introduce a new flag, that should be set for next-hop groups that have more
than one nexthop, and should be considered multipath.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/nexthop.h
net/ipv4/nexthop.c

index 7bc057aee40b112b5422bbb7e78985546f004689..5062c2c08e2bce7375a56eeba669458503ca6290 100644 (file)
@@ -80,6 +80,7 @@ struct nh_grp_entry {
 struct nh_group {
        struct nh_group         *spare; /* spare group for removals */
        u16                     num_nh;
+       bool                    is_multipath;
        bool                    mpath;
        bool                    fdb_nh;
        bool                    has_v4;
@@ -212,7 +213,7 @@ static inline bool nexthop_is_multipath(const struct nexthop *nh)
                struct nh_group *nh_grp;
 
                nh_grp = rcu_dereference_rtnl(nh->nh_grp);
-               return nh_grp->mpath;
+               return nh_grp->is_multipath;
        }
        return false;
 }
@@ -227,7 +228,7 @@ static inline unsigned int nexthop_num_path(const struct nexthop *nh)
                struct nh_group *nh_grp;
 
                nh_grp = rcu_dereference_rtnl(nh->nh_grp);
-               if (nh_grp->mpath)
+               if (nh_grp->is_multipath)
                        rc = nh_grp->num_nh;
        }
 
@@ -308,7 +309,7 @@ struct fib_nh_common *nexthop_fib_nhc(struct nexthop *nh, int nhsel)
                struct nh_group *nh_grp;
 
                nh_grp = rcu_dereference_rtnl(nh->nh_grp);
-               if (nh_grp->mpath) {
+               if (nh_grp->is_multipath) {
                        nh = nexthop_mpath_select(nh_grp, nhsel);
                        if (!nh)
                                return NULL;
index 69c8b50a936e6fc40f9a9585b2fc91cf5cd5e752..56c54d0fbacc8275773df0cf2eaa64373351b5c0 100644 (file)
@@ -967,6 +967,7 @@ static void remove_nh_grp_entry(struct net *net, struct nh_grp_entry *nhge,
        }
 
        newg->has_v4 = false;
+       newg->is_multipath = nhg->is_multipath;
        newg->mpath = nhg->mpath;
        newg->fdb_nh = nhg->fdb_nh;
        newg->num_nh = nhg->num_nh;
@@ -1488,8 +1489,10 @@ static struct nexthop *nexthop_create_group(struct net *net,
                nhg->nh_entries[i].nh_parent = nh;
        }
 
-       if (cfg->nh_grp_type == NEXTHOP_GRP_TYPE_MPATH)
+       if (cfg->nh_grp_type == NEXTHOP_GRP_TYPE_MPATH) {
                nhg->mpath = 1;
+               nhg->is_multipath = true;
+       }
 
        WARN_ON_ONCE(nhg->mpath != 1);