From: Ido Schimmel <ido...@mellanox.com>

Unlike IPv4, the kernel does not consolidate IPv6 nexthop groups. To
avoid exhausting the device's adjacency table - where nexthops are
stored - the driver does this consolidation instead.

Each nexthop group is hashed by XOR-ing the interface indexes of all the
member nexthop devices. However, the ifindex itself is not hashed, which
can result in identical keys used for different groups and finally an
-EBUSY error from rhashtable due to too long objects list.

Improve the situation by hashing the ifindex itself.

Signed-off-by: Ido Schimmel <ido...@mellanox.com>
Acked-by: Jiri Pirko <j...@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index e618be7ce6c6..a330b369e899 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -2943,7 +2943,7 @@ static u32 mlxsw_sp_nexthop_group_hash_obj(const void 
*data, u32 len, u32 seed)
                val = nh_grp->count;
                for (i = 0; i < nh_grp->count; i++) {
                        nh = &nh_grp->nexthops[i];
-                       val ^= nh->ifindex;
+                       val ^= jhash(&nh->ifindex, sizeof(nh->ifindex), seed);
                }
                return jhash(&val, sizeof(val), seed);
        default:
@@ -2961,7 +2961,7 @@ mlxsw_sp_nexthop6_group_hash(struct mlxsw_sp_fib6_entry 
*fib6_entry, u32 seed)
 
        list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) {
                dev = mlxsw_sp_rt6->rt->fib6_nh->fib_nh_dev;
-               val ^= dev->ifindex;
+               val ^= jhash(&dev->ifindex, sizeof(dev->ifindex), seed);
        }
 
        return jhash(&val, sizeof(val), seed);
-- 
2.21.0

Reply via email to