Skip to content

Commit 5d104a5

Browse files
committed
Merge branch 'mlxsw-fixes'
Ido Schimmel says: ==================== mlxsw fixes This patch set contains various fixes for mlxsw. Patches #1-#2 fix two trap related issues introduced in previous cycle. Patches #3-#5 fix rare use-after-frees discovered by syzkaller. After over a week of fuzzing with the fixes, the bugs did not reproduce. Patch #6 from Amit fixes an issue in the ethtool selftest that was recently discovered after running the test on a new platform that supports only 1Gbps and 10Gbps speeds. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 83f3522 + 10fef9c commit 5d104a5

File tree

8 files changed

+51
-41
lines changed

8 files changed

+51
-41
lines changed

Documentation/networking/devlink/devlink-trap.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,10 @@ narrow. The description of these groups must be added to the following table:
486486
- Contains packet traps for packets that should be locally delivered after
487487
routing, but do not match more specific packet traps (e.g.,
488488
``ipv4_bgp``)
489+
* - ``external_delivery``
490+
- Contains packet traps for packets that should be routed through an
491+
external interface (e.g., management interface) that does not belong to
492+
the same device (e.g., switch ASIC) as the ingress interface
489493
* - ``ipv6``
490494
- Contains packet traps for various IPv6 control packets (e.g., Router
491495
Advertisements)

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1814,7 +1814,7 @@ static int mlxsw_core_reg_access_emad(struct mlxsw_core *mlxsw_core,
18141814
err = mlxsw_emad_reg_access(mlxsw_core, reg, payload, type, trans,
18151815
bulk_list, cb, cb_priv, tid);
18161816
if (err) {
1817-
kfree(trans);
1817+
kfree_rcu(trans, rcu);
18181818
return err;
18191819
}
18201820
return 0;
@@ -2051,11 +2051,13 @@ void mlxsw_core_skb_receive(struct mlxsw_core *mlxsw_core, struct sk_buff *skb,
20512051
break;
20522052
}
20532053
}
2054-
rcu_read_unlock();
2055-
if (!found)
2054+
if (!found) {
2055+
rcu_read_unlock();
20562056
goto drop;
2057+
}
20572058

20582059
rxl->func(skb, local_port, rxl_item->priv);
2060+
rcu_read_unlock();
20592061
return;
20602062

20612063
drop:

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5536,6 +5536,7 @@ enum mlxsw_reg_htgt_trap_group {
55365536
MLXSW_REG_HTGT_TRAP_GROUP_SP_MULTICAST,
55375537
MLXSW_REG_HTGT_TRAP_GROUP_SP_NEIGH_DISCOVERY,
55385538
MLXSW_REG_HTGT_TRAP_GROUP_SP_ROUTER_EXP,
5539+
MLXSW_REG_HTGT_TRAP_GROUP_SP_EXTERNAL_ROUTE,
55395540
MLXSW_REG_HTGT_TRAP_GROUP_SP_IP2ME,
55405541
MLXSW_REG_HTGT_TRAP_GROUP_SP_DHCP,
55415542
MLXSW_REG_HTGT_TRAP_GROUP_SP_EVENT,

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

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5001,15 +5001,6 @@ static void mlxsw_sp_router_fib4_del(struct mlxsw_sp *mlxsw_sp,
50015001

50025002
static bool mlxsw_sp_fib6_rt_should_ignore(const struct fib6_info *rt)
50035003
{
5004-
/* Packets with link-local destination IP arriving to the router
5005-
* are trapped to the CPU, so no need to program specific routes
5006-
* for them. Only allow prefix routes (usually one fe80::/64) so
5007-
* that packets are trapped for the right reason.
5008-
*/
5009-
if ((ipv6_addr_type(&rt->fib6_dst.addr) & IPV6_ADDR_LINKLOCAL) &&
5010-
(rt->fib6_flags & (RTF_LOCAL | RTF_ANYCAST)))
5011-
return true;
5012-
50135004
/* Multicast routes aren't supported, so ignore them. Neighbour
50145005
* Discovery packets are specifically trapped.
50155006
*/
@@ -8078,16 +8069,6 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
80788069
mlxsw_sp->router = router;
80798070
router->mlxsw_sp = mlxsw_sp;
80808071

8081-
router->inetaddr_nb.notifier_call = mlxsw_sp_inetaddr_event;
8082-
err = register_inetaddr_notifier(&router->inetaddr_nb);
8083-
if (err)
8084-
goto err_register_inetaddr_notifier;
8085-
8086-
router->inet6addr_nb.notifier_call = mlxsw_sp_inet6addr_event;
8087-
err = register_inet6addr_notifier(&router->inet6addr_nb);
8088-
if (err)
8089-
goto err_register_inet6addr_notifier;
8090-
80918072
INIT_LIST_HEAD(&mlxsw_sp->router->nexthop_neighs_list);
80928073
err = __mlxsw_sp_router_init(mlxsw_sp);
80938074
if (err)
@@ -8128,12 +8109,6 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
81288109
if (err)
81298110
goto err_neigh_init;
81308111

8131-
mlxsw_sp->router->netevent_nb.notifier_call =
8132-
mlxsw_sp_router_netevent_event;
8133-
err = register_netevent_notifier(&mlxsw_sp->router->netevent_nb);
8134-
if (err)
8135-
goto err_register_netevent_notifier;
8136-
81378112
err = mlxsw_sp_mp_hash_init(mlxsw_sp);
81388113
if (err)
81398114
goto err_mp_hash_init;
@@ -8142,6 +8117,22 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
81428117
if (err)
81438118
goto err_dscp_init;
81448119

8120+
router->inetaddr_nb.notifier_call = mlxsw_sp_inetaddr_event;
8121+
err = register_inetaddr_notifier(&router->inetaddr_nb);
8122+
if (err)
8123+
goto err_register_inetaddr_notifier;
8124+
8125+
router->inet6addr_nb.notifier_call = mlxsw_sp_inet6addr_event;
8126+
err = register_inet6addr_notifier(&router->inet6addr_nb);
8127+
if (err)
8128+
goto err_register_inet6addr_notifier;
8129+
8130+
mlxsw_sp->router->netevent_nb.notifier_call =
8131+
mlxsw_sp_router_netevent_event;
8132+
err = register_netevent_notifier(&mlxsw_sp->router->netevent_nb);
8133+
if (err)
8134+
goto err_register_netevent_notifier;
8135+
81458136
mlxsw_sp->router->fib_nb.notifier_call = mlxsw_sp_router_fib_event;
81468137
err = register_fib_notifier(mlxsw_sp_net(mlxsw_sp),
81478138
&mlxsw_sp->router->fib_nb,
@@ -8152,10 +8143,15 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
81528143
return 0;
81538144

81548145
err_register_fib_notifier:
8155-
err_dscp_init:
8156-
err_mp_hash_init:
81578146
unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
81588147
err_register_netevent_notifier:
8148+
unregister_inet6addr_notifier(&router->inet6addr_nb);
8149+
err_register_inet6addr_notifier:
8150+
unregister_inetaddr_notifier(&router->inetaddr_nb);
8151+
err_register_inetaddr_notifier:
8152+
mlxsw_core_flush_owq();
8153+
err_dscp_init:
8154+
err_mp_hash_init:
81598155
mlxsw_sp_neigh_fini(mlxsw_sp);
81608156
err_neigh_init:
81618157
mlxsw_sp_vrs_fini(mlxsw_sp);
@@ -8174,10 +8170,6 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
81748170
err_rifs_init:
81758171
__mlxsw_sp_router_fini(mlxsw_sp);
81768172
err_router_init:
8177-
unregister_inet6addr_notifier(&router->inet6addr_nb);
8178-
err_register_inet6addr_notifier:
8179-
unregister_inetaddr_notifier(&router->inetaddr_nb);
8180-
err_register_inetaddr_notifier:
81818173
mutex_destroy(&mlxsw_sp->router->lock);
81828174
kfree(mlxsw_sp->router);
81838175
return err;
@@ -8188,6 +8180,9 @@ void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
81888180
unregister_fib_notifier(mlxsw_sp_net(mlxsw_sp),
81898181
&mlxsw_sp->router->fib_nb);
81908182
unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
8183+
unregister_inet6addr_notifier(&mlxsw_sp->router->inet6addr_nb);
8184+
unregister_inetaddr_notifier(&mlxsw_sp->router->inetaddr_nb);
8185+
mlxsw_core_flush_owq();
81918186
mlxsw_sp_neigh_fini(mlxsw_sp);
81928187
mlxsw_sp_vrs_fini(mlxsw_sp);
81938188
mlxsw_sp_mr_fini(mlxsw_sp);
@@ -8197,8 +8192,6 @@ void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
81978192
mlxsw_sp_ipips_fini(mlxsw_sp);
81988193
mlxsw_sp_rifs_fini(mlxsw_sp);
81998194
__mlxsw_sp_router_fini(mlxsw_sp);
8200-
unregister_inet6addr_notifier(&mlxsw_sp->router->inet6addr_nb);
8201-
unregister_inetaddr_notifier(&mlxsw_sp->router->inetaddr_nb);
82028195
mutex_destroy(&mlxsw_sp->router->lock);
82038196
kfree(mlxsw_sp->router);
82048197
}

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,9 @@ mlxsw_sp_trap_policer_items_arr[] = {
328328
{
329329
.policer = MLXSW_SP_TRAP_POLICER(18, 1024, 128),
330330
},
331+
{
332+
.policer = MLXSW_SP_TRAP_POLICER(19, 1024, 512),
333+
},
331334
};
332335

333336
static const struct mlxsw_sp_trap_group_item mlxsw_sp_trap_group_items_arr[] = {
@@ -421,6 +424,11 @@ static const struct mlxsw_sp_trap_group_item mlxsw_sp_trap_group_items_arr[] = {
421424
.hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_IP2ME,
422425
.priority = 2,
423426
},
427+
{
428+
.group = DEVLINK_TRAP_GROUP_GENERIC(EXTERNAL_DELIVERY, 19),
429+
.hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_EXTERNAL_ROUTE,
430+
.priority = 1,
431+
},
424432
{
425433
.group = DEVLINK_TRAP_GROUP_GENERIC(IPV6, 15),
426434
.hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_IPV6,
@@ -882,11 +890,11 @@ static const struct mlxsw_sp_trap_item mlxsw_sp_trap_items_arr[] = {
882890
},
883891
},
884892
{
885-
.trap = MLXSW_SP_TRAP_CONTROL(EXTERNAL_ROUTE, LOCAL_DELIVERY,
893+
.trap = MLXSW_SP_TRAP_CONTROL(EXTERNAL_ROUTE, EXTERNAL_DELIVERY,
886894
TRAP),
887895
.listeners_arr = {
888-
MLXSW_SP_RXL_MARK(RTR_INGRESS0, IP2ME, TRAP_TO_CPU,
889-
false),
896+
MLXSW_SP_RXL_MARK(RTR_INGRESS0, EXTERNAL_ROUTE,
897+
TRAP_TO_CPU, false),
890898
},
891899
},
892900
{

include/net/devlink.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ enum devlink_trap_group_generic_id {
718718
DEVLINK_TRAP_GROUP_GENERIC_ID_PIM,
719719
DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB,
720720
DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY,
721+
DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY,
721722
DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6,
722723
DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT,
723724
DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL,
@@ -915,6 +916,8 @@ enum devlink_trap_group_generic_id {
915916
"uc_loopback"
916917
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_LOCAL_DELIVERY \
917918
"local_delivery"
919+
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_EXTERNAL_DELIVERY \
920+
"external_delivery"
918921
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_IPV6 \
919922
"ipv6"
920923
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_EVENT \

net/core/devlink.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8567,6 +8567,7 @@ static const struct devlink_trap_group devlink_trap_group_generic[] = {
85678567
DEVLINK_TRAP_GROUP(PIM),
85688568
DEVLINK_TRAP_GROUP(UC_LB),
85698569
DEVLINK_TRAP_GROUP(LOCAL_DELIVERY),
8570+
DEVLINK_TRAP_GROUP(EXTERNAL_DELIVERY),
85708571
DEVLINK_TRAP_GROUP(IPV6),
85718572
DEVLINK_TRAP_GROUP(PTP_EVENT),
85728573
DEVLINK_TRAP_GROUP(PTP_GENERAL),

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,6 @@ check_highest_speed_is_chosen()
252252
fi
253253

254254
local -a speeds_arr=($(common_speeds_get $h1 $h2 0 1))
255-
# Remove the first speed, h1 does not advertise this speed.
256-
unset speeds_arr[0]
257255

258256
max_speed=${speeds_arr[0]}
259257
for current in ${speeds_arr[@]}; do

0 commit comments

Comments
 (0)