net/mlx5e: Refactor XDP counters
Separate the XDP counters into two sets: (1) One set reside in the RQ stats, and they monitor XDP stats in the RQ side. (2) Another set is per XDP-SQ, and they monitor XDP stats that are related to XDP transmit flow. Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: Eugenia Emantayev <eugenia@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
c94e4f117e
commit
890388ad6f
@ -424,6 +424,7 @@ struct mlx5e_xdpsq {
|
||||
|
||||
/* read only */
|
||||
struct mlx5_wq_cyc wq;
|
||||
struct mlx5e_xdpsq_stats *stats;
|
||||
void __iomem *uar_map;
|
||||
u32 sqn;
|
||||
struct device *pdev;
|
||||
@ -619,6 +620,7 @@ struct mlx5e_channel_stats {
|
||||
struct mlx5e_ch_stats ch;
|
||||
struct mlx5e_sq_stats sq[MLX5E_MAX_NUM_TC];
|
||||
struct mlx5e_rq_stats rq;
|
||||
struct mlx5e_xdpsq_stats rq_xdpsq;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
enum mlx5e_traffic_types {
|
||||
|
@ -106,8 +106,6 @@ bool mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xdp_info *xdpi)
|
||||
u16 pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
|
||||
struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(wq, pi);
|
||||
|
||||
struct mlx5e_rq *rq = container_of(sq, struct mlx5e_rq, xdpsq);
|
||||
|
||||
struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
|
||||
struct mlx5_wqe_eth_seg *eseg = &wqe->eth;
|
||||
struct mlx5_wqe_data_seg *dseg = wqe->data;
|
||||
@ -116,12 +114,12 @@ bool mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xdp_info *xdpi)
|
||||
dma_addr_t dma_addr = xdpi->dma_addr;
|
||||
unsigned int dma_len = xdpf->len;
|
||||
|
||||
struct mlx5e_rq_stats *stats = rq->stats;
|
||||
struct mlx5e_xdpsq_stats *stats = sq->stats;
|
||||
|
||||
prefetchw(wqe);
|
||||
|
||||
if (unlikely(dma_len < MLX5E_XDP_MIN_INLINE || sq->hw_mtu < dma_len)) {
|
||||
stats->xdp_drop++;
|
||||
stats->err++;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -131,7 +129,7 @@ bool mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xdp_info *xdpi)
|
||||
mlx5e_xmit_xdp_doorbell(sq);
|
||||
sq->db.doorbell = false;
|
||||
}
|
||||
stats->xdp_tx_full++;
|
||||
stats->full++;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -160,7 +158,7 @@ bool mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xdp_info *xdpi)
|
||||
|
||||
sq->db.doorbell = true;
|
||||
|
||||
stats->xdp_tx++;
|
||||
stats->xmit++;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -212,7 +210,7 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq)
|
||||
} while (!last_wqe);
|
||||
} while ((++i < MLX5E_TX_CQ_POLL_BUDGET) && (cqe = mlx5_cqwq_get_cqe(&cq->wq)));
|
||||
|
||||
rq->stats->xdp_tx_cqe += i;
|
||||
sq->stats->cqes += i;
|
||||
|
||||
mlx5_cqwq_update_db_record(&cq->wq);
|
||||
|
||||
|
@ -1001,6 +1001,7 @@ static int mlx5e_alloc_xdpsq(struct mlx5e_channel *c,
|
||||
sq->uar_map = mdev->mlx5e_res.bfreg.map;
|
||||
sq->min_inline_mode = params->tx_min_inline_mode;
|
||||
sq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu);
|
||||
sq->stats = &c->priv->channel_stats[c->ix].rq_xdpsq;
|
||||
|
||||
param->wq.db_numa_node = cpu_to_node(c->cpu);
|
||||
err = mlx5_wq_cyc_create(mdev, ¶m->wq, sqc_wq, wq, &sq->wq_ctrl);
|
||||
|
@ -60,9 +60,10 @@ static const struct counter_desc sw_stats_desc[] = {
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary_inner) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_drop) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_redirect) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_cqe) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_xmit) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_full) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_err) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_cqe) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_none) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial_inner) },
|
||||
@ -129,6 +130,7 @@ void mlx5e_grp_sw_update_stats(struct mlx5e_priv *priv)
|
||||
for (i = 0; i < priv->profile->max_nch(priv->mdev); i++) {
|
||||
struct mlx5e_channel_stats *channel_stats =
|
||||
&priv->channel_stats[i];
|
||||
struct mlx5e_xdpsq_stats *xdpsq_stats = &channel_stats->rq_xdpsq;
|
||||
struct mlx5e_rq_stats *rq_stats = &channel_stats->rq;
|
||||
struct mlx5e_ch_stats *ch_stats = &channel_stats->ch;
|
||||
int j;
|
||||
@ -142,11 +144,12 @@ void mlx5e_grp_sw_update_stats(struct mlx5e_priv *priv)
|
||||
s->rx_csum_complete += rq_stats->csum_complete;
|
||||
s->rx_csum_unnecessary += rq_stats->csum_unnecessary;
|
||||
s->rx_csum_unnecessary_inner += rq_stats->csum_unnecessary_inner;
|
||||
s->rx_xdp_drop += rq_stats->xdp_drop;
|
||||
s->rx_xdp_drop += rq_stats->xdp_drop;
|
||||
s->rx_xdp_redirect += rq_stats->xdp_redirect;
|
||||
s->rx_xdp_tx += rq_stats->xdp_tx;
|
||||
s->rx_xdp_tx_cqe += rq_stats->xdp_tx_cqe;
|
||||
s->rx_xdp_tx_full += rq_stats->xdp_tx_full;
|
||||
s->rx_xdp_tx_xmit += xdpsq_stats->xmit;
|
||||
s->rx_xdp_tx_full += xdpsq_stats->full;
|
||||
s->rx_xdp_tx_err += xdpsq_stats->err;
|
||||
s->rx_xdp_tx_cqe += xdpsq_stats->cqes;
|
||||
s->rx_wqe_err += rq_stats->wqe_err;
|
||||
s->rx_mpwqe_filler_cqes += rq_stats->mpwqe_filler_cqes;
|
||||
s->rx_mpwqe_filler_strides += rq_stats->mpwqe_filler_strides;
|
||||
@ -164,7 +167,7 @@ void mlx5e_grp_sw_update_stats(struct mlx5e_priv *priv)
|
||||
s->ch_poll += ch_stats->poll;
|
||||
s->ch_arm += ch_stats->arm;
|
||||
s->ch_aff_change += ch_stats->aff_change;
|
||||
s->ch_eq_rearm += ch_stats->eq_rearm;
|
||||
s->ch_eq_rearm += ch_stats->eq_rearm;
|
||||
|
||||
for (j = 0; j < priv->max_opened_tc; j++) {
|
||||
struct mlx5e_sq_stats *sq_stats = &channel_stats->sq[j];
|
||||
@ -1129,9 +1132,6 @@ static const struct counter_desc rq_stats_desc[] = {
|
||||
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) },
|
||||
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_drop) },
|
||||
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_redirect) },
|
||||
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_tx) },
|
||||
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_tx_cqe) },
|
||||
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_tx_full) },
|
||||
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_packets) },
|
||||
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_bytes) },
|
||||
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
|
||||
@ -1171,6 +1171,13 @@ static const struct counter_desc sq_stats_desc[] = {
|
||||
{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
|
||||
};
|
||||
|
||||
static const struct counter_desc rq_xdpsq_stats_desc[] = {
|
||||
{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
|
||||
{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) },
|
||||
{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) },
|
||||
{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
|
||||
};
|
||||
|
||||
static const struct counter_desc ch_stats_desc[] = {
|
||||
{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, events) },
|
||||
{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, poll) },
|
||||
@ -1181,6 +1188,7 @@ static const struct counter_desc ch_stats_desc[] = {
|
||||
|
||||
#define NUM_RQ_STATS ARRAY_SIZE(rq_stats_desc)
|
||||
#define NUM_SQ_STATS ARRAY_SIZE(sq_stats_desc)
|
||||
#define NUM_RQ_XDPSQ_STATS ARRAY_SIZE(rq_xdpsq_stats_desc)
|
||||
#define NUM_CH_STATS ARRAY_SIZE(ch_stats_desc)
|
||||
|
||||
static int mlx5e_grp_channels_get_num_stats(struct mlx5e_priv *priv)
|
||||
@ -1189,7 +1197,8 @@ static int mlx5e_grp_channels_get_num_stats(struct mlx5e_priv *priv)
|
||||
|
||||
return (NUM_RQ_STATS * max_nch) +
|
||||
(NUM_CH_STATS * max_nch) +
|
||||
(NUM_SQ_STATS * max_nch * priv->max_opened_tc);
|
||||
(NUM_SQ_STATS * max_nch * priv->max_opened_tc) +
|
||||
(NUM_RQ_XDPSQ_STATS * max_nch);
|
||||
}
|
||||
|
||||
static int mlx5e_grp_channels_fill_strings(struct mlx5e_priv *priv, u8 *data,
|
||||
@ -1203,9 +1212,14 @@ static int mlx5e_grp_channels_fill_strings(struct mlx5e_priv *priv, u8 *data,
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
ch_stats_desc[j].format, i);
|
||||
|
||||
for (i = 0; i < max_nch; i++)
|
||||
for (i = 0; i < max_nch; i++) {
|
||||
for (j = 0; j < NUM_RQ_STATS; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN, rq_stats_desc[j].format, i);
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
rq_stats_desc[j].format, i);
|
||||
for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
rq_xdpsq_stats_desc[j].format, i);
|
||||
}
|
||||
|
||||
for (tc = 0; tc < priv->max_opened_tc; tc++)
|
||||
for (i = 0; i < max_nch; i++)
|
||||
@ -1229,11 +1243,16 @@ static int mlx5e_grp_channels_fill_stats(struct mlx5e_priv *priv, u64 *data,
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].ch,
|
||||
ch_stats_desc, j);
|
||||
|
||||
for (i = 0; i < max_nch; i++)
|
||||
for (i = 0; i < max_nch; i++) {
|
||||
for (j = 0; j < NUM_RQ_STATS; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].rq,
|
||||
rq_stats_desc, j);
|
||||
for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].rq_xdpsq,
|
||||
rq_xdpsq_stats_desc, j);
|
||||
}
|
||||
|
||||
for (tc = 0; tc < priv->max_opened_tc; tc++)
|
||||
for (i = 0; i < max_nch; i++)
|
||||
|
@ -44,6 +44,7 @@
|
||||
#define MLX5E_DECLARE_STAT(type, fld) #fld, offsetof(type, fld)
|
||||
#define MLX5E_DECLARE_RX_STAT(type, fld) "rx%d_"#fld, offsetof(type, fld)
|
||||
#define MLX5E_DECLARE_TX_STAT(type, fld) "tx%d_"#fld, offsetof(type, fld)
|
||||
#define MLX5E_DECLARE_RQ_XDPSQ_STAT(type, fld) "rx%d_xdp_tx_"#fld, offsetof(type, fld)
|
||||
#define MLX5E_DECLARE_CH_STAT(type, fld) "ch%d_"#fld, offsetof(type, fld)
|
||||
|
||||
struct counter_desc {
|
||||
@ -71,9 +72,10 @@ struct mlx5e_sw_stats {
|
||||
u64 rx_csum_unnecessary_inner;
|
||||
u64 rx_xdp_drop;
|
||||
u64 rx_xdp_redirect;
|
||||
u64 rx_xdp_tx;
|
||||
u64 rx_xdp_tx_cqe;
|
||||
u64 rx_xdp_tx_xmit;
|
||||
u64 rx_xdp_tx_full;
|
||||
u64 rx_xdp_tx_err;
|
||||
u64 rx_xdp_tx_cqe;
|
||||
u64 tx_csum_none;
|
||||
u64 tx_csum_partial;
|
||||
u64 tx_csum_partial_inner;
|
||||
@ -180,9 +182,6 @@ struct mlx5e_rq_stats {
|
||||
u64 removed_vlan_packets;
|
||||
u64 xdp_drop;
|
||||
u64 xdp_redirect;
|
||||
u64 xdp_tx;
|
||||
u64 xdp_tx_cqe;
|
||||
u64 xdp_tx_full;
|
||||
u64 wqe_err;
|
||||
u64 mpwqe_filler_cqes;
|
||||
u64 mpwqe_filler_strides;
|
||||
@ -227,6 +226,13 @@ struct mlx5e_sq_stats {
|
||||
u64 cqe_err;
|
||||
};
|
||||
|
||||
struct mlx5e_xdpsq_stats {
|
||||
u64 xmit;
|
||||
u64 full;
|
||||
u64 err;
|
||||
u64 cqes;
|
||||
};
|
||||
|
||||
struct mlx5e_ch_stats {
|
||||
u64 events;
|
||||
u64 poll;
|
||||
|
Loading…
x
Reference in New Issue
Block a user