Skip to content

Commit 1273919

Browse files
committed
Merge branch 'rate-management-on-traffic-classes-misc'
Tariq Toukan says: ==================== mlx5 misc Patches 1-3 by William reduce the memory consumption for representors to achieve better scalability. Patches 4-5 by Akiva expose ICM memory consumption per function. Patches 6-8 expose helpful information on RSS resources in devlink RX reporter diagnose. Patches 9-10 are simple enhancements by Alex Lazar. ==================== Link: https://patch.msgid.link/20250209101716.112774-1-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 4e41231 + 1a93048 commit 1273919

File tree

20 files changed

+275
-109
lines changed

20 files changed

+275
-109
lines changed

Documentation/networking/devlink/mlx5.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ Description of the vnic counters:
280280
number of packets handled by the VNIC experiencing unexpected steering
281281
failure (at any point in steering flow owned by the VNIC, including the FDB
282282
for the eswitch owner).
283+
- icm_consumption
284+
amount of Interconnect Host Memory (ICM) consumed by the vnic in
285+
granularity of 4KB. ICM is host memory allocated by SW upon HCA request
286+
and is used for storing data structures that control HCA operation.
283287

284288
User commands examples:
285289

drivers/net/ethernet/mellanox/mlx5/core/diag/reporter_vnic.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,50 @@ struct mlx5_vnic_diag_stats {
1313
__be64 query_vnic_env_out[MLX5_ST_SZ_QW(query_vnic_env_out)];
1414
};
1515

16+
static void mlx5_reporter_vnic_diagnose_counter_icm(struct mlx5_core_dev *dev,
17+
struct devlink_fmsg *fmsg,
18+
u16 vport_num, bool other_vport)
19+
{
20+
u32 out_icm_reg[MLX5_ST_SZ_DW(vhca_icm_ctrl_reg)] = {};
21+
u32 in_icm_reg[MLX5_ST_SZ_DW(vhca_icm_ctrl_reg)] = {};
22+
u32 out_reg[MLX5_ST_SZ_DW(nic_cap_reg)] = {};
23+
u32 in_reg[MLX5_ST_SZ_DW(nic_cap_reg)] = {};
24+
u32 cur_alloc_icm;
25+
int vhca_icm_ctrl;
26+
u16 vhca_id;
27+
int err;
28+
29+
err = mlx5_core_access_reg(dev, in_reg, sizeof(in_reg), out_reg,
30+
sizeof(out_reg), MLX5_REG_NIC_CAP, 0, 0);
31+
if (err) {
32+
mlx5_core_warn(dev, "Reading nic_cap_reg failed. err = %d\n", err);
33+
return;
34+
}
35+
vhca_icm_ctrl = MLX5_GET(nic_cap_reg, out_reg, vhca_icm_ctrl);
36+
if (!vhca_icm_ctrl)
37+
return;
38+
39+
MLX5_SET(vhca_icm_ctrl_reg, in_icm_reg, vhca_id_valid, other_vport);
40+
if (other_vport) {
41+
err = mlx5_vport_get_vhca_id(dev, vport_num, &vhca_id);
42+
if (err) {
43+
mlx5_core_warn(dev, "vport to vhca_id failed. vport_num = %d, err = %d\n",
44+
vport_num, err);
45+
return;
46+
}
47+
MLX5_SET(vhca_icm_ctrl_reg, in_icm_reg, vhca_id, vhca_id);
48+
}
49+
err = mlx5_core_access_reg(dev, in_icm_reg, sizeof(in_icm_reg),
50+
out_icm_reg, sizeof(out_icm_reg),
51+
MLX5_REG_VHCA_ICM_CTRL, 0, 0);
52+
if (err) {
53+
mlx5_core_warn(dev, "Reading vhca_icm_ctrl failed. err = %d\n", err);
54+
return;
55+
}
56+
cur_alloc_icm = MLX5_GET(vhca_icm_ctrl_reg, out_icm_reg, cur_alloc_icm);
57+
devlink_fmsg_u32_pair_put(fmsg, "icm_consumption", cur_alloc_icm);
58+
}
59+
1660
void mlx5_reporter_vnic_diagnose_counters(struct mlx5_core_dev *dev,
1761
struct devlink_fmsg *fmsg,
1862
u16 vport_num, bool other_vport)
@@ -59,6 +103,8 @@ void mlx5_reporter_vnic_diagnose_counters(struct mlx5_core_dev *dev,
59103
devlink_fmsg_u64_pair_put(fmsg, "handled_pkt_steering_fail",
60104
VNIC_ENV_GET64(&vnic, handled_pkt_steering_fail));
61105
}
106+
if (MLX5_CAP_GEN(dev, nic_cap_reg))
107+
mlx5_reporter_vnic_diagnose_counter_icm(dev, fmsg, vport_num, other_vport);
62108

63109
devlink_fmsg_obj_nest_end(fmsg);
64110
devlink_fmsg_pair_nest_end(fmsg);

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@ struct page_pool;
9595
#define MLX5_MPWRQ_DEF_LOG_STRIDE_SZ(mdev) \
9696
MLX5_MPWRQ_LOG_STRIDE_SZ(mdev, order_base_2(MLX5E_RX_MAX_HEAD))
9797

98-
#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18
99-
10098
/* Keep in sync with mlx5e_mpwrq_log_wqe_sz.
10199
* These are theoretical maximums, which can be further restricted by
102100
* capabilities. These values are used for static resource allocations and
@@ -386,7 +384,6 @@ enum {
386384
MLX5E_SQ_STATE_VLAN_NEED_L2_INLINE,
387385
MLX5E_SQ_STATE_PENDING_XSK_TX,
388386
MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC,
389-
MLX5E_SQ_STATE_XDP_MULTIBUF,
390387
MLX5E_NUM_SQ_STATES, /* Must be kept last */
391388
};
392389

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
#include <net/page_pool/types.h>
1111
#include <net/xdp_sock_drv.h>
1212

13+
#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18
14+
#define MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ 17
15+
1316
static u8 mlx5e_mpwrq_min_page_shift(struct mlx5_core_dev *mdev)
1417
{
1518
u8 min_page_shift = MLX5_CAP_GEN_2(mdev, log_min_mkey_entity_size);
@@ -103,18 +106,22 @@ u8 mlx5e_mpwrq_log_wqe_sz(struct mlx5_core_dev *mdev, u8 page_shift,
103106
enum mlx5e_mpwrq_umr_mode umr_mode)
104107
{
105108
u8 umr_entry_size = mlx5e_mpwrq_umr_entry_size(umr_mode);
106-
u8 max_pages_per_wqe, max_log_mpwqe_size;
109+
u8 max_pages_per_wqe, max_log_wqe_size_calc;
110+
u8 max_log_wqe_size_cap;
107111
u16 max_wqe_size;
108112

109113
/* Keep in sync with MLX5_MPWRQ_MAX_PAGES_PER_WQE. */
110114
max_wqe_size = mlx5e_get_max_sq_aligned_wqebbs(mdev) * MLX5_SEND_WQE_BB;
111115
max_pages_per_wqe = ALIGN_DOWN(max_wqe_size - sizeof(struct mlx5e_umr_wqe),
112116
MLX5_UMR_FLEX_ALIGNMENT) / umr_entry_size;
113-
max_log_mpwqe_size = ilog2(max_pages_per_wqe) + page_shift;
117+
max_log_wqe_size_calc = ilog2(max_pages_per_wqe) + page_shift;
118+
119+
WARN_ON_ONCE(max_log_wqe_size_calc < MLX5E_ORDER2_MAX_PACKET_MTU);
114120

115-
WARN_ON_ONCE(max_log_mpwqe_size < MLX5E_ORDER2_MAX_PACKET_MTU);
121+
max_log_wqe_size_cap = mlx5_core_is_ecpf(mdev) ?
122+
MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ : MLX5_MPWRQ_MAX_LOG_WQE_SZ;
116123

117-
return min_t(u8, max_log_mpwqe_size, MLX5_MPWRQ_MAX_LOG_WQE_SZ);
124+
return min_t(u8, max_log_wqe_size_calc, max_log_wqe_size_cap);
118125
}
119126

120127
u8 mlx5e_mpwrq_pages_per_wqe(struct mlx5_core_dev *mdev, u8 page_shift,
@@ -1240,7 +1247,6 @@ void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
12401247
mlx5e_build_sq_param_common(mdev, param);
12411248
MLX5_SET(wq, wq, log_wq_sz, params->log_sq_size);
12421249
param->is_mpw = MLX5E_GET_PFLAG(params, MLX5E_PFLAG_XDP_TX_MPWQE);
1243-
param->is_xdp_mb = !mlx5e_rx_is_linear_skb(mdev, params, xsk);
12441250
mlx5e_build_tx_cq_param(mdev, params, &param->cqp);
12451251
}
12461252

drivers/net/ethernet/mellanox/mlx5/core/en/params.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ struct mlx5e_sq_param {
3333
struct mlx5_wq_param wq;
3434
bool is_mpw;
3535
bool is_tls;
36-
bool is_xdp_mb;
3736
u16 stop_room;
3837
};
3938

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

Lines changed: 107 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -317,10 +317,8 @@ mlx5e_rx_reporter_diagnose_common_ptp_config(struct mlx5e_priv *priv, struct mlx
317317
}
318318

319319
static void
320-
mlx5e_rx_reporter_diagnose_common_config(struct devlink_health_reporter *reporter,
321-
struct devlink_fmsg *fmsg)
320+
mlx5e_rx_reporter_diagnose_common_config(struct mlx5e_priv *priv, struct devlink_fmsg *fmsg)
322321
{
323-
struct mlx5e_priv *priv = devlink_health_reporter_priv(reporter);
324322
struct mlx5e_rq *generic_rq = &priv->channels.c[0]->rq;
325323
struct mlx5e_ptp *ptp_ch = priv->channels.ptp;
326324

@@ -340,20 +338,100 @@ static void mlx5e_rx_reporter_build_diagnose_output_ptp_rq(struct mlx5e_rq *rq,
340338
devlink_fmsg_obj_nest_end(fmsg);
341339
}
342340

343-
static int mlx5e_rx_reporter_diagnose(struct devlink_health_reporter *reporter,
344-
struct devlink_fmsg *fmsg,
345-
struct netlink_ext_ack *extack)
341+
static void mlx5e_rx_reporter_diagnose_rx_res_dir_tirns(struct mlx5e_rx_res *rx_res,
342+
struct devlink_fmsg *fmsg)
346343
{
347-
struct mlx5e_priv *priv = devlink_health_reporter_priv(reporter);
348-
struct mlx5e_ptp *ptp_ch = priv->channels.ptp;
344+
unsigned int max_nch = mlx5e_rx_res_get_max_nch(rx_res);
349345
int i;
350346

351-
mutex_lock(&priv->state_lock);
347+
devlink_fmsg_arr_pair_nest_start(fmsg, "Direct TIRs");
352348

353-
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
354-
goto unlock;
349+
for (i = 0; i < max_nch; i++) {
350+
devlink_fmsg_obj_nest_start(fmsg);
351+
352+
devlink_fmsg_u32_pair_put(fmsg, "ix", i);
353+
devlink_fmsg_u32_pair_put(fmsg, "tirn", mlx5e_rx_res_get_tirn_direct(rx_res, i));
354+
devlink_fmsg_u32_pair_put(fmsg, "rqtn", mlx5e_rx_res_get_rqtn_direct(rx_res, i));
355+
356+
devlink_fmsg_obj_nest_end(fmsg);
357+
}
358+
359+
devlink_fmsg_arr_pair_nest_end(fmsg);
360+
}
361+
362+
static void mlx5e_rx_reporter_diagnose_rx_res_rss_tirn(struct mlx5e_rss *rss, bool inner,
363+
struct devlink_fmsg *fmsg)
364+
{
365+
bool found_valid_tir = false;
366+
int tt;
367+
368+
for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++) {
369+
if (!mlx5e_rss_valid_tir(rss, tt, inner))
370+
continue;
371+
372+
if (!found_valid_tir) {
373+
char *tir_msg = inner ? "Inner TIRs Numbers" : "TIRs Numbers";
374+
375+
found_valid_tir = true;
376+
devlink_fmsg_arr_pair_nest_start(fmsg, tir_msg);
377+
}
378+
379+
devlink_fmsg_obj_nest_start(fmsg);
380+
devlink_fmsg_string_pair_put(fmsg, "tt", mlx5_ttc_get_name(tt));
381+
devlink_fmsg_u32_pair_put(fmsg, "tirn", mlx5e_rss_get_tirn(rss, tt, inner));
382+
devlink_fmsg_obj_nest_end(fmsg);
383+
}
384+
385+
if (found_valid_tir)
386+
devlink_fmsg_arr_pair_nest_end(fmsg);
387+
}
388+
389+
static void mlx5e_rx_reporter_diagnose_rx_res_rss_ix(struct mlx5e_rx_res *rx_res, u32 rss_idx,
390+
struct devlink_fmsg *fmsg)
391+
{
392+
struct mlx5e_rss *rss = mlx5e_rx_res_rss_get(rx_res, rss_idx);
393+
394+
if (!rss)
395+
return;
396+
397+
devlink_fmsg_obj_nest_start(fmsg);
398+
399+
devlink_fmsg_u32_pair_put(fmsg, "Index", rss_idx);
400+
devlink_fmsg_u32_pair_put(fmsg, "rqtn", mlx5e_rss_get_rqtn(rss));
401+
mlx5e_rx_reporter_diagnose_rx_res_rss_tirn(rss, false, fmsg);
402+
if (mlx5e_rss_get_inner_ft_support(rss))
403+
mlx5e_rx_reporter_diagnose_rx_res_rss_tirn(rss, true, fmsg);
404+
405+
devlink_fmsg_obj_nest_end(fmsg);
406+
}
407+
408+
static void mlx5e_rx_reporter_diagnose_rx_res_rss(struct mlx5e_rx_res *rx_res,
409+
struct devlink_fmsg *fmsg)
410+
{
411+
int rss_ix;
412+
413+
devlink_fmsg_arr_pair_nest_start(fmsg, "RSS");
414+
for (rss_ix = 0; rss_ix < MLX5E_MAX_NUM_RSS; rss_ix++)
415+
mlx5e_rx_reporter_diagnose_rx_res_rss_ix(rx_res, rss_ix, fmsg);
416+
devlink_fmsg_arr_pair_nest_end(fmsg);
417+
}
418+
419+
static void mlx5e_rx_reporter_diagnose_rx_res(struct mlx5e_priv *priv,
420+
struct devlink_fmsg *fmsg)
421+
{
422+
struct mlx5e_rx_res *rx_res = priv->rx_res;
423+
424+
mlx5e_health_fmsg_named_obj_nest_start(fmsg, "RX resources");
425+
mlx5e_rx_reporter_diagnose_rx_res_dir_tirns(rx_res, fmsg);
426+
mlx5e_rx_reporter_diagnose_rx_res_rss(rx_res, fmsg);
427+
mlx5e_health_fmsg_named_obj_nest_end(fmsg);
428+
}
429+
430+
static void mlx5e_rx_reporter_diagnose_rqs(struct mlx5e_priv *priv, struct devlink_fmsg *fmsg)
431+
{
432+
struct mlx5e_ptp *ptp_ch = priv->channels.ptp;
433+
int i;
355434

356-
mlx5e_rx_reporter_diagnose_common_config(reporter, fmsg);
357435
devlink_fmsg_arr_pair_nest_start(fmsg, "RQs");
358436

359437
for (i = 0; i < priv->channels.num; i++) {
@@ -367,7 +445,24 @@ static int mlx5e_rx_reporter_diagnose(struct devlink_health_reporter *reporter,
367445
}
368446
if (ptp_ch && test_bit(MLX5E_PTP_STATE_RX, ptp_ch->state))
369447
mlx5e_rx_reporter_build_diagnose_output_ptp_rq(&ptp_ch->rq, fmsg);
448+
370449
devlink_fmsg_arr_pair_nest_end(fmsg);
450+
}
451+
452+
static int mlx5e_rx_reporter_diagnose(struct devlink_health_reporter *reporter,
453+
struct devlink_fmsg *fmsg,
454+
struct netlink_ext_ack *extack)
455+
{
456+
struct mlx5e_priv *priv = devlink_health_reporter_priv(reporter);
457+
458+
mutex_lock(&priv->state_lock);
459+
460+
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
461+
goto unlock;
462+
463+
mlx5e_rx_reporter_diagnose_common_config(priv, fmsg);
464+
mlx5e_rx_reporter_diagnose_rqs(priv, fmsg);
465+
mlx5e_rx_reporter_diagnose_rx_res(priv, fmsg);
371466
unlock:
372467
mutex_unlock(&priv->state_lock);
373468
return 0;

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ static const char * const sq_sw_state_type_name[] = {
1616
[MLX5E_SQ_STATE_VLAN_NEED_L2_INLINE] = "vlan_need_l2_inline",
1717
[MLX5E_SQ_STATE_PENDING_XSK_TX] = "pending_xsk_tx",
1818
[MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC] = "pending_tls_rx_resync",
19-
[MLX5E_SQ_STATE_XDP_MULTIBUF] = "xdp_multibuf",
2019
};
2120

2221
static int mlx5e_wait_for_sq_flush(struct mlx5e_txqsq *sq)

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ struct mlx5e_rss {
8181
refcount_t refcnt;
8282
};
8383

84+
bool mlx5e_rss_get_inner_ft_support(struct mlx5e_rss *rss)
85+
{
86+
return rss->inner_ft_support;
87+
}
88+
8489
void mlx5e_rss_params_indir_modify_actual_size(struct mlx5e_rss *rss, u32 num_channels)
8590
{
8691
rss->indir.actual_table_size = mlx5e_rqt_size(rss->mdev, num_channels);
@@ -449,6 +454,16 @@ u32 mlx5e_rss_get_tirn(struct mlx5e_rss *rss, enum mlx5_traffic_types tt,
449454
return mlx5e_tir_get_tirn(tir);
450455
}
451456

457+
u32 mlx5e_rss_get_rqtn(struct mlx5e_rss *rss)
458+
{
459+
return mlx5e_rqt_get_rqtn(&rss->rqt);
460+
}
461+
462+
bool mlx5e_rss_valid_tir(struct mlx5e_rss *rss, enum mlx5_traffic_types tt, bool inner)
463+
{
464+
return !!rss_get_tir(rss, tt, inner);
465+
}
466+
452467
/* Fill the "tirn" output parameter.
453468
* Create the requested TIR if it's its first usage.
454469
*/

drivers/net/ethernet/mellanox/mlx5/core/en/rss.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,11 @@ void mlx5e_rss_refcnt_inc(struct mlx5e_rss *rss);
3232
void mlx5e_rss_refcnt_dec(struct mlx5e_rss *rss);
3333
unsigned int mlx5e_rss_refcnt_read(struct mlx5e_rss *rss);
3434

35+
bool mlx5e_rss_get_inner_ft_support(struct mlx5e_rss *rss);
3536
u32 mlx5e_rss_get_tirn(struct mlx5e_rss *rss, enum mlx5_traffic_types tt,
3637
bool inner);
38+
bool mlx5e_rss_valid_tir(struct mlx5e_rss *rss, enum mlx5_traffic_types tt, bool inner);
39+
u32 mlx5e_rss_get_rqtn(struct mlx5e_rss *rss);
3740
int mlx5e_rss_obtain_tirn(struct mlx5e_rss *rss,
3841
enum mlx5_traffic_types tt,
3942
const struct mlx5e_packet_merge_param *init_pkt_merge_param,

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
#include "channels.h"
66
#include "params.h"
77

8-
#define MLX5E_MAX_NUM_RSS 16
9-
108
struct mlx5e_rx_res {
119
struct mlx5_core_dev *mdev; /* primary */
1210
enum mlx5e_rx_res_features features;
@@ -497,6 +495,11 @@ void mlx5e_rx_res_destroy(struct mlx5e_rx_res *res)
497495
mlx5e_rx_res_free(res);
498496
}
499497

498+
unsigned int mlx5e_rx_res_get_max_nch(struct mlx5e_rx_res *res)
499+
{
500+
return res->max_nch;
501+
}
502+
500503
u32 mlx5e_rx_res_get_tirn_direct(struct mlx5e_rx_res *res, unsigned int ix)
501504
{
502505
return mlx5e_tir_get_tirn(&res->channels[ix].direct_tir);
@@ -522,7 +525,7 @@ u32 mlx5e_rx_res_get_tirn_ptp(struct mlx5e_rx_res *res)
522525
return mlx5e_tir_get_tirn(&res->ptp.tir);
523526
}
524527

525-
static u32 mlx5e_rx_res_get_rqtn_direct(struct mlx5e_rx_res *res, unsigned int ix)
528+
u32 mlx5e_rx_res_get_rqtn_direct(struct mlx5e_rx_res *res, unsigned int ix)
526529
{
527530
return mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt);
528531
}

0 commit comments

Comments
 (0)