Commit 12739192 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

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: default avatarJakub Kicinski <kuba@kernel.org>
parents 4e412312 1a930485
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -280,6 +280,10 @@ Description of the vnic counters:
	number of packets handled by the VNIC experiencing unexpected steering
	failure (at any point in steering flow owned by the VNIC, including the FDB
	for the eswitch owner).
- icm_consumption
        amount of Interconnect Host Memory (ICM) consumed by the vnic in
        granularity of 4KB. ICM is host memory allocated by SW upon HCA request
        and is used for storing data structures that control HCA operation.

User commands examples:

+46 −0
Original line number Diff line number Diff line
@@ -13,6 +13,50 @@ struct mlx5_vnic_diag_stats {
	__be64 query_vnic_env_out[MLX5_ST_SZ_QW(query_vnic_env_out)];
};

static void mlx5_reporter_vnic_diagnose_counter_icm(struct mlx5_core_dev *dev,
						    struct devlink_fmsg *fmsg,
						    u16 vport_num, bool other_vport)
{
	u32 out_icm_reg[MLX5_ST_SZ_DW(vhca_icm_ctrl_reg)] = {};
	u32 in_icm_reg[MLX5_ST_SZ_DW(vhca_icm_ctrl_reg)] = {};
	u32 out_reg[MLX5_ST_SZ_DW(nic_cap_reg)] = {};
	u32 in_reg[MLX5_ST_SZ_DW(nic_cap_reg)] = {};
	u32 cur_alloc_icm;
	int vhca_icm_ctrl;
	u16 vhca_id;
	int err;

	err = mlx5_core_access_reg(dev, in_reg, sizeof(in_reg), out_reg,
				   sizeof(out_reg), MLX5_REG_NIC_CAP, 0, 0);
	if (err) {
		mlx5_core_warn(dev, "Reading nic_cap_reg failed. err = %d\n", err);
		return;
	}
	vhca_icm_ctrl = MLX5_GET(nic_cap_reg, out_reg, vhca_icm_ctrl);
	if (!vhca_icm_ctrl)
		return;

	MLX5_SET(vhca_icm_ctrl_reg, in_icm_reg, vhca_id_valid, other_vport);
	if (other_vport) {
		err = mlx5_vport_get_vhca_id(dev, vport_num, &vhca_id);
		if (err) {
			mlx5_core_warn(dev, "vport to vhca_id failed. vport_num = %d, err = %d\n",
				       vport_num, err);
			return;
		}
		MLX5_SET(vhca_icm_ctrl_reg, in_icm_reg, vhca_id, vhca_id);
	}
	err = mlx5_core_access_reg(dev, in_icm_reg, sizeof(in_icm_reg),
				   out_icm_reg, sizeof(out_icm_reg),
				   MLX5_REG_VHCA_ICM_CTRL, 0, 0);
	if (err) {
		mlx5_core_warn(dev, "Reading vhca_icm_ctrl failed. err = %d\n", err);
		return;
	}
	cur_alloc_icm = MLX5_GET(vhca_icm_ctrl_reg, out_icm_reg, cur_alloc_icm);
	devlink_fmsg_u32_pair_put(fmsg, "icm_consumption", cur_alloc_icm);
}

void mlx5_reporter_vnic_diagnose_counters(struct mlx5_core_dev *dev,
					  struct devlink_fmsg *fmsg,
					  u16 vport_num, bool other_vport)
@@ -59,6 +103,8 @@ void mlx5_reporter_vnic_diagnose_counters(struct mlx5_core_dev *dev,
		devlink_fmsg_u64_pair_put(fmsg, "handled_pkt_steering_fail",
					  VNIC_ENV_GET64(&vnic, handled_pkt_steering_fail));
	}
	if (MLX5_CAP_GEN(dev, nic_cap_reg))
		mlx5_reporter_vnic_diagnose_counter_icm(dev, fmsg, vport_num, other_vport);

	devlink_fmsg_obj_nest_end(fmsg);
	devlink_fmsg_pair_nest_end(fmsg);
+0 −3
Original line number Diff line number Diff line
@@ -95,8 +95,6 @@ struct page_pool;
#define MLX5_MPWRQ_DEF_LOG_STRIDE_SZ(mdev) \
	MLX5_MPWRQ_LOG_STRIDE_SZ(mdev, order_base_2(MLX5E_RX_MAX_HEAD))

#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18

/* Keep in sync with mlx5e_mpwrq_log_wqe_sz.
 * These are theoretical maximums, which can be further restricted by
 * capabilities. These values are used for static resource allocations and
@@ -386,7 +384,6 @@ enum {
	MLX5E_SQ_STATE_VLAN_NEED_L2_INLINE,
	MLX5E_SQ_STATE_PENDING_XSK_TX,
	MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC,
	MLX5E_SQ_STATE_XDP_MULTIBUF,
	MLX5E_NUM_SQ_STATES, /* Must be kept last */
};

+11 −5
Original line number Diff line number Diff line
@@ -10,6 +10,9 @@
#include <net/page_pool/types.h>
#include <net/xdp_sock_drv.h>

#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18
#define MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ 17

static u8 mlx5e_mpwrq_min_page_shift(struct mlx5_core_dev *mdev)
{
	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,
			  enum mlx5e_mpwrq_umr_mode umr_mode)
{
	u8 umr_entry_size = mlx5e_mpwrq_umr_entry_size(umr_mode);
	u8 max_pages_per_wqe, max_log_mpwqe_size;
	u8 max_pages_per_wqe, max_log_wqe_size_calc;
	u8 max_log_wqe_size_cap;
	u16 max_wqe_size;

	/* Keep in sync with MLX5_MPWRQ_MAX_PAGES_PER_WQE. */
	max_wqe_size = mlx5e_get_max_sq_aligned_wqebbs(mdev) * MLX5_SEND_WQE_BB;
	max_pages_per_wqe = ALIGN_DOWN(max_wqe_size - sizeof(struct mlx5e_umr_wqe),
				       MLX5_UMR_FLEX_ALIGNMENT) / umr_entry_size;
	max_log_mpwqe_size = ilog2(max_pages_per_wqe) + page_shift;
	max_log_wqe_size_calc = ilog2(max_pages_per_wqe) + page_shift;

	WARN_ON_ONCE(max_log_wqe_size_calc < MLX5E_ORDER2_MAX_PACKET_MTU);

	WARN_ON_ONCE(max_log_mpwqe_size < MLX5E_ORDER2_MAX_PACKET_MTU);
	max_log_wqe_size_cap = mlx5_core_is_ecpf(mdev) ?
			   MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ : MLX5_MPWRQ_MAX_LOG_WQE_SZ;

	return min_t(u8, max_log_mpwqe_size, MLX5_MPWRQ_MAX_LOG_WQE_SZ);
	return min_t(u8, max_log_wqe_size_calc, max_log_wqe_size_cap);
}

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,
	mlx5e_build_sq_param_common(mdev, param);
	MLX5_SET(wq, wq, log_wq_sz, params->log_sq_size);
	param->is_mpw = MLX5E_GET_PFLAG(params, MLX5E_PFLAG_XDP_TX_MPWQE);
	param->is_xdp_mb = !mlx5e_rx_is_linear_skb(mdev, params, xsk);
	mlx5e_build_tx_cq_param(mdev, params, &param->cqp);
}

+0 −1
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ struct mlx5e_sq_param {
	struct mlx5_wq_param       wq;
	bool                       is_mpw;
	bool                       is_tls;
	bool                       is_xdp_mb;
	u16                        stop_room;
};

Loading