mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 15:41:52 +02:00
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>
This commit is contained in:
commit
12739192b1
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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_mpwqe_size < MLX5E_ORDER2_MAX_PACKET_MTU);
|
||||
WARN_ON_ONCE(max_log_wqe_size_calc < MLX5E_ORDER2_MAX_PACKET_MTU);
|
||||
|
||||
return min_t(u8, max_log_mpwqe_size, MLX5_MPWRQ_MAX_LOG_WQE_SZ);
|
||||
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_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, ¶m->cqp);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -317,10 +317,8 @@ mlx5e_rx_reporter_diagnose_common_ptp_config(struct mlx5e_priv *priv, struct mlx
|
|||
}
|
||||
|
||||
static void
|
||||
mlx5e_rx_reporter_diagnose_common_config(struct devlink_health_reporter *reporter,
|
||||
struct devlink_fmsg *fmsg)
|
||||
mlx5e_rx_reporter_diagnose_common_config(struct mlx5e_priv *priv, struct devlink_fmsg *fmsg)
|
||||
{
|
||||
struct mlx5e_priv *priv = devlink_health_reporter_priv(reporter);
|
||||
struct mlx5e_rq *generic_rq = &priv->channels.c[0]->rq;
|
||||
struct mlx5e_ptp *ptp_ch = priv->channels.ptp;
|
||||
|
||||
|
|
@ -340,20 +338,100 @@ static void mlx5e_rx_reporter_build_diagnose_output_ptp_rq(struct mlx5e_rq *rq,
|
|||
devlink_fmsg_obj_nest_end(fmsg);
|
||||
}
|
||||
|
||||
static int mlx5e_rx_reporter_diagnose(struct devlink_health_reporter *reporter,
|
||||
struct devlink_fmsg *fmsg,
|
||||
struct netlink_ext_ack *extack)
|
||||
static void mlx5e_rx_reporter_diagnose_rx_res_dir_tirns(struct mlx5e_rx_res *rx_res,
|
||||
struct devlink_fmsg *fmsg)
|
||||
{
|
||||
unsigned int max_nch = mlx5e_rx_res_get_max_nch(rx_res);
|
||||
int i;
|
||||
|
||||
devlink_fmsg_arr_pair_nest_start(fmsg, "Direct TIRs");
|
||||
|
||||
for (i = 0; i < max_nch; i++) {
|
||||
devlink_fmsg_obj_nest_start(fmsg);
|
||||
|
||||
devlink_fmsg_u32_pair_put(fmsg, "ix", i);
|
||||
devlink_fmsg_u32_pair_put(fmsg, "tirn", mlx5e_rx_res_get_tirn_direct(rx_res, i));
|
||||
devlink_fmsg_u32_pair_put(fmsg, "rqtn", mlx5e_rx_res_get_rqtn_direct(rx_res, i));
|
||||
|
||||
devlink_fmsg_obj_nest_end(fmsg);
|
||||
}
|
||||
|
||||
devlink_fmsg_arr_pair_nest_end(fmsg);
|
||||
}
|
||||
|
||||
static void mlx5e_rx_reporter_diagnose_rx_res_rss_tirn(struct mlx5e_rss *rss, bool inner,
|
||||
struct devlink_fmsg *fmsg)
|
||||
{
|
||||
bool found_valid_tir = false;
|
||||
int tt;
|
||||
|
||||
for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++) {
|
||||
if (!mlx5e_rss_valid_tir(rss, tt, inner))
|
||||
continue;
|
||||
|
||||
if (!found_valid_tir) {
|
||||
char *tir_msg = inner ? "Inner TIRs Numbers" : "TIRs Numbers";
|
||||
|
||||
found_valid_tir = true;
|
||||
devlink_fmsg_arr_pair_nest_start(fmsg, tir_msg);
|
||||
}
|
||||
|
||||
devlink_fmsg_obj_nest_start(fmsg);
|
||||
devlink_fmsg_string_pair_put(fmsg, "tt", mlx5_ttc_get_name(tt));
|
||||
devlink_fmsg_u32_pair_put(fmsg, "tirn", mlx5e_rss_get_tirn(rss, tt, inner));
|
||||
devlink_fmsg_obj_nest_end(fmsg);
|
||||
}
|
||||
|
||||
if (found_valid_tir)
|
||||
devlink_fmsg_arr_pair_nest_end(fmsg);
|
||||
}
|
||||
|
||||
static void mlx5e_rx_reporter_diagnose_rx_res_rss_ix(struct mlx5e_rx_res *rx_res, u32 rss_idx,
|
||||
struct devlink_fmsg *fmsg)
|
||||
{
|
||||
struct mlx5e_rss *rss = mlx5e_rx_res_rss_get(rx_res, rss_idx);
|
||||
|
||||
if (!rss)
|
||||
return;
|
||||
|
||||
devlink_fmsg_obj_nest_start(fmsg);
|
||||
|
||||
devlink_fmsg_u32_pair_put(fmsg, "Index", rss_idx);
|
||||
devlink_fmsg_u32_pair_put(fmsg, "rqtn", mlx5e_rss_get_rqtn(rss));
|
||||
mlx5e_rx_reporter_diagnose_rx_res_rss_tirn(rss, false, fmsg);
|
||||
if (mlx5e_rss_get_inner_ft_support(rss))
|
||||
mlx5e_rx_reporter_diagnose_rx_res_rss_tirn(rss, true, fmsg);
|
||||
|
||||
devlink_fmsg_obj_nest_end(fmsg);
|
||||
}
|
||||
|
||||
static void mlx5e_rx_reporter_diagnose_rx_res_rss(struct mlx5e_rx_res *rx_res,
|
||||
struct devlink_fmsg *fmsg)
|
||||
{
|
||||
int rss_ix;
|
||||
|
||||
devlink_fmsg_arr_pair_nest_start(fmsg, "RSS");
|
||||
for (rss_ix = 0; rss_ix < MLX5E_MAX_NUM_RSS; rss_ix++)
|
||||
mlx5e_rx_reporter_diagnose_rx_res_rss_ix(rx_res, rss_ix, fmsg);
|
||||
devlink_fmsg_arr_pair_nest_end(fmsg);
|
||||
}
|
||||
|
||||
static void mlx5e_rx_reporter_diagnose_rx_res(struct mlx5e_priv *priv,
|
||||
struct devlink_fmsg *fmsg)
|
||||
{
|
||||
struct mlx5e_rx_res *rx_res = priv->rx_res;
|
||||
|
||||
mlx5e_health_fmsg_named_obj_nest_start(fmsg, "RX resources");
|
||||
mlx5e_rx_reporter_diagnose_rx_res_dir_tirns(rx_res, fmsg);
|
||||
mlx5e_rx_reporter_diagnose_rx_res_rss(rx_res, fmsg);
|
||||
mlx5e_health_fmsg_named_obj_nest_end(fmsg);
|
||||
}
|
||||
|
||||
static void mlx5e_rx_reporter_diagnose_rqs(struct mlx5e_priv *priv, struct devlink_fmsg *fmsg)
|
||||
{
|
||||
struct mlx5e_priv *priv = devlink_health_reporter_priv(reporter);
|
||||
struct mlx5e_ptp *ptp_ch = priv->channels.ptp;
|
||||
int i;
|
||||
|
||||
mutex_lock(&priv->state_lock);
|
||||
|
||||
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
|
||||
goto unlock;
|
||||
|
||||
mlx5e_rx_reporter_diagnose_common_config(reporter, fmsg);
|
||||
devlink_fmsg_arr_pair_nest_start(fmsg, "RQs");
|
||||
|
||||
for (i = 0; i < priv->channels.num; i++) {
|
||||
|
|
@ -367,7 +445,24 @@ static int mlx5e_rx_reporter_diagnose(struct devlink_health_reporter *reporter,
|
|||
}
|
||||
if (ptp_ch && test_bit(MLX5E_PTP_STATE_RX, ptp_ch->state))
|
||||
mlx5e_rx_reporter_build_diagnose_output_ptp_rq(&ptp_ch->rq, fmsg);
|
||||
|
||||
devlink_fmsg_arr_pair_nest_end(fmsg);
|
||||
}
|
||||
|
||||
static int mlx5e_rx_reporter_diagnose(struct devlink_health_reporter *reporter,
|
||||
struct devlink_fmsg *fmsg,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx5e_priv *priv = devlink_health_reporter_priv(reporter);
|
||||
|
||||
mutex_lock(&priv->state_lock);
|
||||
|
||||
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
|
||||
goto unlock;
|
||||
|
||||
mlx5e_rx_reporter_diagnose_common_config(priv, fmsg);
|
||||
mlx5e_rx_reporter_diagnose_rqs(priv, fmsg);
|
||||
mlx5e_rx_reporter_diagnose_rx_res(priv, fmsg);
|
||||
unlock:
|
||||
mutex_unlock(&priv->state_lock);
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@ static const char * const sq_sw_state_type_name[] = {
|
|||
[MLX5E_SQ_STATE_VLAN_NEED_L2_INLINE] = "vlan_need_l2_inline",
|
||||
[MLX5E_SQ_STATE_PENDING_XSK_TX] = "pending_xsk_tx",
|
||||
[MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC] = "pending_tls_rx_resync",
|
||||
[MLX5E_SQ_STATE_XDP_MULTIBUF] = "xdp_multibuf",
|
||||
};
|
||||
|
||||
static int mlx5e_wait_for_sq_flush(struct mlx5e_txqsq *sq)
|
||||
|
|
|
|||
|
|
@ -81,6 +81,11 @@ struct mlx5e_rss {
|
|||
refcount_t refcnt;
|
||||
};
|
||||
|
||||
bool mlx5e_rss_get_inner_ft_support(struct mlx5e_rss *rss)
|
||||
{
|
||||
return rss->inner_ft_support;
|
||||
}
|
||||
|
||||
void mlx5e_rss_params_indir_modify_actual_size(struct mlx5e_rss *rss, u32 num_channels)
|
||||
{
|
||||
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,
|
|||
return mlx5e_tir_get_tirn(tir);
|
||||
}
|
||||
|
||||
u32 mlx5e_rss_get_rqtn(struct mlx5e_rss *rss)
|
||||
{
|
||||
return mlx5e_rqt_get_rqtn(&rss->rqt);
|
||||
}
|
||||
|
||||
bool mlx5e_rss_valid_tir(struct mlx5e_rss *rss, enum mlx5_traffic_types tt, bool inner)
|
||||
{
|
||||
return !!rss_get_tir(rss, tt, inner);
|
||||
}
|
||||
|
||||
/* Fill the "tirn" output parameter.
|
||||
* Create the requested TIR if it's its first usage.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -32,8 +32,11 @@ void mlx5e_rss_refcnt_inc(struct mlx5e_rss *rss);
|
|||
void mlx5e_rss_refcnt_dec(struct mlx5e_rss *rss);
|
||||
unsigned int mlx5e_rss_refcnt_read(struct mlx5e_rss *rss);
|
||||
|
||||
bool mlx5e_rss_get_inner_ft_support(struct mlx5e_rss *rss);
|
||||
u32 mlx5e_rss_get_tirn(struct mlx5e_rss *rss, enum mlx5_traffic_types tt,
|
||||
bool inner);
|
||||
bool mlx5e_rss_valid_tir(struct mlx5e_rss *rss, enum mlx5_traffic_types tt, bool inner);
|
||||
u32 mlx5e_rss_get_rqtn(struct mlx5e_rss *rss);
|
||||
int mlx5e_rss_obtain_tirn(struct mlx5e_rss *rss,
|
||||
enum mlx5_traffic_types tt,
|
||||
const struct mlx5e_packet_merge_param *init_pkt_merge_param,
|
||||
|
|
|
|||
|
|
@ -5,8 +5,6 @@
|
|||
#include "channels.h"
|
||||
#include "params.h"
|
||||
|
||||
#define MLX5E_MAX_NUM_RSS 16
|
||||
|
||||
struct mlx5e_rx_res {
|
||||
struct mlx5_core_dev *mdev; /* primary */
|
||||
enum mlx5e_rx_res_features features;
|
||||
|
|
@ -497,6 +495,11 @@ void mlx5e_rx_res_destroy(struct mlx5e_rx_res *res)
|
|||
mlx5e_rx_res_free(res);
|
||||
}
|
||||
|
||||
unsigned int mlx5e_rx_res_get_max_nch(struct mlx5e_rx_res *res)
|
||||
{
|
||||
return res->max_nch;
|
||||
}
|
||||
|
||||
u32 mlx5e_rx_res_get_tirn_direct(struct mlx5e_rx_res *res, unsigned int ix)
|
||||
{
|
||||
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)
|
|||
return mlx5e_tir_get_tirn(&res->ptp.tir);
|
||||
}
|
||||
|
||||
static u32 mlx5e_rx_res_get_rqtn_direct(struct mlx5e_rx_res *res, unsigned int ix)
|
||||
u32 mlx5e_rx_res_get_rqtn_direct(struct mlx5e_rx_res *res, unsigned int ix)
|
||||
{
|
||||
return mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@
|
|||
#include "fs.h"
|
||||
#include "rss.h"
|
||||
|
||||
#define MLX5E_MAX_NUM_RSS 16
|
||||
|
||||
struct mlx5e_rx_res;
|
||||
|
||||
struct mlx5e_channels;
|
||||
|
|
@ -34,6 +36,9 @@ u32 mlx5e_rx_res_get_tirn_direct(struct mlx5e_rx_res *res, unsigned int ix);
|
|||
u32 mlx5e_rx_res_get_tirn_rss(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt);
|
||||
u32 mlx5e_rx_res_get_tirn_rss_inner(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt);
|
||||
u32 mlx5e_rx_res_get_tirn_ptp(struct mlx5e_rx_res *res);
|
||||
u32 mlx5e_rx_res_get_rqtn_direct(struct mlx5e_rx_res *res, unsigned int ix);
|
||||
unsigned int mlx5e_rx_res_get_max_nch(struct mlx5e_rx_res *res);
|
||||
bool mlx5_rx_res_rss_inner_ft_support(struct mlx5e_rx_res *res);
|
||||
|
||||
/* Activate/deactivate API */
|
||||
void mlx5e_rx_res_channels_activate(struct mlx5e_rx_res *res, struct mlx5e_channels *chs);
|
||||
|
|
|
|||
|
|
@ -546,6 +546,7 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
|
|||
bool inline_ok;
|
||||
bool linear;
|
||||
u16 pi;
|
||||
int i;
|
||||
|
||||
struct mlx5e_xdpsq_stats *stats = sq->stats;
|
||||
|
||||
|
|
@ -612,42 +613,34 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
|
|||
|
||||
cseg->opmod_idx_opcode = cpu_to_be32((sq->pc << 8) | MLX5_OPCODE_SEND);
|
||||
|
||||
if (test_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state)) {
|
||||
int i;
|
||||
memset(&cseg->trailer, 0, sizeof(cseg->trailer));
|
||||
memset(eseg, 0, sizeof(*eseg) - sizeof(eseg->trailer));
|
||||
|
||||
memset(&cseg->trailer, 0, sizeof(cseg->trailer));
|
||||
memset(eseg, 0, sizeof(*eseg) - sizeof(eseg->trailer));
|
||||
eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz);
|
||||
|
||||
eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz);
|
||||
for (i = 0; i < num_frags; i++) {
|
||||
skb_frag_t *frag = &xdptxdf->sinfo->frags[i];
|
||||
dma_addr_t addr;
|
||||
|
||||
for (i = 0; i < num_frags; i++) {
|
||||
skb_frag_t *frag = &xdptxdf->sinfo->frags[i];
|
||||
dma_addr_t addr;
|
||||
addr = xdptxdf->dma_arr ? xdptxdf->dma_arr[i] :
|
||||
page_pool_get_dma_addr(skb_frag_page(frag)) +
|
||||
skb_frag_off(frag);
|
||||
|
||||
addr = xdptxdf->dma_arr ? xdptxdf->dma_arr[i] :
|
||||
page_pool_get_dma_addr(skb_frag_page(frag)) +
|
||||
skb_frag_off(frag);
|
||||
|
||||
dseg->addr = cpu_to_be64(addr);
|
||||
dseg->byte_count = cpu_to_be32(skb_frag_size(frag));
|
||||
dseg->lkey = sq->mkey_be;
|
||||
dseg++;
|
||||
}
|
||||
|
||||
cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt);
|
||||
|
||||
sq->db.wqe_info[pi] = (struct mlx5e_xdp_wqe_info) {
|
||||
.num_wqebbs = num_wqebbs,
|
||||
.num_pkts = 1,
|
||||
};
|
||||
|
||||
sq->pc += num_wqebbs;
|
||||
} else {
|
||||
cseg->fm_ce_se = 0;
|
||||
|
||||
sq->pc++;
|
||||
dseg->addr = cpu_to_be64(addr);
|
||||
dseg->byte_count = cpu_to_be32(skb_frag_size(frag));
|
||||
dseg->lkey = sq->mkey_be;
|
||||
dseg++;
|
||||
}
|
||||
|
||||
cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt);
|
||||
|
||||
sq->db.wqe_info[pi] = (struct mlx5e_xdp_wqe_info) {
|
||||
.num_wqebbs = num_wqebbs,
|
||||
.num_pkts = 1,
|
||||
};
|
||||
|
||||
sq->pc += num_wqebbs;
|
||||
|
||||
xsk_tx_metadata_request(meta, &mlx5e_xsk_tx_metadata_ops, eseg);
|
||||
|
||||
sq->doorbell_cseg = cseg;
|
||||
|
|
|
|||
|
|
@ -2023,41 +2023,12 @@ int mlx5e_open_xdpsq(struct mlx5e_channel *c, struct mlx5e_params *params,
|
|||
csp.min_inline_mode = sq->min_inline_mode;
|
||||
set_bit(MLX5E_SQ_STATE_ENABLED, &sq->state);
|
||||
|
||||
if (param->is_xdp_mb)
|
||||
set_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state);
|
||||
|
||||
err = mlx5e_create_sq_rdy(c->mdev, param, &csp, 0, &sq->sqn);
|
||||
if (err)
|
||||
goto err_free_xdpsq;
|
||||
|
||||
mlx5e_set_xmit_fp(sq, param->is_mpw);
|
||||
|
||||
if (!param->is_mpw && !test_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state)) {
|
||||
unsigned int ds_cnt = MLX5E_TX_WQE_EMPTY_DS_COUNT + 1;
|
||||
unsigned int inline_hdr_sz = 0;
|
||||
int i;
|
||||
|
||||
if (sq->min_inline_mode != MLX5_INLINE_MODE_NONE) {
|
||||
inline_hdr_sz = MLX5E_XDP_MIN_INLINE;
|
||||
ds_cnt++;
|
||||
}
|
||||
|
||||
/* Pre initialize fixed WQE fields */
|
||||
for (i = 0; i < mlx5_wq_cyc_get_size(&sq->wq); i++) {
|
||||
struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(&sq->wq, i);
|
||||
struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
|
||||
struct mlx5_wqe_eth_seg *eseg = &wqe->eth;
|
||||
|
||||
sq->db.wqe_info[i] = (struct mlx5e_xdp_wqe_info) {
|
||||
.num_wqebbs = 1,
|
||||
.num_pkts = 1,
|
||||
};
|
||||
|
||||
cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt);
|
||||
eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_xdpsq:
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@
|
|||
#define MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE \
|
||||
max(0x7, MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE)
|
||||
#define MLX5E_REP_PARAMS_DEF_NUM_CHANNELS 1
|
||||
#define MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE 0x8
|
||||
|
||||
static const char mlx5e_rep_driver_name[] = "mlx5e_rep";
|
||||
|
||||
|
|
@ -855,6 +856,8 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
|
|||
|
||||
/* RQ */
|
||||
mlx5e_build_rq_params(mdev, params);
|
||||
if (!mlx5e_is_uplink_rep(priv) && mlx5_core_is_ecpf(mdev))
|
||||
params->log_rq_mtu_frames = MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE;
|
||||
|
||||
/* If netdev is already registered (e.g. move from nic profile to uplink,
|
||||
* RTNL lock must be held before triggering netdev notifiers.
|
||||
|
|
@ -886,6 +889,8 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev,
|
|||
netdev->ethtool_ops = &mlx5e_rep_ethtool_ops;
|
||||
|
||||
netdev->watchdog_timeo = 15 * HZ;
|
||||
if (mlx5_core_is_ecpf(mdev))
|
||||
netdev->tx_queue_len = 1 << MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE;
|
||||
|
||||
#if IS_ENABLED(CONFIG_MLX5_CLS_ACT)
|
||||
netdev->hw_features |= NETIF_F_HW_TC;
|
||||
|
|
|
|||
|
|
@ -166,6 +166,9 @@ mlx5e_test_loopback_validate(struct sk_buff *skb,
|
|||
struct udphdr *udph;
|
||||
struct iphdr *iph;
|
||||
|
||||
if (skb_linearize(skb))
|
||||
goto out;
|
||||
|
||||
/* We are only going to peek, no need to clone the SKB */
|
||||
if (MLX5E_TEST_PKT_SIZE - ETH_HLEN > skb_headlen(skb))
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -4157,37 +4157,12 @@ u32 mlx5_eswitch_get_vport_metadata_for_match(struct mlx5_eswitch *esw,
|
|||
}
|
||||
EXPORT_SYMBOL(mlx5_eswitch_get_vport_metadata_for_match);
|
||||
|
||||
static int mlx5_esw_query_vport_vhca_id(struct mlx5_eswitch *esw, u16 vport_num, u16 *vhca_id)
|
||||
{
|
||||
int query_out_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
|
||||
void *query_ctx;
|
||||
void *hca_caps;
|
||||
int err;
|
||||
|
||||
*vhca_id = 0;
|
||||
|
||||
query_ctx = kzalloc(query_out_sz, GFP_KERNEL);
|
||||
if (!query_ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
err = mlx5_vport_get_other_func_general_cap(esw->dev, vport_num, query_ctx);
|
||||
if (err)
|
||||
goto out_free;
|
||||
|
||||
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
|
||||
*vhca_id = MLX5_GET(cmd_hca_cap, hca_caps, vhca_id);
|
||||
|
||||
out_free:
|
||||
kfree(query_ctx);
|
||||
return err;
|
||||
}
|
||||
|
||||
int mlx5_esw_vport_vhca_id_set(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
u16 *old_entry, *vhca_map_entry, vhca_id;
|
||||
int err;
|
||||
|
||||
err = mlx5_esw_query_vport_vhca_id(esw, vport_num, &vhca_id);
|
||||
err = mlx5_vport_get_vhca_id(esw->dev, vport_num, &vhca_id);
|
||||
if (err) {
|
||||
esw_warn(esw->dev, "Getting vhca_id for vport failed (vport=%u,err=%d)\n",
|
||||
vport_num, err);
|
||||
|
|
@ -4213,7 +4188,7 @@ void mlx5_esw_vport_vhca_id_clear(struct mlx5_eswitch *esw, u16 vport_num)
|
|||
u16 *vhca_map_entry, vhca_id;
|
||||
int err;
|
||||
|
||||
err = mlx5_esw_query_vport_vhca_id(esw, vport_num, &vhca_id);
|
||||
err = mlx5_vport_get_vhca_id(esw->dev, vport_num, &vhca_id);
|
||||
if (err)
|
||||
esw_warn(esw->dev, "Getting vhca_id for vport failed (vport=%hu,err=%d)\n",
|
||||
vport_num, err);
|
||||
|
|
|
|||
|
|
@ -61,6 +61,25 @@ static void mlx5_cleanup_ttc_rules(struct mlx5_ttc_table *ttc)
|
|||
}
|
||||
}
|
||||
|
||||
static const char *mlx5_traffic_types_names[MLX5_NUM_TT] = {
|
||||
[MLX5_TT_IPV4_TCP] = "TT_IPV4_TCP",
|
||||
[MLX5_TT_IPV6_TCP] = "TT_IPV6_TCP",
|
||||
[MLX5_TT_IPV4_UDP] = "TT_IPV4_UDP",
|
||||
[MLX5_TT_IPV6_UDP] = "TT_IPV6_UDP",
|
||||
[MLX5_TT_IPV4_IPSEC_AH] = "TT_IPV4_IPSEC_AH",
|
||||
[MLX5_TT_IPV6_IPSEC_AH] = "TT_IPV6_IPSEC_AH",
|
||||
[MLX5_TT_IPV4_IPSEC_ESP] = "TT_IPV4_IPSEC_ESP",
|
||||
[MLX5_TT_IPV6_IPSEC_ESP] = "TT_IPV6_IPSEC_ESP",
|
||||
[MLX5_TT_IPV4] = "TT_IPV4",
|
||||
[MLX5_TT_IPV6] = "TT_IPV6",
|
||||
[MLX5_TT_ANY] = "TT_ANY"
|
||||
};
|
||||
|
||||
const char *mlx5_ttc_get_name(enum mlx5_traffic_types tt)
|
||||
{
|
||||
return mlx5_traffic_types_names[tt];
|
||||
}
|
||||
|
||||
struct mlx5_etype_proto {
|
||||
u16 etype;
|
||||
u8 proto;
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ struct ttc_params {
|
|||
struct mlx5_flow_destination tunnel_dests[MLX5_NUM_TUNNEL_TT];
|
||||
};
|
||||
|
||||
const char *mlx5_ttc_get_name(enum mlx5_traffic_types tt);
|
||||
struct mlx5_flow_table *mlx5_get_ttc_flow_table(struct mlx5_ttc_table *ttc);
|
||||
|
||||
struct mlx5_ttc_table *mlx5_create_ttc_table(struct mlx5_core_dev *dev,
|
||||
|
|
|
|||
|
|
@ -346,6 +346,8 @@ int mlx5_vport_set_other_func_cap(struct mlx5_core_dev *dev, const void *hca_cap
|
|||
#define mlx5_vport_get_other_func_general_cap(dev, vport, out) \
|
||||
mlx5_vport_get_other_func_cap(dev, vport, out, MLX5_CAP_GENERAL)
|
||||
|
||||
int mlx5_vport_get_vhca_id(struct mlx5_core_dev *dev, u16 vport, u16 *vhca_id);
|
||||
|
||||
static inline u32 mlx5_sriov_get_vf_total_msix(struct pci_dev *pdev)
|
||||
{
|
||||
struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
|
||||
|
|
|
|||
|
|
@ -1199,6 +1199,31 @@ int mlx5_vport_get_other_func_cap(struct mlx5_core_dev *dev, u16 vport, void *ou
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(mlx5_vport_get_other_func_cap);
|
||||
|
||||
int mlx5_vport_get_vhca_id(struct mlx5_core_dev *dev, u16 vport, u16 *vhca_id)
|
||||
{
|
||||
int query_out_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
|
||||
void *query_ctx;
|
||||
void *hca_caps;
|
||||
int err;
|
||||
|
||||
*vhca_id = 0;
|
||||
|
||||
query_ctx = kzalloc(query_out_sz, GFP_KERNEL);
|
||||
if (!query_ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
err = mlx5_vport_get_other_func_general_cap(dev, vport, query_ctx);
|
||||
if (err)
|
||||
goto out_free;
|
||||
|
||||
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
|
||||
*vhca_id = MLX5_GET(cmd_hca_cap, hca_caps, vhca_id);
|
||||
|
||||
out_free:
|
||||
kfree(query_ctx);
|
||||
return err;
|
||||
}
|
||||
|
||||
int mlx5_vport_set_other_func_cap(struct mlx5_core_dev *dev, const void *hca_cap,
|
||||
u16 vport, u16 opmod)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user