Skip to content

Commit 4a08226

Browse files
committed
Merge tag 'mlx5-fixes-2023-07-26' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== mlx5 fixes 2023-07-26 This series provides bug fixes to mlx5 driver. * tag 'mlx5-fixes-2023-07-26' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux: net/mlx5: Unregister devlink params in case interface is down net/mlx5: DR, Fix peer domain namespace setting net/mlx5: fs_chains: Fix ft prio if ignore_flow_level is not supported net/mlx5e: kTLS, Fix protection domain in use syndrome when devlink reload net/mlx5: Bridge, set debugfs access right to root-only net/mlx5e: xsk: Fix crash on regular rq reactivation net/mlx5e: xsk: Fix invalid buffer access for legacy rq net/mlx5e: Move representor neigh cleanup to profile cleanup_tx net/mlx5e: Fix crash moving to switchdev mode when ntuple offload is set net/mlx5e: Don't hold encap tbl lock if there is no encap action net/mlx5: Honor user input for migratable port fn attr net/mlx5e: fix return value check in mlx5e_ipsec_remove_trailer() net/mlx5: fix potential memory leak in mlx5e_init_rep_rx net/mlx5: DR, fix memory leak in mlx5dr_cmd_create_reformat_ctx net/mlx5e: fix double free in macsec_fs_tx_create_crypto_table_groups ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents dadc5b8 + 53d737d commit 4a08226

26 files changed

+137
-73
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,9 +1030,6 @@ int mlx5e_tc_tun_encap_dests_set(struct mlx5e_priv *priv,
10301030
int out_index;
10311031
int err = 0;
10321032

1033-
if (!mlx5e_is_eswitch_flow(flow))
1034-
return 0;
1035-
10361033
parse_attr = attr->parse_attr;
10371034
esw_attr = attr->esw_attr;
10381035
*vf_tun = false;

drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,8 +323,11 @@ struct sk_buff *mlx5e_xsk_skb_from_cqe_linear(struct mlx5e_rq *rq,
323323
net_prefetch(mxbuf->xdp.data);
324324

325325
prog = rcu_dereference(rq->xdp_prog);
326-
if (likely(prog && mlx5e_xdp_handle(rq, prog, mxbuf)))
326+
if (likely(prog && mlx5e_xdp_handle(rq, prog, mxbuf))) {
327+
if (likely(__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)))
328+
wi->flags |= BIT(MLX5E_WQE_FRAG_SKIP_RELEASE);
327329
return NULL; /* page/packet was consumed by XDP */
330+
}
328331

329332
/* XDP_PASS: copy the data from the UMEM to a new SKB. The frame reuse
330333
* will be handled by mlx5e_free_rx_wqe.

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ static int mlx5e_ipsec_remove_trailer(struct sk_buff *skb, struct xfrm_state *x)
5858

5959
trailer_len = alen + plen + 2;
6060

61-
pskb_trim(skb, skb->len - trailer_len);
61+
ret = pskb_trim(skb, skb->len - trailer_len);
62+
if (unlikely(ret))
63+
return ret;
6264
if (skb->protocol == htons(ETH_P_IP)) {
6365
ipv4hdr->tot_len = htons(ntohs(ipv4hdr->tot_len) - trailer_len);
6466
ip_send_check(ipv4hdr);

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ static void mlx5e_tls_debugfs_init(struct mlx5e_tls *tls,
188188

189189
int mlx5e_ktls_init(struct mlx5e_priv *priv)
190190
{
191-
struct mlx5_crypto_dek_pool *dek_pool;
192191
struct mlx5e_tls *tls;
193192

194193
if (!mlx5e_is_ktls_device(priv->mdev))
@@ -199,12 +198,6 @@ int mlx5e_ktls_init(struct mlx5e_priv *priv)
199198
return -ENOMEM;
200199
tls->mdev = priv->mdev;
201200

202-
dek_pool = mlx5_crypto_dek_pool_create(priv->mdev, MLX5_ACCEL_OBJ_TLS_KEY);
203-
if (IS_ERR(dek_pool)) {
204-
kfree(tls);
205-
return PTR_ERR(dek_pool);
206-
}
207-
tls->dek_pool = dek_pool;
208201
priv->tls = tls;
209202

210203
mlx5e_tls_debugfs_init(tls, priv->dfs_root);
@@ -222,7 +215,6 @@ void mlx5e_ktls_cleanup(struct mlx5e_priv *priv)
222215
debugfs_remove_recursive(tls->debugfs.dfs);
223216
tls->debugfs.dfs = NULL;
224217

225-
mlx5_crypto_dek_pool_destroy(tls->dek_pool);
226218
kfree(priv->tls);
227219
priv->tls = NULL;
228220
}

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -908,28 +908,51 @@ static void mlx5e_tls_tx_debugfs_init(struct mlx5e_tls *tls,
908908

909909
int mlx5e_ktls_init_tx(struct mlx5e_priv *priv)
910910
{
911+
struct mlx5_crypto_dek_pool *dek_pool;
911912
struct mlx5e_tls *tls = priv->tls;
913+
int err;
914+
915+
if (!mlx5e_is_ktls_device(priv->mdev))
916+
return 0;
917+
918+
/* DEK pool could be used by either or both of TX and RX. But we have to
919+
* put the creation here to avoid syndrome when doing devlink reload.
920+
*/
921+
dek_pool = mlx5_crypto_dek_pool_create(priv->mdev, MLX5_ACCEL_OBJ_TLS_KEY);
922+
if (IS_ERR(dek_pool))
923+
return PTR_ERR(dek_pool);
924+
tls->dek_pool = dek_pool;
912925

913926
if (!mlx5e_is_ktls_tx(priv->mdev))
914927
return 0;
915928

916929
priv->tls->tx_pool = mlx5e_tls_tx_pool_init(priv->mdev, &priv->tls->sw_stats);
917-
if (!priv->tls->tx_pool)
918-
return -ENOMEM;
930+
if (!priv->tls->tx_pool) {
931+
err = -ENOMEM;
932+
goto err_tx_pool_init;
933+
}
919934

920935
mlx5e_tls_tx_debugfs_init(tls, tls->debugfs.dfs);
921936

922937
return 0;
938+
939+
err_tx_pool_init:
940+
mlx5_crypto_dek_pool_destroy(dek_pool);
941+
return err;
923942
}
924943

925944
void mlx5e_ktls_cleanup_tx(struct mlx5e_priv *priv)
926945
{
927946
if (!mlx5e_is_ktls_tx(priv->mdev))
928-
return;
947+
goto dek_pool_destroy;
929948

930949
debugfs_remove_recursive(priv->tls->debugfs.dfs_tx);
931950
priv->tls->debugfs.dfs_tx = NULL;
932951

933952
mlx5e_tls_tx_pool_cleanup(priv->tls->tx_pool);
934953
priv->tls->tx_pool = NULL;
954+
955+
dek_pool_destroy:
956+
if (mlx5e_is_ktls_device(priv->mdev))
957+
mlx5_crypto_dek_pool_destroy(priv->tls->dek_pool);
935958
}

drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec_fs.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ static int macsec_fs_tx_create_crypto_table_groups(struct mlx5e_flow_table *ft)
161161

162162
if (!in) {
163163
kfree(ft->g);
164+
ft->g = NULL;
164165
return -ENOMEM;
165166
}
166167

drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,16 @@ static void arfs_del_rules(struct mlx5e_flow_steering *fs);
135135

136136
int mlx5e_arfs_disable(struct mlx5e_flow_steering *fs)
137137
{
138+
/* Moving to switchdev mode, fs->arfs is freed by mlx5e_nic_profile
139+
* cleanup_rx callback and it is not recreated when
140+
* mlx5e_uplink_rep_profile is loaded as mlx5e_create_flow_steering()
141+
* is not called by the uplink_rep profile init_rx callback. Thus, if
142+
* ntuple is set, moving to switchdev flow will enter this function
143+
* with fs->arfs nullified.
144+
*/
145+
if (!mlx5e_fs_get_arfs(fs))
146+
return 0;
147+
138148
arfs_del_rules(fs);
139149

140150
return arfs_disable(fs);

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,23 @@ static int mlx5e_modify_rq_state(struct mlx5e_rq *rq, int curr_state, int next_s
10361036
return err;
10371037
}
10381038

1039-
static int mlx5e_rq_to_ready(struct mlx5e_rq *rq, int curr_state)
1039+
static void mlx5e_flush_rq_cq(struct mlx5e_rq *rq)
1040+
{
1041+
struct mlx5_cqwq *cqwq = &rq->cq.wq;
1042+
struct mlx5_cqe64 *cqe;
1043+
1044+
if (test_bit(MLX5E_RQ_STATE_MINI_CQE_ENHANCED, &rq->state)) {
1045+
while ((cqe = mlx5_cqwq_get_cqe_enahnced_comp(cqwq)))
1046+
mlx5_cqwq_pop(cqwq);
1047+
} else {
1048+
while ((cqe = mlx5_cqwq_get_cqe(cqwq)))
1049+
mlx5_cqwq_pop(cqwq);
1050+
}
1051+
1052+
mlx5_cqwq_update_db_record(cqwq);
1053+
}
1054+
1055+
int mlx5e_flush_rq(struct mlx5e_rq *rq, int curr_state)
10401056
{
10411057
struct net_device *dev = rq->netdev;
10421058
int err;
@@ -1046,6 +1062,10 @@ static int mlx5e_rq_to_ready(struct mlx5e_rq *rq, int curr_state)
10461062
netdev_err(dev, "Failed to move rq 0x%x to reset\n", rq->rqn);
10471063
return err;
10481064
}
1065+
1066+
mlx5e_free_rx_descs(rq);
1067+
mlx5e_flush_rq_cq(rq);
1068+
10491069
err = mlx5e_modify_rq_state(rq, MLX5_RQC_STATE_RST, MLX5_RQC_STATE_RDY);
10501070
if (err) {
10511071
netdev_err(dev, "Failed to move rq 0x%x to ready\n", rq->rqn);
@@ -1055,13 +1075,6 @@ static int mlx5e_rq_to_ready(struct mlx5e_rq *rq, int curr_state)
10551075
return 0;
10561076
}
10571077

1058-
int mlx5e_flush_rq(struct mlx5e_rq *rq, int curr_state)
1059-
{
1060-
mlx5e_free_rx_descs(rq);
1061-
1062-
return mlx5e_rq_to_ready(rq, curr_state);
1063-
}
1064-
10651078
static int mlx5e_modify_rq_vsd(struct mlx5e_rq *rq, bool vsd)
10661079
{
10671080
struct mlx5_core_dev *mdev = rq->mdev;

drivers/net/ethernet/mellanox/mlx5/core/en_rep.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,7 +1012,7 @@ static int mlx5e_init_rep_rx(struct mlx5e_priv *priv)
10121012
err = mlx5e_open_drop_rq(priv, &priv->drop_rq);
10131013
if (err) {
10141014
mlx5_core_err(mdev, "open drop rq failed, %d\n", err);
1015-
return err;
1015+
goto err_rx_res_free;
10161016
}
10171017

10181018
err = mlx5e_rx_res_init(priv->rx_res, priv->mdev, 0,
@@ -1046,6 +1046,7 @@ static int mlx5e_init_rep_rx(struct mlx5e_priv *priv)
10461046
mlx5e_rx_res_destroy(priv->rx_res);
10471047
err_close_drop_rq:
10481048
mlx5e_close_drop_rq(&priv->drop_rq);
1049+
err_rx_res_free:
10491050
mlx5e_rx_res_free(priv->rx_res);
10501051
priv->rx_res = NULL;
10511052
err_free_fs:
@@ -1159,6 +1160,10 @@ static int mlx5e_init_rep_tx(struct mlx5e_priv *priv)
11591160
return err;
11601161
}
11611162

1163+
err = mlx5e_rep_neigh_init(rpriv);
1164+
if (err)
1165+
goto err_neigh_init;
1166+
11621167
if (rpriv->rep->vport == MLX5_VPORT_UPLINK) {
11631168
err = mlx5e_init_uplink_rep_tx(rpriv);
11641169
if (err)
@@ -1175,6 +1180,8 @@ static int mlx5e_init_rep_tx(struct mlx5e_priv *priv)
11751180
if (rpriv->rep->vport == MLX5_VPORT_UPLINK)
11761181
mlx5e_cleanup_uplink_rep_tx(rpriv);
11771182
err_init_tx:
1183+
mlx5e_rep_neigh_cleanup(rpriv);
1184+
err_neigh_init:
11781185
mlx5e_destroy_tises(priv);
11791186
return err;
11801187
}
@@ -1188,22 +1195,17 @@ static void mlx5e_cleanup_rep_tx(struct mlx5e_priv *priv)
11881195
if (rpriv->rep->vport == MLX5_VPORT_UPLINK)
11891196
mlx5e_cleanup_uplink_rep_tx(rpriv);
11901197

1198+
mlx5e_rep_neigh_cleanup(rpriv);
11911199
mlx5e_destroy_tises(priv);
11921200
}
11931201

11941202
static void mlx5e_rep_enable(struct mlx5e_priv *priv)
11951203
{
1196-
struct mlx5e_rep_priv *rpriv = priv->ppriv;
1197-
11981204
mlx5e_set_netdev_mtu_boundaries(priv);
1199-
mlx5e_rep_neigh_init(rpriv);
12001205
}
12011206

12021207
static void mlx5e_rep_disable(struct mlx5e_priv *priv)
12031208
{
1204-
struct mlx5e_rep_priv *rpriv = priv->ppriv;
1205-
1206-
mlx5e_rep_neigh_cleanup(rpriv);
12071209
}
12081210

12091211
static int mlx5e_update_rep_rx(struct mlx5e_priv *priv)
@@ -1253,7 +1255,6 @@ static int uplink_rep_async_event(struct notifier_block *nb, unsigned long event
12531255

12541256
static void mlx5e_uplink_rep_enable(struct mlx5e_priv *priv)
12551257
{
1256-
struct mlx5e_rep_priv *rpriv = priv->ppriv;
12571258
struct net_device *netdev = priv->netdev;
12581259
struct mlx5_core_dev *mdev = priv->mdev;
12591260
u16 max_mtu;
@@ -1275,7 +1276,6 @@ static void mlx5e_uplink_rep_enable(struct mlx5e_priv *priv)
12751276
mlx5_notifier_register(mdev, &priv->events_nb);
12761277
mlx5e_dcbnl_initialize(priv);
12771278
mlx5e_dcbnl_init_app(priv);
1278-
mlx5e_rep_neigh_init(rpriv);
12791279
mlx5e_rep_bridge_init(priv);
12801280

12811281
netdev->wanted_features |= NETIF_F_HW_TC;
@@ -1290,7 +1290,6 @@ static void mlx5e_uplink_rep_enable(struct mlx5e_priv *priv)
12901290

12911291
static void mlx5e_uplink_rep_disable(struct mlx5e_priv *priv)
12921292
{
1293-
struct mlx5e_rep_priv *rpriv = priv->ppriv;
12941293
struct mlx5_core_dev *mdev = priv->mdev;
12951294

12961295
rtnl_lock();
@@ -1300,7 +1299,6 @@ static void mlx5e_uplink_rep_disable(struct mlx5e_priv *priv)
13001299
rtnl_unlock();
13011300

13021301
mlx5e_rep_bridge_cleanup(priv);
1303-
mlx5e_rep_neigh_cleanup(rpriv);
13041302
mlx5e_dcbnl_delete_app(priv);
13051303
mlx5_notifier_unregister(mdev, &priv->events_nb);
13061304
mlx5e_rep_tc_disable(priv);

drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1725,6 +1725,19 @@ verify_attr_actions(u32 actions, struct netlink_ext_ack *extack)
17251725
return 0;
17261726
}
17271727

1728+
static bool
1729+
has_encap_dests(struct mlx5_flow_attr *attr)
1730+
{
1731+
struct mlx5_esw_flow_attr *esw_attr = attr->esw_attr;
1732+
int out_index;
1733+
1734+
for (out_index = 0; out_index < MLX5_MAX_FLOW_FWD_VPORTS; out_index++)
1735+
if (esw_attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP)
1736+
return true;
1737+
1738+
return false;
1739+
}
1740+
17281741
static int
17291742
post_process_attr(struct mlx5e_tc_flow *flow,
17301743
struct mlx5_flow_attr *attr,
@@ -1737,9 +1750,11 @@ post_process_attr(struct mlx5e_tc_flow *flow,
17371750
if (err)
17381751
goto err_out;
17391752

1740-
err = mlx5e_tc_tun_encap_dests_set(flow->priv, flow, attr, extack, &vf_tun);
1741-
if (err)
1742-
goto err_out;
1753+
if (mlx5e_is_eswitch_flow(flow) && has_encap_dests(attr)) {
1754+
err = mlx5e_tc_tun_encap_dests_set(flow->priv, flow, attr, extack, &vf_tun);
1755+
if (err)
1756+
goto err_out;
1757+
}
17431758

17441759
if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
17451760
err = mlx5e_tc_attach_mod_hdr(flow->priv, flow, attr);

0 commit comments

Comments
 (0)