diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c')
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 23 | 
1 files changed, 18 insertions, 5 deletions
| diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 9dbb573d53ea..ce33dbde124d 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -4415,6 +4415,8 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp,  	return 0;  err_nexthop_neigh_init: +	list_del(&nh->router_list_node); +	mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh);  	mlxsw_sp_nexthop_remove(mlxsw_sp, nh);  	return err;  } @@ -5382,7 +5384,7 @@ static bool mlxsw_sp_fi_is_gateway(const struct mlxsw_sp *mlxsw_sp,  {  	const struct fib_nh *nh = fib_info_nh(fi, 0); -	return nh->fib_nh_scope == RT_SCOPE_LINK || +	return nh->fib_nh_gw_family ||  	       mlxsw_sp_nexthop4_ipip_type(mlxsw_sp, nh, NULL);  } @@ -6740,6 +6742,7 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,  				  const struct fib6_info *rt)  {  	struct net_device *dev = rt->fib6_nh->fib_nh_dev; +	int err;  	nh->nhgi = nh_grp->nhgi;  	nh->nh_weight = rt->fib6_nh->fib_nh_weight; @@ -6755,7 +6758,16 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,  		return 0;  	nh->ifindex = dev->ifindex; -	return mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); +	err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); +	if (err) +		goto err_nexthop_type_init; + +	return 0; + +err_nexthop_type_init: +	list_del(&nh->router_list_node); +	mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); +	return err;  }  static void mlxsw_sp_nexthop6_fini(struct mlxsw_sp *mlxsw_sp, @@ -10312,7 +10324,7 @@ static void mlxsw_sp_mp4_hash_init(struct mlxsw_sp *mlxsw_sp,  	unsigned long *fields = config->fields;  	u32 hash_fields; -	switch (net->ipv4.sysctl_fib_multipath_hash_policy) { +	switch (READ_ONCE(net->ipv4.sysctl_fib_multipath_hash_policy)) {  	case 0:  		mlxsw_sp_mp4_hash_outer_addr(config);  		break; @@ -10330,7 +10342,7 @@ static void mlxsw_sp_mp4_hash_init(struct mlxsw_sp *mlxsw_sp,  		mlxsw_sp_mp_hash_inner_l3(config);  		break;  	case 3: -		hash_fields = net->ipv4.sysctl_fib_multipath_hash_fields; +		hash_fields = READ_ONCE(net->ipv4.sysctl_fib_multipath_hash_fields);  		/* Outer */  		MLXSW_SP_MP_HASH_HEADER_SET(headers, IPV4_EN_NOT_TCP_NOT_UDP);  		MLXSW_SP_MP_HASH_HEADER_SET(headers, IPV4_EN_TCP_UDP); @@ -10511,13 +10523,14 @@ static int mlxsw_sp_dscp_init(struct mlxsw_sp *mlxsw_sp)  static int __mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)  {  	struct net *net = mlxsw_sp_net(mlxsw_sp); -	bool usp = net->ipv4.sysctl_ip_fwd_update_priority;  	char rgcr_pl[MLXSW_REG_RGCR_LEN];  	u64 max_rifs; +	bool usp;  	if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_RIFS))  		return -EIO;  	max_rifs = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); +	usp = READ_ONCE(net->ipv4.sysctl_ip_fwd_update_priority);  	mlxsw_reg_rgcr_pack(rgcr_pl, true, true);  	mlxsw_reg_rgcr_max_router_interfaces_set(rgcr_pl, max_rifs); |