Commit 90e1a9e2 authored by Petr Machata's avatar Petr Machata Committed by David S. Miller

nexthop: Add a dedicated flag for multipath next-hop groups

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: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 96a85625
...@@ -80,6 +80,7 @@ struct nh_grp_entry { ...@@ -80,6 +80,7 @@ struct nh_grp_entry {
struct nh_group { struct nh_group {
struct nh_group *spare; /* spare group for removals */ struct nh_group *spare; /* spare group for removals */
u16 num_nh; u16 num_nh;
bool is_multipath;
bool mpath; bool mpath;
bool fdb_nh; bool fdb_nh;
bool has_v4; bool has_v4;
...@@ -212,7 +213,7 @@ static inline bool nexthop_is_multipath(const struct nexthop *nh) ...@@ -212,7 +213,7 @@ static inline bool nexthop_is_multipath(const struct nexthop *nh)
struct nh_group *nh_grp; struct nh_group *nh_grp;
nh_grp = rcu_dereference_rtnl(nh->nh_grp); nh_grp = rcu_dereference_rtnl(nh->nh_grp);
return nh_grp->mpath; return nh_grp->is_multipath;
} }
return false; return false;
} }
...@@ -227,7 +228,7 @@ static inline unsigned int nexthop_num_path(const struct nexthop *nh) ...@@ -227,7 +228,7 @@ static inline unsigned int nexthop_num_path(const struct nexthop *nh)
struct nh_group *nh_grp; struct nh_group *nh_grp;
nh_grp = rcu_dereference_rtnl(nh->nh_grp); nh_grp = rcu_dereference_rtnl(nh->nh_grp);
if (nh_grp->mpath) if (nh_grp->is_multipath)
rc = nh_grp->num_nh; rc = nh_grp->num_nh;
} }
...@@ -308,7 +309,7 @@ struct fib_nh_common *nexthop_fib_nhc(struct nexthop *nh, int nhsel) ...@@ -308,7 +309,7 @@ struct fib_nh_common *nexthop_fib_nhc(struct nexthop *nh, int nhsel)
struct nh_group *nh_grp; struct nh_group *nh_grp;
nh_grp = rcu_dereference_rtnl(nh->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); nh = nexthop_mpath_select(nh_grp, nhsel);
if (!nh) if (!nh)
return NULL; return NULL;
......
...@@ -967,6 +967,7 @@ static void remove_nh_grp_entry(struct net *net, struct nh_grp_entry *nhge, ...@@ -967,6 +967,7 @@ static void remove_nh_grp_entry(struct net *net, struct nh_grp_entry *nhge,
} }
newg->has_v4 = false; newg->has_v4 = false;
newg->is_multipath = nhg->is_multipath;
newg->mpath = nhg->mpath; newg->mpath = nhg->mpath;
newg->fdb_nh = nhg->fdb_nh; newg->fdb_nh = nhg->fdb_nh;
newg->num_nh = nhg->num_nh; newg->num_nh = nhg->num_nh;
...@@ -1488,8 +1489,10 @@ static struct nexthop *nexthop_create_group(struct net *net, ...@@ -1488,8 +1489,10 @@ static struct nexthop *nexthop_create_group(struct net *net,
nhg->nh_entries[i].nh_parent = nh; 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->mpath = 1;
nhg->is_multipath = true;
}
WARN_ON_ONCE(nhg->mpath != 1); WARN_ON_ONCE(nhg->mpath != 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment