> 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


Reply via email to