mlxsw: spectrum_router: Increase scale of IPv6 nexthop groups
authorIdo Schimmel <idosch@mellanox.com>
Tue, 23 Jul 2019 07:57:42 +0000 (10:57 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 25 Jul 2019 18:36:19 +0000 (11:36 -0700)
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 <idosch@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index e618be7..a330b36 100644 (file)
@@ -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);