Skip to content

Commit 1d63f0e

Browse files
committed
Merge branch 'mlxsw-Various-fixes'
Ido Schimmel says: ==================== mlxsw: Various fixes This patchset contains various fixes for mlxsw. Patch rib#1 fixes an hash polarization problem when a nexthop device is a LAG device. This is caused by the fact that the same seed is used for the LAG and ECMP hash functions. Patch rib#2 fixes an issue in which the driver fails to refresh a nexthop neighbour after it becomes dead. This prevents the nexthop from ever being written to the adjacency table and used to forward traffic. Patch Patch rib#4 fixes a wrong extraction of TOS value in flower offload code. Patch rib#5 is a test case. Patch rib#6 works around a buffer issue in Spectrum-2 by reducing the default sizes of the shared buffer pools. Patch rib#7 prevents prio-tagged packets from entering the switch when PVID is removed from the bridge port. Please consider patches rib#2, rib#4 and rib#6 for 5.1.y ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 648ee6c + 4b14cc3 commit 1d63f0e

7 files changed

Lines changed: 161 additions & 10 deletions

File tree

drivers/net/ethernet/mellanox/mlxsw/reg.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -997,7 +997,7 @@ static inline void mlxsw_reg_spaft_pack(char *payload, u8 local_port,
997997
MLXSW_REG_ZERO(spaft, payload);
998998
mlxsw_reg_spaft_local_port_set(payload, local_port);
999999
mlxsw_reg_spaft_allow_untagged_set(payload, allow_untagged);
1000-
mlxsw_reg_spaft_allow_prio_tagged_set(payload, true);
1000+
mlxsw_reg_spaft_allow_prio_tagged_set(payload, allow_untagged);
10011001
mlxsw_reg_spaft_allow_tagged_set(payload, true);
10021002
}
10031003

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4280,13 +4280,16 @@ static void mlxsw_sp_traps_fini(struct mlxsw_sp *mlxsw_sp)
42804280
}
42814281
}
42824282

4283+
#define MLXSW_SP_LAG_SEED_INIT 0xcafecafe
4284+
42834285
static int mlxsw_sp_lag_init(struct mlxsw_sp *mlxsw_sp)
42844286
{
42854287
char slcr_pl[MLXSW_REG_SLCR_LEN];
42864288
u32 seed;
42874289
int err;
42884290

4289-
seed = jhash(mlxsw_sp->base_mac, sizeof(mlxsw_sp->base_mac), 0);
4291+
seed = jhash(mlxsw_sp->base_mac, sizeof(mlxsw_sp->base_mac),
4292+
MLXSW_SP_LAG_SEED_INIT);
42904293
mlxsw_reg_slcr_pack(slcr_pl, MLXSW_REG_SLCR_LAG_HASH_SMAC |
42914294
MLXSW_REG_SLCR_LAG_HASH_DMAC |
42924295
MLXSW_REG_SLCR_LAG_HASH_ETHERTYPE |

drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,8 +437,8 @@ static const struct mlxsw_sp_sb_pr mlxsw_sp1_sb_prs[] = {
437437
MLXSW_SP1_SB_PR_CPU_SIZE, true, false),
438438
};
439439

440-
#define MLXSW_SP2_SB_PR_INGRESS_SIZE 40960000
441-
#define MLXSW_SP2_SB_PR_EGRESS_SIZE 40960000
440+
#define MLXSW_SP2_SB_PR_INGRESS_SIZE 38128752
441+
#define MLXSW_SP2_SB_PR_EGRESS_SIZE 38128752
442442
#define MLXSW_SP2_SB_PR_CPU_SIZE (256 * 1000)
443443

444444
/* Order according to mlxsw_sp2_sb_pool_dess */

drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,8 @@ static int mlxsw_sp_flower_parse_ip(struct mlxsw_sp *mlxsw_sp,
247247
match.mask->tos & 0x3);
248248

249249
mlxsw_sp_acl_rulei_keymask_u32(rulei, MLXSW_AFK_ELEMENT_IP_DSCP,
250-
match.key->tos >> 6,
251-
match.mask->tos >> 6);
250+
match.key->tos >> 2,
251+
match.mask->tos >> 2);
252252

253253
return 0;
254254
}

drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2363,7 +2363,7 @@ static void mlxsw_sp_router_probe_unresolved_nexthops(struct work_struct *work)
23632363
static void
23642364
mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp *mlxsw_sp,
23652365
struct mlxsw_sp_neigh_entry *neigh_entry,
2366-
bool removing);
2366+
bool removing, bool dead);
23672367

23682368
static enum mlxsw_reg_rauht_op mlxsw_sp_rauht_op(bool adding)
23692369
{
@@ -2507,7 +2507,8 @@ static void mlxsw_sp_router_neigh_event_work(struct work_struct *work)
25072507

25082508
memcpy(neigh_entry->ha, ha, ETH_ALEN);
25092509
mlxsw_sp_neigh_entry_update(mlxsw_sp, neigh_entry, entry_connected);
2510-
mlxsw_sp_nexthop_neigh_update(mlxsw_sp, neigh_entry, !entry_connected);
2510+
mlxsw_sp_nexthop_neigh_update(mlxsw_sp, neigh_entry, !entry_connected,
2511+
dead);
25112512

25122513
if (!neigh_entry->connected && list_empty(&neigh_entry->nexthop_list))
25132514
mlxsw_sp_neigh_entry_destroy(mlxsw_sp, neigh_entry);
@@ -3472,13 +3473,79 @@ static void __mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp_nexthop *nh,
34723473
nh->update = 1;
34733474
}
34743475

3476+
static int
3477+
mlxsw_sp_nexthop_dead_neigh_replace(struct mlxsw_sp *mlxsw_sp,
3478+
struct mlxsw_sp_neigh_entry *neigh_entry)
3479+
{
3480+
struct neighbour *n, *old_n = neigh_entry->key.n;
3481+
struct mlxsw_sp_nexthop *nh;
3482+
bool entry_connected;
3483+
u8 nud_state, dead;
3484+
int err;
3485+
3486+
nh = list_first_entry(&neigh_entry->nexthop_list,
3487+
struct mlxsw_sp_nexthop, neigh_list_node);
3488+
3489+
n = neigh_lookup(nh->nh_grp->neigh_tbl, &nh->gw_addr, nh->rif->dev);
3490+
if (!n) {
3491+
n = neigh_create(nh->nh_grp->neigh_tbl, &nh->gw_addr,
3492+
nh->rif->dev);
3493+
if (IS_ERR(n))
3494+
return PTR_ERR(n);
3495+
neigh_event_send(n, NULL);
3496+
}
3497+
3498+
mlxsw_sp_neigh_entry_remove(mlxsw_sp, neigh_entry);
3499+
neigh_entry->key.n = n;
3500+
err = mlxsw_sp_neigh_entry_insert(mlxsw_sp, neigh_entry);
3501+
if (err)
3502+
goto err_neigh_entry_insert;
3503+
3504+
read_lock_bh(&n->lock);
3505+
nud_state = n->nud_state;
3506+
dead = n->dead;
3507+
read_unlock_bh(&n->lock);
3508+
entry_connected = nud_state & NUD_VALID && !dead;
3509+
3510+
list_for_each_entry(nh, &neigh_entry->nexthop_list,
3511+
neigh_list_node) {
3512+
neigh_release(old_n);
3513+
neigh_clone(n);
3514+
__mlxsw_sp_nexthop_neigh_update(nh, !entry_connected);
3515+
mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nh_grp);
3516+
}
3517+
3518+
neigh_release(n);
3519+
3520+
return 0;
3521+
3522+
err_neigh_entry_insert:
3523+
neigh_entry->key.n = old_n;
3524+
mlxsw_sp_neigh_entry_insert(mlxsw_sp, neigh_entry);
3525+
neigh_release(n);
3526+
return err;
3527+
}
3528+
34753529
static void
34763530
mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp *mlxsw_sp,
34773531
struct mlxsw_sp_neigh_entry *neigh_entry,
3478-
bool removing)
3532+
bool removing, bool dead)
34793533
{
34803534
struct mlxsw_sp_nexthop *nh;
34813535

3536+
if (list_empty(&neigh_entry->nexthop_list))
3537+
return;
3538+
3539+
if (dead) {
3540+
int err;
3541+
3542+
err = mlxsw_sp_nexthop_dead_neigh_replace(mlxsw_sp,
3543+
neigh_entry);
3544+
if (err)
3545+
dev_err(mlxsw_sp->bus_info->dev, "Failed to replace dead neigh\n");
3546+
return;
3547+
}
3548+
34823549
list_for_each_entry(nh, &neigh_entry->nexthop_list,
34833550
neigh_list_node) {
34843551
__mlxsw_sp_nexthop_neigh_update(nh, removing);

tools/testing/selftests/drivers/net/mlxsw/rtnetlink.sh

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ ALL_TESTS="
2828
vlan_interface_uppers_test
2929
bridge_extern_learn_test
3030
neigh_offload_test
31+
nexthop_offload_test
3132
devlink_reload_test
3233
"
3334
NUM_NETIFS=2
@@ -607,6 +608,52 @@ neigh_offload_test()
607608
ip -4 address del 192.0.2.1/24 dev $swp1
608609
}
609610

611+
nexthop_offload_test()
612+
{
613+
# Test that IPv4 and IPv6 nexthops are marked as offloaded
614+
RET=0
615+
616+
sysctl_set net.ipv6.conf.$swp2.keep_addr_on_down 1
617+
simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
618+
simple_if_init $swp2 192.0.2.2/24 2001:db8:1::2/64
619+
setup_wait
620+
621+
ip -4 route add 198.51.100.0/24 vrf v$swp1 \
622+
nexthop via 192.0.2.2 dev $swp1
623+
ip -6 route add 2001:db8:2::/64 vrf v$swp1 \
624+
nexthop via 2001:db8:1::2 dev $swp1
625+
626+
ip -4 route show 198.51.100.0/24 vrf v$swp1 | grep -q offload
627+
check_err $? "ipv4 nexthop not marked as offloaded when should"
628+
ip -6 route show 2001:db8:2::/64 vrf v$swp1 | grep -q offload
629+
check_err $? "ipv6 nexthop not marked as offloaded when should"
630+
631+
ip link set dev $swp2 down
632+
sleep 1
633+
634+
ip -4 route show 198.51.100.0/24 vrf v$swp1 | grep -q offload
635+
check_fail $? "ipv4 nexthop marked as offloaded when should not"
636+
ip -6 route show 2001:db8:2::/64 vrf v$swp1 | grep -q offload
637+
check_fail $? "ipv6 nexthop marked as offloaded when should not"
638+
639+
ip link set dev $swp2 up
640+
setup_wait
641+
642+
ip -4 route show 198.51.100.0/24 vrf v$swp1 | grep -q offload
643+
check_err $? "ipv4 nexthop not marked as offloaded after neigh add"
644+
ip -6 route show 2001:db8:2::/64 vrf v$swp1 | grep -q offload
645+
check_err $? "ipv6 nexthop not marked as offloaded after neigh add"
646+
647+
log_test "nexthop offload indication"
648+
649+
ip -6 route del 2001:db8:2::/64 vrf v$swp1
650+
ip -4 route del 198.51.100.0/24 vrf v$swp1
651+
652+
simple_if_fini $swp2 192.0.2.2/24 2001:db8:1::2/64
653+
simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
654+
sysctl_restore net.ipv6.conf.$swp2.keep_addr_on_down
655+
}
656+
610657
devlink_reload_test()
611658
{
612659
# Test that after executing all the above configuration tests, a

tools/testing/selftests/net/forwarding/tc_flower.sh

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
# SPDX-License-Identifier: GPL-2.0
33

44
ALL_TESTS="match_dst_mac_test match_src_mac_test match_dst_ip_test \
5-
match_src_ip_test match_ip_flags_test match_pcp_test match_vlan_test"
5+
match_src_ip_test match_ip_flags_test match_pcp_test match_vlan_test \
6+
match_ip_tos_test"
67
NUM_NETIFS=2
78
source tc_common.sh
89
source lib.sh
@@ -276,6 +277,39 @@ match_vlan_test()
276277
log_test "VLAN match ($tcflags)"
277278
}
278279

280+
match_ip_tos_test()
281+
{
282+
RET=0
283+
284+
tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
285+
$tcflags dst_ip 192.0.2.2 ip_tos 0x20 action drop
286+
tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
287+
$tcflags dst_ip 192.0.2.2 ip_tos 0x18 action drop
288+
289+
$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
290+
-t ip tos=18 -q
291+
292+
tc_check_packets "dev $h2 ingress" 101 1
293+
check_fail $? "Matched on a wrong filter (0x18)"
294+
295+
tc_check_packets "dev $h2 ingress" 102 1
296+
check_err $? "Did not match on correct filter (0x18)"
297+
298+
$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
299+
-t ip tos=20 -q
300+
301+
tc_check_packets "dev $h2 ingress" 102 2
302+
check_fail $? "Matched on a wrong filter (0x20)"
303+
304+
tc_check_packets "dev $h2 ingress" 101 1
305+
check_err $? "Did not match on correct filter (0x20)"
306+
307+
tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
308+
tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
309+
310+
log_test "ip_tos match ($tcflags)"
311+
}
312+
279313
setup_prepare()
280314
{
281315
h1=${NETIFS[p1]}

0 commit comments

Comments
 (0)