Skip to content

Commit 109e2f5

Browse files
committed
Merge branch 'mlx5-fixes' into main
Tariq Toukan says: ==================== mlx5 fixes 2024-06-27 This patchset provides fixes from the team to the mlx5 core and EN drivers. The first 3 patches by Daniel replace a buggy cap field with a newly introduced one. Patch 4 by Chris de-couples ingress ACL creation from a specific flow, so it's invoked by other flows if needed. Patch 5 by Jianbo fixes a possible missing cleanup of QoS objects. Patches 6 and 7 by Leon fixes IPsec stats logic to better reflect the traffic. Series generated against: commit 02ea312 ("octeontx2-pf: Fix coverity and klockwork issues in octeon PF driver") V2: Fixed wrong cited SHA in patch 6. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents a6458ab + e562f2d commit 109e2f5

File tree

8 files changed

+103
-33
lines changed

8 files changed

+103
-33
lines changed

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

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,12 @@ static void mlx5e_xfrm_update_stats(struct xfrm_state *x)
989989
struct mlx5e_ipsec_sa_entry *sa_entry = to_ipsec_sa_entry(x);
990990
struct mlx5e_ipsec_rule *ipsec_rule = &sa_entry->ipsec_rule;
991991
struct net *net = dev_net(x->xso.dev);
992+
u64 trailer_packets = 0, trailer_bytes = 0;
993+
u64 replay_packets = 0, replay_bytes = 0;
994+
u64 auth_packets = 0, auth_bytes = 0;
995+
u64 success_packets, success_bytes;
992996
u64 packets, bytes, lastuse;
997+
size_t headers;
993998

994999
lockdep_assert(lockdep_is_held(&x->lock) ||
9951000
lockdep_is_held(&dev_net(x->xso.real_dev)->xfrm.xfrm_cfg_mutex) ||
@@ -999,26 +1004,43 @@ static void mlx5e_xfrm_update_stats(struct xfrm_state *x)
9991004
return;
10001005

10011006
if (sa_entry->attrs.dir == XFRM_DEV_OFFLOAD_IN) {
1002-
mlx5_fc_query_cached(ipsec_rule->auth.fc, &bytes, &packets, &lastuse);
1003-
x->stats.integrity_failed += packets;
1004-
XFRM_ADD_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR, packets);
1005-
1006-
mlx5_fc_query_cached(ipsec_rule->trailer.fc, &bytes, &packets, &lastuse);
1007-
XFRM_ADD_STATS(net, LINUX_MIB_XFRMINHDRERROR, packets);
1007+
mlx5_fc_query_cached(ipsec_rule->auth.fc, &auth_bytes,
1008+
&auth_packets, &lastuse);
1009+
x->stats.integrity_failed += auth_packets;
1010+
XFRM_ADD_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR, auth_packets);
1011+
1012+
mlx5_fc_query_cached(ipsec_rule->trailer.fc, &trailer_bytes,
1013+
&trailer_packets, &lastuse);
1014+
XFRM_ADD_STATS(net, LINUX_MIB_XFRMINHDRERROR, trailer_packets);
10081015
}
10091016

10101017
if (x->xso.type != XFRM_DEV_OFFLOAD_PACKET)
10111018
return;
10121019

1013-
mlx5_fc_query_cached(ipsec_rule->fc, &bytes, &packets, &lastuse);
1014-
x->curlft.packets += packets;
1015-
x->curlft.bytes += bytes;
1016-
10171020
if (sa_entry->attrs.dir == XFRM_DEV_OFFLOAD_IN) {
1018-
mlx5_fc_query_cached(ipsec_rule->replay.fc, &bytes, &packets, &lastuse);
1019-
x->stats.replay += packets;
1020-
XFRM_ADD_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR, packets);
1021+
mlx5_fc_query_cached(ipsec_rule->replay.fc, &replay_bytes,
1022+
&replay_packets, &lastuse);
1023+
x->stats.replay += replay_packets;
1024+
XFRM_ADD_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR, replay_packets);
10211025
}
1026+
1027+
mlx5_fc_query_cached(ipsec_rule->fc, &bytes, &packets, &lastuse);
1028+
success_packets = packets - auth_packets - trailer_packets - replay_packets;
1029+
x->curlft.packets += success_packets;
1030+
/* NIC counts all bytes passed through flow steering and doesn't have
1031+
* an ability to count payload data size which is needed for SA.
1032+
*
1033+
* To overcome HW limitestion, let's approximate the payload size
1034+
* by removing always available headers.
1035+
*/
1036+
headers = sizeof(struct ethhdr);
1037+
if (sa_entry->attrs.family == AF_INET)
1038+
headers += sizeof(struct iphdr);
1039+
else
1040+
headers += sizeof(struct ipv6hdr);
1041+
1042+
success_bytes = bytes - auth_bytes - trailer_bytes - replay_bytes;
1043+
x->curlft.bytes += success_bytes - headers * success_packets;
10221044
}
10231045

10241046
static int mlx5e_xfrm_validate_policy(struct mlx5_core_dev *mdev,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5868,6 +5868,11 @@ void mlx5e_priv_cleanup(struct mlx5e_priv *priv)
58685868
kfree(priv->htb_qos_sq_stats[i]);
58695869
kvfree(priv->htb_qos_sq_stats);
58705870

5871+
if (priv->mqprio_rl) {
5872+
mlx5e_mqprio_rl_cleanup(priv->mqprio_rl);
5873+
mlx5e_mqprio_rl_free(priv->mqprio_rl);
5874+
}
5875+
58715876
memset(priv, 0, sizeof(*priv));
58725877
}
58735878

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,9 +1197,7 @@ static int get_num_eqs(struct mlx5_core_dev *dev)
11971197
if (!mlx5_core_is_eth_enabled(dev) && mlx5_eth_supported(dev))
11981198
return 1;
11991199

1200-
max_dev_eqs = MLX5_CAP_GEN(dev, max_num_eqs) ?
1201-
MLX5_CAP_GEN(dev, max_num_eqs) :
1202-
1 << MLX5_CAP_GEN(dev, log_max_eq);
1200+
max_dev_eqs = mlx5_max_eq_cap_get(dev);
12031201

12041202
num_eqs = min_t(int, mlx5_irq_table_get_num_comp(eq_table->irq_table),
12051203
max_dev_eqs - MLX5_MAX_ASYNC_EQS);

drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_ofld.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
#include "helper.h"
77
#include "ofld.h"
88

9+
static int
10+
acl_ingress_ofld_setup(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
11+
912
static bool
1013
esw_acl_ingress_prio_tag_enabled(struct mlx5_eswitch *esw,
1114
const struct mlx5_vport *vport)
@@ -123,18 +126,31 @@ static int esw_acl_ingress_src_port_drop_create(struct mlx5_eswitch *esw,
123126
{
124127
struct mlx5_flow_act flow_act = {};
125128
struct mlx5_flow_handle *flow_rule;
129+
bool created = false;
126130
int err = 0;
127131

132+
if (!vport->ingress.acl) {
133+
err = acl_ingress_ofld_setup(esw, vport);
134+
if (err)
135+
return err;
136+
created = true;
137+
}
138+
128139
flow_act.action = MLX5_FLOW_CONTEXT_ACTION_DROP;
129140
flow_act.fg = vport->ingress.offloads.drop_grp;
130141
flow_rule = mlx5_add_flow_rules(vport->ingress.acl, NULL, &flow_act, NULL, 0);
131142
if (IS_ERR(flow_rule)) {
132143
err = PTR_ERR(flow_rule);
133-
goto out;
144+
goto err_out;
134145
}
135146

136147
vport->ingress.offloads.drop_rule = flow_rule;
137-
out:
148+
149+
return 0;
150+
err_out:
151+
/* Only destroy ingress acl created in this function. */
152+
if (created)
153+
esw_acl_ingress_ofld_cleanup(esw, vport);
138154
return err;
139155
}
140156

@@ -299,16 +315,12 @@ static void esw_acl_ingress_ofld_groups_destroy(struct mlx5_vport *vport)
299315
}
300316
}
301317

302-
int esw_acl_ingress_ofld_setup(struct mlx5_eswitch *esw,
303-
struct mlx5_vport *vport)
318+
static int
319+
acl_ingress_ofld_setup(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
304320
{
305321
int num_ftes = 0;
306322
int err;
307323

308-
if (!mlx5_eswitch_vport_match_metadata_enabled(esw) &&
309-
!esw_acl_ingress_prio_tag_enabled(esw, vport))
310-
return 0;
311-
312324
esw_acl_ingress_allow_rule_destroy(vport);
313325

314326
if (mlx5_eswitch_vport_match_metadata_enabled(esw))
@@ -347,6 +359,15 @@ int esw_acl_ingress_ofld_setup(struct mlx5_eswitch *esw,
347359
return err;
348360
}
349361

362+
int esw_acl_ingress_ofld_setup(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
363+
{
364+
if (!mlx5_eswitch_vport_match_metadata_enabled(esw) &&
365+
!esw_acl_ingress_prio_tag_enabled(esw, vport))
366+
return 0;
367+
368+
return acl_ingress_ofld_setup(esw, vport);
369+
}
370+
350371
void esw_acl_ingress_ofld_cleanup(struct mlx5_eswitch *esw,
351372
struct mlx5_vport *vport)
352373
{

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4600,20 +4600,26 @@ mlx5_devlink_port_fn_max_io_eqs_get(struct devlink_port *port, u32 *max_io_eqs,
46004600
return -EOPNOTSUPP;
46014601
}
46024602

4603+
if (!MLX5_CAP_GEN_2(esw->dev, max_num_eqs_24b)) {
4604+
NL_SET_ERR_MSG_MOD(extack,
4605+
"Device doesn't support getting the max number of EQs");
4606+
return -EOPNOTSUPP;
4607+
}
4608+
46034609
query_ctx = kzalloc(query_out_sz, GFP_KERNEL);
46044610
if (!query_ctx)
46054611
return -ENOMEM;
46064612

46074613
mutex_lock(&esw->state_lock);
46084614
err = mlx5_vport_get_other_func_cap(esw->dev, vport_num, query_ctx,
4609-
MLX5_CAP_GENERAL);
4615+
MLX5_CAP_GENERAL_2);
46104616
if (err) {
46114617
NL_SET_ERR_MSG_MOD(extack, "Failed getting HCA caps");
46124618
goto out;
46134619
}
46144620

46154621
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
4616-
max_eqs = MLX5_GET(cmd_hca_cap, hca_caps, max_num_eqs);
4622+
max_eqs = MLX5_GET(cmd_hca_cap_2, hca_caps, max_num_eqs_24b);
46174623
if (max_eqs < MLX5_ESW_MAX_CTRL_EQS)
46184624
*max_io_eqs = 0;
46194625
else
@@ -4644,6 +4650,12 @@ mlx5_devlink_port_fn_max_io_eqs_set(struct devlink_port *port, u32 max_io_eqs,
46444650
return -EOPNOTSUPP;
46454651
}
46464652

4653+
if (!MLX5_CAP_GEN_2(esw->dev, max_num_eqs_24b)) {
4654+
NL_SET_ERR_MSG_MOD(extack,
4655+
"Device doesn't support changing the max number of EQs");
4656+
return -EOPNOTSUPP;
4657+
}
4658+
46474659
if (check_add_overflow(max_io_eqs, MLX5_ESW_MAX_CTRL_EQS, &max_eqs)) {
46484660
NL_SET_ERR_MSG_MOD(extack, "Supplied value out of range");
46494661
return -EINVAL;
@@ -4655,17 +4667,17 @@ mlx5_devlink_port_fn_max_io_eqs_set(struct devlink_port *port, u32 max_io_eqs,
46554667

46564668
mutex_lock(&esw->state_lock);
46574669
err = mlx5_vport_get_other_func_cap(esw->dev, vport_num, query_ctx,
4658-
MLX5_CAP_GENERAL);
4670+
MLX5_CAP_GENERAL_2);
46594671
if (err) {
46604672
NL_SET_ERR_MSG_MOD(extack, "Failed getting HCA caps");
46614673
goto out;
46624674
}
46634675

46644676
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
4665-
MLX5_SET(cmd_hca_cap, hca_caps, max_num_eqs, max_eqs);
4677+
MLX5_SET(cmd_hca_cap_2, hca_caps, max_num_eqs_24b, max_eqs);
46664678

46674679
err = mlx5_vport_set_other_func_cap(esw->dev, hca_caps, vport_num,
4668-
MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE);
4680+
MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE2);
46694681
if (err)
46704682
NL_SET_ERR_MSG_MOD(extack, "Failed setting HCA caps");
46714683

drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,4 +383,14 @@ static inline int mlx5_vport_to_func_id(const struct mlx5_core_dev *dev, u16 vpo
383383
: vport;
384384
}
385385

386+
static inline int mlx5_max_eq_cap_get(const struct mlx5_core_dev *dev)
387+
{
388+
if (MLX5_CAP_GEN_2(dev, max_num_eqs_24b))
389+
return MLX5_CAP_GEN_2(dev, max_num_eqs_24b);
390+
391+
if (MLX5_CAP_GEN(dev, max_num_eqs))
392+
return MLX5_CAP_GEN(dev, max_num_eqs);
393+
394+
return 1 << MLX5_CAP_GEN(dev, log_max_eq);
395+
}
386396
#endif /* __MLX5_CORE_H__ */

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -711,9 +711,7 @@ int mlx5_irq_table_get_num_comp(struct mlx5_irq_table *table)
711711

712712
int mlx5_irq_table_create(struct mlx5_core_dev *dev)
713713
{
714-
int num_eqs = MLX5_CAP_GEN(dev, max_num_eqs) ?
715-
MLX5_CAP_GEN(dev, max_num_eqs) :
716-
1 << MLX5_CAP_GEN(dev, log_max_eq);
714+
int num_eqs = mlx5_max_eq_cap_get(dev);
717715
int total_vec;
718716
int pcif_vec;
719717
int req_vec;

include/linux/mlx5/mlx5_ifc.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2029,7 +2029,11 @@ struct mlx5_ifc_cmd_hca_cap_2_bits {
20292029
u8 pcc_ifa2[0x1];
20302030
u8 reserved_at_3f1[0xf];
20312031

2032-
u8 reserved_at_400[0x400];
2032+
u8 reserved_at_400[0x40];
2033+
2034+
u8 reserved_at_440[0x8];
2035+
u8 max_num_eqs_24b[0x18];
2036+
u8 reserved_at_460[0x3a0];
20332037
};
20342038

20352039
enum mlx5_ifc_flow_destination_type {

0 commit comments

Comments
 (0)