> Subject: [PATCH V2,net-next, 2/2] net: mana: Add ethtool counters for RX > CQEs in coalesced type > > From: Haiyang Zhang <[email protected]> > > For RX CQEs with type CQE_RX_COALESCED_4, to measure the coalescing > efficiency, add counters to count how many contains 2, 3, 4 packets > respectively. > Also, add a counter for the error case of first packet with length == 0. > > Signed-off-by: Haiyang Zhang <[email protected]>
Reviewed-by: Long Li <[email protected]> > --- > drivers/net/ethernet/microsoft/mana/mana_en.c | 25 > +++++++++++++++++-- > .../ethernet/microsoft/mana/mana_ethtool.c | 17 ++++++++++--- > include/net/mana/mana.h | 10 +++++--- > 3 files changed, 42 insertions(+), 10 deletions(-) > > diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c > b/drivers/net/ethernet/microsoft/mana/mana_en.c > index a46a1adf83bc..78824567d80b 100644 > --- a/drivers/net/ethernet/microsoft/mana/mana_en.c > +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c > @@ -2083,8 +2083,22 @@ static void mana_process_rx_cqe(struct > mana_rxq *rxq, struct mana_cq *cq, > > nextpkt: > pktlen = oob->ppi[i].pkt_len; > - if (pktlen == 0) > + if (pktlen == 0) { > + /* Collect coalesced CQE count based on packets processed. > + * Coalesced CQEs have at least 2 packets, so index is i - 2. > + */ > + if (i > 1) { > + u64_stats_update_begin(&rxq->stats.syncp); > + rxq->stats.coalesced_cqe[i - 2]++; > + u64_stats_update_end(&rxq->stats.syncp); > + } else if (i == 0) { > + /* Error case stat */ > + u64_stats_update_begin(&rxq->stats.syncp); > + rxq->stats.pkt_len0_err++; > + u64_stats_update_end(&rxq->stats.syncp); > + } > return; > + } > > curr = rxq->buf_index; > rxbuf_oob = &rxq->rx_oobs[curr]; > @@ -2102,8 +2116,15 @@ static void mana_process_rx_cqe(struct > mana_rxq *rxq, struct mana_cq *cq, > > mana_post_pkt_rxq(rxq); > > - if (coalesced && (++i < MANA_RXCOMP_OOB_NUM_PPI)) > + if (!coalesced) > + return; > + > + if (++i < MANA_RXCOMP_OOB_NUM_PPI) > goto nextpkt; > + > + u64_stats_update_begin(&rxq->stats.syncp); > + rxq->stats.coalesced_cqe[MANA_RXCOMP_OOB_NUM_PPI - 2]++; > + u64_stats_update_end(&rxq->stats.syncp); > } > > static void mana_poll_rx_cq(struct mana_cq *cq) diff --git > a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c > b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c > index b2b9bfb50396..635796bfdaf1 100644 > --- a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c > +++ b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c > @@ -20,8 +20,6 @@ static const struct mana_stats_desc mana_eth_stats[] = > { > tx_cqe_unknown_type)}, > {"tx_linear_pkt_cnt", offsetof(struct mana_ethtool_stats, > tx_linear_pkt_cnt)}, > - {"rx_coalesced_err", offsetof(struct mana_ethtool_stats, > - rx_coalesced_err)}, > {"rx_cqe_unknown_type", offsetof(struct mana_ethtool_stats, > rx_cqe_unknown_type)}, > }; > @@ -151,7 +149,7 @@ static void mana_get_strings(struct net_device *ndev, > u32 stringset, u8 *data) { > struct mana_port_context *apc = netdev_priv(ndev); > unsigned int num_queues = apc->num_queues; > - int i; > + int i, j; > > if (stringset != ETH_SS_STATS) > return; > @@ -170,6 +168,9 @@ static void mana_get_strings(struct net_device *ndev, > u32 stringset, u8 *data) > ethtool_sprintf(&data, "rx_%d_xdp_drop", i); > ethtool_sprintf(&data, "rx_%d_xdp_tx", i); > ethtool_sprintf(&data, "rx_%d_xdp_redirect", i); > + ethtool_sprintf(&data, "rx_%d_pkt_len0_err", i); > + for (j = 0; j < MANA_RXCOMP_OOB_NUM_PPI - 1; j++) > + ethtool_sprintf(&data, "rx_%d_coalesced_cqe_%d", i, > j + 2); > } > > for (i = 0; i < num_queues; i++) { > @@ -203,6 +204,8 @@ static void mana_get_ethtool_stats(struct net_device > *ndev, > u64 xdp_xmit; > u64 xdp_drop; > u64 xdp_tx; > + u64 pkt_len0_err; > + u64 coalesced_cqe[MANA_RXCOMP_OOB_NUM_PPI - 1]; > u64 tso_packets; > u64 tso_bytes; > u64 tso_inner_packets; > @@ -211,7 +214,7 @@ static void mana_get_ethtool_stats(struct net_device > *ndev, > u64 short_pkt_fmt; > u64 csum_partial; > u64 mana_map_err; > - int q, i = 0; > + int q, i = 0, j; > > if (!apc->port_is_up) > return; > @@ -241,6 +244,9 @@ static void mana_get_ethtool_stats(struct net_device > *ndev, > xdp_drop = rx_stats->xdp_drop; > xdp_tx = rx_stats->xdp_tx; > xdp_redirect = rx_stats->xdp_redirect; > + pkt_len0_err = rx_stats->pkt_len0_err; > + for (j = 0; j < MANA_RXCOMP_OOB_NUM_PPI - 1; > j++) > + coalesced_cqe[j] = rx_stats->coalesced_cqe[j]; > } while (u64_stats_fetch_retry(&rx_stats->syncp, start)); > > data[i++] = packets; > @@ -248,6 +254,9 @@ static void mana_get_ethtool_stats(struct net_device > *ndev, > data[i++] = xdp_drop; > data[i++] = xdp_tx; > data[i++] = xdp_redirect; > + data[i++] = pkt_len0_err; > + for (j = 0; j < MANA_RXCOMP_OOB_NUM_PPI - 1; j++) > + data[i++] = coalesced_cqe[j]; > } > > for (q = 0; q < num_queues; q++) { > diff --git a/include/net/mana/mana.h b/include/net/mana/mana.h index > 51d26ebeff6c..f8dd19860103 100644 > --- a/include/net/mana/mana.h > +++ b/include/net/mana/mana.h > @@ -61,8 +61,11 @@ enum TRI_STATE { > > #define MAX_PORTS_IN_MANA_DEV 256 > > +/* Maximum number of packets per coalesced CQE */ #define > +MANA_RXCOMP_OOB_NUM_PPI 4 > + > /* Update this count whenever the respective structures are changed */ - > #define MANA_STATS_RX_COUNT 5 > +#define MANA_STATS_RX_COUNT (6 + MANA_RXCOMP_OOB_NUM_PPI - 1) > #define MANA_STATS_TX_COUNT 11 > > #define MANA_RX_FRAG_ALIGNMENT 64 > @@ -73,6 +76,8 @@ struct mana_stats_rx { > u64 xdp_drop; > u64 xdp_tx; > u64 xdp_redirect; > + u64 pkt_len0_err; > + u64 coalesced_cqe[MANA_RXCOMP_OOB_NUM_PPI - 1]; > struct u64_stats_sync syncp; > }; > > @@ -227,8 +232,6 @@ struct mana_rxcomp_perpkt_info { > u32 pkt_hash; > }; /* HW DATA */ > > -#define MANA_RXCOMP_OOB_NUM_PPI 4 > - > /* Receive completion OOB */ > struct mana_rxcomp_oob { > struct mana_cqe_header cqe_hdr; > @@ -378,7 +381,6 @@ struct mana_ethtool_stats { > u64 tx_cqe_err; > u64 tx_cqe_unknown_type; > u64 tx_linear_pkt_cnt; > - u64 rx_coalesced_err; > u64 rx_cqe_unknown_type; > }; > > -- > 2.34.1
