Skip to content

Commit bc9291d

Browse files
committed
Merge branch 'mlxsw-miscellaneous-fixes'
Petr Machata says: ==================== mlxsw: Miscellaneous fixes This patchset is a bric-a-brac of fixes for bugs impacting mlxsw. - Patches #1 and #2 fix issues in ACL handling error paths. - Patch #3 fixes stack corruption in ACL code that a recent FW update has uncovered. - Patch #4 fixes an issue in handling of IPIP next hops. - Patch #5 fixes a typo in a the qos_pfc selftest - Patch #6 fixes the same selftest to work with 8-lane ports. ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents f1172f3 + b34f4de commit bc9291d

File tree

5 files changed

+143
-20
lines changed

5 files changed

+143
-20
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ mlxsw_sp_acl_erp_table_alloc(struct mlxsw_sp_acl_erp_core *erp_core,
301301
unsigned long *p_index)
302302
{
303303
unsigned int num_rows, entry_size;
304+
unsigned long index;
304305

305306
/* We only allow allocations of entire rows */
306307
if (num_erps % erp_core->num_erp_banks != 0)
@@ -309,10 +310,11 @@ mlxsw_sp_acl_erp_table_alloc(struct mlxsw_sp_acl_erp_core *erp_core,
309310
entry_size = erp_core->erpt_entries_size[region_type];
310311
num_rows = num_erps / erp_core->num_erp_banks;
311312

312-
*p_index = gen_pool_alloc(erp_core->erp_tables, num_rows * entry_size);
313-
if (*p_index == 0)
313+
index = gen_pool_alloc(erp_core->erp_tables, num_rows * entry_size);
314+
if (!index)
314315
return -ENOBUFS;
315-
*p_index -= MLXSW_SP_ACL_ERP_GENALLOC_OFFSET;
316+
317+
*p_index = index - MLXSW_SP_ACL_ERP_GENALLOC_OFFSET;
316318

317319
return 0;
318320
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -681,13 +681,13 @@ static void
681681
mlxsw_sp_acl_tcam_region_destroy(struct mlxsw_sp *mlxsw_sp,
682682
struct mlxsw_sp_acl_tcam_region *region)
683683
{
684+
struct mlxsw_sp_acl_tcam *tcam = mlxsw_sp_acl_to_tcam(mlxsw_sp->acl);
684685
const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops;
685686

686687
ops->region_fini(mlxsw_sp, region->priv);
687688
mlxsw_sp_acl_tcam_region_disable(mlxsw_sp, region);
688689
mlxsw_sp_acl_tcam_region_free(mlxsw_sp, region);
689-
mlxsw_sp_acl_tcam_region_id_put(region->group->tcam,
690-
region->id);
690+
mlxsw_sp_acl_tcam_region_id_put(tcam, region->id);
691691
kfree(region);
692692
}
693693

@@ -1564,6 +1564,8 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp,
15641564
tcam->max_groups = max_groups;
15651565
tcam->max_group_size = MLXSW_CORE_RES_GET(mlxsw_sp->core,
15661566
ACL_MAX_GROUP_SIZE);
1567+
tcam->max_group_size = min_t(unsigned int, tcam->max_group_size,
1568+
MLXSW_REG_PAGT_ACL_MAX_NUM);
15671569

15681570
err = ops->init(mlxsw_sp, tcam->priv, tcam);
15691571
if (err)

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11472,6 +11472,13 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
1147211472
if (err)
1147311473
goto err_register_netevent_notifier;
1147411474

11475+
mlxsw_sp->router->netdevice_nb.notifier_call =
11476+
mlxsw_sp_router_netdevice_event;
11477+
err = register_netdevice_notifier_net(mlxsw_sp_net(mlxsw_sp),
11478+
&mlxsw_sp->router->netdevice_nb);
11479+
if (err)
11480+
goto err_register_netdev_notifier;
11481+
1147511482
mlxsw_sp->router->nexthop_nb.notifier_call =
1147611483
mlxsw_sp_nexthop_obj_event;
1147711484
err = register_nexthop_notifier(mlxsw_sp_net(mlxsw_sp),
@@ -11487,22 +11494,15 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
1148711494
if (err)
1148811495
goto err_register_fib_notifier;
1148911496

11490-
mlxsw_sp->router->netdevice_nb.notifier_call =
11491-
mlxsw_sp_router_netdevice_event;
11492-
err = register_netdevice_notifier_net(mlxsw_sp_net(mlxsw_sp),
11493-
&mlxsw_sp->router->netdevice_nb);
11494-
if (err)
11495-
goto err_register_netdev_notifier;
11496-
1149711497
return 0;
1149811498

11499-
err_register_netdev_notifier:
11500-
unregister_fib_notifier(mlxsw_sp_net(mlxsw_sp),
11501-
&mlxsw_sp->router->fib_nb);
1150211499
err_register_fib_notifier:
1150311500
unregister_nexthop_notifier(mlxsw_sp_net(mlxsw_sp),
1150411501
&mlxsw_sp->router->nexthop_nb);
1150511502
err_register_nexthop_notifier:
11503+
unregister_netdevice_notifier_net(mlxsw_sp_net(mlxsw_sp),
11504+
&router->netdevice_nb);
11505+
err_register_netdev_notifier:
1150611506
unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
1150711507
err_register_netevent_notifier:
1150811508
unregister_inet6addr_validator_notifier(&router->inet6addr_valid_nb);
@@ -11550,11 +11550,11 @@ void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
1155011550
{
1155111551
struct mlxsw_sp_router *router = mlxsw_sp->router;
1155211552

11553-
unregister_netdevice_notifier_net(mlxsw_sp_net(mlxsw_sp),
11554-
&router->netdevice_nb);
1155511553
unregister_fib_notifier(mlxsw_sp_net(mlxsw_sp), &router->fib_nb);
1155611554
unregister_nexthop_notifier(mlxsw_sp_net(mlxsw_sp),
1155711555
&router->nexthop_nb);
11556+
unregister_netdevice_notifier_net(mlxsw_sp_net(mlxsw_sp),
11557+
&router->netdevice_nb);
1155811558
unregister_netevent_notifier(&router->netevent_nb);
1155911559
unregister_inet6addr_validator_notifier(&router->inet6addr_valid_nb);
1156011560
unregister_inetaddr_validator_notifier(&router->inetaddr_valid_nb);

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
# | + $swp1 $swp3 + + $swp4 |
4141
# | | iPOOL1 iPOOL0 | | iPOOL2 |
4242
# | | ePOOL4 ePOOL5 | | ePOOL4 |
43-
# | | 1Gbps | | 1Gbps |
4443
# | | PFC:enabled=1 | | PFC:enabled=1 |
4544
# | +-|----------------------|-+ +-|------------------------+ |
4645
# | | + $swp1.111 $swp3.111 + | | + $swp4.111 | |
@@ -120,6 +119,9 @@ h2_destroy()
120119

121120
switch_create()
122121
{
122+
local lanes_swp4
123+
local pg1_size
124+
123125
# pools
124126
# -----
125127

@@ -229,7 +231,20 @@ switch_create()
229231
dcb pfc set dev $swp4 prio-pfc all:off 1:on
230232
# PG0 will get autoconfigured to Xoff, give PG1 arbitrarily 100K, which
231233
# is (-2*MTU) about 80K of delay provision.
232-
dcb buffer set dev $swp4 buffer-size all:0 1:$_100KB
234+
pg1_size=$_100KB
235+
236+
setup_wait_dev_with_timeout $swp4
237+
238+
lanes_swp4=$(ethtool $swp4 | grep 'Lanes:')
239+
lanes_swp4=${lanes_swp4#*"Lanes: "}
240+
241+
# 8-lane ports use two buffers among which the configured buffer
242+
# is split, so double the size to get twice (20K + 80K).
243+
if [[ $lanes_swp4 -eq 8 ]]; then
244+
pg1_size=$((pg1_size * 2))
245+
fi
246+
247+
dcb buffer set dev $swp4 buffer-size all:0 1:$pg1_size
233248

234249
# bridges
235250
# -------

tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ lib_dir=$(dirname $0)/../../../../net/forwarding
1010
ALL_TESTS="single_mask_test identical_filters_test two_masks_test \
1111
multiple_masks_test ctcam_edge_cases_test delta_simple_test \
1212
delta_two_masks_one_key_test delta_simple_rehash_test \
13-
bloom_simple_test bloom_complex_test bloom_delta_test"
13+
bloom_simple_test bloom_complex_test bloom_delta_test \
14+
max_erp_entries_test max_group_size_test"
1415
NUM_NETIFS=2
1516
source $lib_dir/lib.sh
1617
source $lib_dir/tc_common.sh
@@ -983,6 +984,109 @@ bloom_delta_test()
983984
log_test "bloom delta test ($tcflags)"
984985
}
985986

987+
max_erp_entries_test()
988+
{
989+
# The number of eRP entries is limited. Once the maximum number of eRPs
990+
# has been reached, filters cannot be added. This test verifies that
991+
# when this limit is reached, inserstion fails without crashing.
992+
993+
RET=0
994+
995+
local num_masks=32
996+
local num_regions=15
997+
local chain_failed
998+
local mask_failed
999+
local ret
1000+
1001+
if [[ "$tcflags" != "skip_sw" ]]; then
1002+
return 0;
1003+
fi
1004+
1005+
for ((i=1; i < $num_regions; i++)); do
1006+
for ((j=$num_masks; j >= 0; j--)); do
1007+
tc filter add dev $h2 ingress chain $i protocol ip \
1008+
pref $i handle $j flower $tcflags \
1009+
dst_ip 192.1.0.0/$j &> /dev/null
1010+
ret=$?
1011+
1012+
if [ $ret -ne 0 ]; then
1013+
chain_failed=$i
1014+
mask_failed=$j
1015+
break 2
1016+
fi
1017+
done
1018+
done
1019+
1020+
# We expect to exceed the maximum number of eRP entries, so that
1021+
# insertion eventually fails. Otherwise, the test should be adjusted to
1022+
# add more filters.
1023+
check_fail $ret "expected to exceed number of eRP entries"
1024+
1025+
for ((; i >= 1; i--)); do
1026+
for ((j=0; j <= $num_masks; j++)); do
1027+
tc filter del dev $h2 ingress chain $i protocol ip \
1028+
pref $i handle $j flower &> /dev/null
1029+
done
1030+
done
1031+
1032+
log_test "max eRP entries test ($tcflags). " \
1033+
"max chain $chain_failed, mask $mask_failed"
1034+
}
1035+
1036+
max_group_size_test()
1037+
{
1038+
# The number of ACLs in an ACL group is limited. Once the maximum
1039+
# number of ACLs has been reached, filters cannot be added. This test
1040+
# verifies that when this limit is reached, insertion fails without
1041+
# crashing.
1042+
1043+
RET=0
1044+
1045+
local num_acls=32
1046+
local max_size
1047+
local ret
1048+
1049+
if [[ "$tcflags" != "skip_sw" ]]; then
1050+
return 0;
1051+
fi
1052+
1053+
for ((i=1; i < $num_acls; i++)); do
1054+
if [[ $(( i % 2 )) == 1 ]]; then
1055+
tc filter add dev $h2 ingress pref $i proto ipv4 \
1056+
flower $tcflags dst_ip 198.51.100.1/32 \
1057+
ip_proto tcp tcp_flags 0x01/0x01 \
1058+
action drop &> /dev/null
1059+
else
1060+
tc filter add dev $h2 ingress pref $i proto ipv6 \
1061+
flower $tcflags dst_ip 2001:db8:1::1/128 \
1062+
action drop &> /dev/null
1063+
fi
1064+
1065+
ret=$?
1066+
[[ $ret -ne 0 ]] && max_size=$((i - 1)) && break
1067+
done
1068+
1069+
# We expect to exceed the maximum number of ACLs in a group, so that
1070+
# insertion eventually fails. Otherwise, the test should be adjusted to
1071+
# add more filters.
1072+
check_fail $ret "expected to exceed number of ACLs in a group"
1073+
1074+
for ((; i >= 1; i--)); do
1075+
if [[ $(( i % 2 )) == 1 ]]; then
1076+
tc filter del dev $h2 ingress pref $i proto ipv4 \
1077+
flower $tcflags dst_ip 198.51.100.1/32 \
1078+
ip_proto tcp tcp_flags 0x01/0x01 \
1079+
action drop &> /dev/null
1080+
else
1081+
tc filter del dev $h2 ingress pref $i proto ipv6 \
1082+
flower $tcflags dst_ip 2001:db8:1::1/128 \
1083+
action drop &> /dev/null
1084+
fi
1085+
done
1086+
1087+
log_test "max ACL group size test ($tcflags). max size $max_size"
1088+
}
1089+
9861090
setup_prepare()
9871091
{
9881092
h1=${NETIFS[p1]}

0 commit comments

Comments
 (0)