The values that a next-hop group needs to keep track of depend on the group
type. Introduce a union to separate fields specific to the mpath groups
from fields specific to other group types.

Signed-off-by: Petr Machata <pe...@nvidia.com>
Reviewed-by: Ido Schimmel <ido...@nvidia.com>
---
 include/net/nexthop.h | 7 ++++++-
 net/ipv4/nexthop.c    | 4 ++--
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/include/net/nexthop.h b/include/net/nexthop.h
index 226930d66b63..d0e245b0635d 100644
--- a/include/net/nexthop.h
+++ b/include/net/nexthop.h
@@ -66,7 +66,12 @@ struct nh_info {
 struct nh_grp_entry {
        struct nexthop  *nh;
        u8              weight;
-       atomic_t        upper_bound;
+
+       union {
+               struct {
+                       atomic_t        upper_bound;
+               } mpath;
+       };
 
        struct list_head nh_list;
        struct nexthop  *nh_parent;  /* nexthop of group with this entry */
diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c
index 43bb5f451343..7a30df5aea75 100644
--- a/net/ipv4/nexthop.c
+++ b/net/ipv4/nexthop.c
@@ -689,7 +689,7 @@ static struct nexthop *nexthop_select_path_mp(struct 
nh_group *nhg, int hash)
                struct nh_grp_entry *nhge = &nhg->nh_entries[i];
                struct nh_info *nhi;
 
-               if (hash > atomic_read(&nhge->upper_bound))
+               if (hash > atomic_read(&nhge->mpath.upper_bound))
                        continue;
 
                nhi = rcu_dereference(nhge->nh->nh_info);
@@ -924,7 +924,7 @@ static void nh_group_rebalance(struct nh_group *nhg)
 
                w += nhge->weight;
                upper_bound = DIV_ROUND_CLOSEST_ULL((u64)w << 31, total) - 1;
-               atomic_set(&nhge->upper_bound, upper_bound);
+               atomic_set(&nhge->mpath.upper_bound, upper_bound);
        }
 }
 
-- 
2.26.2

Reply via email to