ionic: pull per-q stats work out of queue loops
authorShannon Nelson <snelson@pensando.io>
Tue, 30 Mar 2021 19:52:10 +0000 (12:52 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 Mar 2021 00:37:13 +0000 (17:37 -0700)
Abstract out the per-queue data collection work into separate
functions from the per-queue loops in the stats reporting,
similar to what Alex did for the data label strings in
commit acebe5b6107c ("ionic: Update driver to use ethtool_sprintf")

Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_stats.c

index 308b4ac..ed9cf93 100644 (file)
@@ -177,31 +177,42 @@ static const struct ionic_stat_desc ionic_dbg_napi_stats_desc[] = {
 
 #define MAX_Q(lif)   ((lif)->netdev->real_num_tx_queues)
 
+static void ionic_add_lif_txq_stats(struct ionic_lif *lif, int q_num,
+                                   struct ionic_lif_sw_stats *stats)
+{
+       struct ionic_tx_stats *txstats = &lif->txqstats[q_num];
+
+       stats->tx_packets += txstats->pkts;
+       stats->tx_bytes += txstats->bytes;
+       stats->tx_tso += txstats->tso;
+       stats->tx_tso_bytes += txstats->tso_bytes;
+       stats->tx_csum_none += txstats->csum_none;
+       stats->tx_csum += txstats->csum;
+}
+
+static void ionic_add_lif_rxq_stats(struct ionic_lif *lif, int q_num,
+                                   struct ionic_lif_sw_stats *stats)
+{
+       struct ionic_rx_stats *rxstats = &lif->rxqstats[q_num];
+
+       stats->rx_packets += rxstats->pkts;
+       stats->rx_bytes += rxstats->bytes;
+       stats->rx_csum_none += rxstats->csum_none;
+       stats->rx_csum_complete += rxstats->csum_complete;
+       stats->rx_csum_error += rxstats->csum_error;
+}
+
 static void ionic_get_lif_stats(struct ionic_lif *lif,
                                struct ionic_lif_sw_stats *stats)
 {
-       struct ionic_tx_stats *txstats;
-       struct ionic_rx_stats *rxstats;
        struct rtnl_link_stats64 ns;
        int q_num;
 
        memset(stats, 0, sizeof(*stats));
 
        for (q_num = 0; q_num < MAX_Q(lif); q_num++) {
-               txstats = &lif->txqstats[q_num];
-               stats->tx_packets += txstats->pkts;
-               stats->tx_bytes += txstats->bytes;
-               stats->tx_tso += txstats->tso;
-               stats->tx_tso_bytes += txstats->tso_bytes;
-               stats->tx_csum_none += txstats->csum_none;
-               stats->tx_csum += txstats->csum;
-
-               rxstats = &lif->rxqstats[q_num];
-               stats->rx_packets += rxstats->pkts;
-               stats->rx_bytes += rxstats->bytes;
-               stats->rx_csum_none += rxstats->csum_none;
-               stats->rx_csum_complete += rxstats->csum_complete;
-               stats->rx_csum_error += rxstats->csum_error;
+               ionic_add_lif_txq_stats(lif, q_num, stats);
+               ionic_add_lif_rxq_stats(lif, q_num, stats);
        }
 
        ionic_get_stats64(lif->netdev, &ns);
@@ -214,16 +225,12 @@ static void ionic_get_lif_stats(struct ionic_lif *lif,
 
 static u64 ionic_sw_stats_get_count(struct ionic_lif *lif)
 {
-       u64 total = 0;
+       u64 total = 0, tx_queues = MAX_Q(lif), rx_queues = MAX_Q(lif);
 
        /* lif stats */
        total += IONIC_NUM_LIF_STATS;
-
-       /* tx stats */
-       total += MAX_Q(lif) * IONIC_NUM_TX_STATS;
-
-       /* rx stats */
-       total += MAX_Q(lif) * IONIC_NUM_RX_STATS;
+       total += tx_queues * IONIC_NUM_TX_STATS;
+       total += rx_queues * IONIC_NUM_RX_STATS;
 
        /* port stats */
        total += IONIC_NUM_PORT_STATS;
@@ -231,13 +238,13 @@ static u64 ionic_sw_stats_get_count(struct ionic_lif *lif)
        if (test_bit(IONIC_LIF_F_UP, lif->state) &&
            test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state)) {
                /* tx debug stats */
-               total += MAX_Q(lif) * (IONIC_NUM_DBG_CQ_STATS +
+               total += tx_queues * (IONIC_NUM_DBG_CQ_STATS +
                                      IONIC_NUM_TX_Q_STATS +
                                      IONIC_NUM_DBG_INTR_STATS +
                                      IONIC_MAX_NUM_SG_CNTR);
 
                /* rx debug stats */
-               total += MAX_Q(lif) * (IONIC_NUM_DBG_CQ_STATS +
+               total += rx_queues * (IONIC_NUM_DBG_CQ_STATS +
                                      IONIC_NUM_DBG_INTR_STATS +
                                      IONIC_NUM_DBG_NAPI_STATS +
                                      IONIC_MAX_NUM_NAPI_CNTR);
@@ -315,13 +322,99 @@ static void ionic_sw_stats_get_strings(struct ionic_lif *lif, u8 **buf)
                ionic_sw_stats_get_rx_strings(lif, buf, q_num);
 }
 
+static void ionic_sw_stats_get_txq_values(struct ionic_lif *lif, u64 **buf,
+                                         int q_num)
+{
+       struct ionic_tx_stats *txstats;
+       struct ionic_qcq *txqcq;
+       int i;
+
+       txstats = &lif->txqstats[q_num];
+
+       for (i = 0; i < IONIC_NUM_TX_STATS; i++) {
+               **buf = IONIC_READ_STAT64(txstats, &ionic_tx_stats_desc[i]);
+               (*buf)++;
+       }
+
+       if (!test_bit(IONIC_LIF_F_UP, lif->state) ||
+           !test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state))
+               return;
+
+       txqcq = lif->txqcqs[q_num];
+       for (i = 0; i < IONIC_NUM_TX_Q_STATS; i++) {
+               **buf = IONIC_READ_STAT64(&txqcq->q,
+                                         &ionic_txq_stats_desc[i]);
+               (*buf)++;
+       }
+       for (i = 0; i < IONIC_NUM_DBG_CQ_STATS; i++) {
+               **buf = IONIC_READ_STAT64(&txqcq->cq,
+                                         &ionic_dbg_cq_stats_desc[i]);
+               (*buf)++;
+       }
+       for (i = 0; i < IONIC_NUM_DBG_INTR_STATS; i++) {
+               **buf = IONIC_READ_STAT64(&txqcq->intr,
+                                         &ionic_dbg_intr_stats_desc[i]);
+               (*buf)++;
+       }
+       for (i = 0; i < IONIC_NUM_DBG_NAPI_STATS; i++) {
+               **buf = IONIC_READ_STAT64(&txqcq->napi_stats,
+                                         &ionic_dbg_napi_stats_desc[i]);
+               (*buf)++;
+       }
+       for (i = 0; i < IONIC_MAX_NUM_NAPI_CNTR; i++) {
+               **buf = txqcq->napi_stats.work_done_cntr[i];
+               (*buf)++;
+       }
+       for (i = 0; i < IONIC_MAX_NUM_SG_CNTR; i++) {
+               **buf = txstats->sg_cntr[i];
+               (*buf)++;
+       }
+}
+
+static void ionic_sw_stats_get_rxq_values(struct ionic_lif *lif, u64 **buf,
+                                         int q_num)
+{
+       struct ionic_rx_stats *rxstats;
+       struct ionic_qcq *rxqcq;
+       int i;
+
+       rxstats = &lif->rxqstats[q_num];
+
+       for (i = 0; i < IONIC_NUM_RX_STATS; i++) {
+               **buf = IONIC_READ_STAT64(rxstats, &ionic_rx_stats_desc[i]);
+               (*buf)++;
+       }
+
+       if (!test_bit(IONIC_LIF_F_UP, lif->state) ||
+           !test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state))
+               return;
+
+       rxqcq = lif->rxqcqs[q_num];
+       for (i = 0; i < IONIC_NUM_DBG_CQ_STATS; i++) {
+               **buf = IONIC_READ_STAT64(&rxqcq->cq,
+                                         &ionic_dbg_cq_stats_desc[i]);
+               (*buf)++;
+       }
+       for (i = 0; i < IONIC_NUM_DBG_INTR_STATS; i++) {
+               **buf = IONIC_READ_STAT64(&rxqcq->intr,
+                                         &ionic_dbg_intr_stats_desc[i]);
+               (*buf)++;
+       }
+       for (i = 0; i < IONIC_NUM_DBG_NAPI_STATS; i++) {
+               **buf = IONIC_READ_STAT64(&rxqcq->napi_stats,
+                                         &ionic_dbg_napi_stats_desc[i]);
+               (*buf)++;
+       }
+       for (i = 0; i < IONIC_MAX_NUM_NAPI_CNTR; i++) {
+               **buf = rxqcq->napi_stats.work_done_cntr[i];
+               (*buf)++;
+       }
+}
+
 static void ionic_sw_stats_get_values(struct ionic_lif *lif, u64 **buf)
 {
        struct ionic_port_stats *port_stats;
        struct ionic_lif_sw_stats lif_stats;
-       struct ionic_qcq *txqcq, *rxqcq;
-       struct ionic_tx_stats *txstats;
-       struct ionic_rx_stats *rxstats;
        int i, q_num;
 
        ionic_get_lif_stats(lif, &lif_stats);
@@ -338,73 +431,11 @@ static void ionic_sw_stats_get_values(struct ionic_lif *lif, u64 **buf)
                (*buf)++;
        }
 
-       for (q_num = 0; q_num < MAX_Q(lif); q_num++) {
-               txstats = &lif->txqstats[q_num];
-
-               for (i = 0; i < IONIC_NUM_TX_STATS; i++) {
-                       **buf = IONIC_READ_STAT64(txstats,
-                                                 &ionic_tx_stats_desc[i]);
-                       (*buf)++;
-               }
-
-               if (test_bit(IONIC_LIF_F_UP, lif->state) &&
-                   test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state)) {
-                       txqcq = lif->txqcqs[q_num];
-                       for (i = 0; i < IONIC_NUM_TX_Q_STATS; i++) {
-                               **buf = IONIC_READ_STAT64(&txqcq->q,
-                                                     &ionic_txq_stats_desc[i]);
-                               (*buf)++;
-                       }
-                       for (i = 0; i < IONIC_NUM_DBG_CQ_STATS; i++) {
-                               **buf = IONIC_READ_STAT64(&txqcq->cq,
-                                                  &ionic_dbg_cq_stats_desc[i]);
-                               (*buf)++;
-                       }
-                       for (i = 0; i < IONIC_NUM_DBG_INTR_STATS; i++) {
-                               **buf = IONIC_READ_STAT64(&txqcq->intr,
-                                                &ionic_dbg_intr_stats_desc[i]);
-                               (*buf)++;
-                       }
-                       for (i = 0; i < IONIC_MAX_NUM_SG_CNTR; i++) {
-                               **buf = txstats->sg_cntr[i];
-                               (*buf)++;
-                       }
-               }
-       }
+       for (q_num = 0; q_num < MAX_Q(lif); q_num++)
+               ionic_sw_stats_get_txq_values(lif, buf, q_num);
 
-       for (q_num = 0; q_num < MAX_Q(lif); q_num++) {
-               rxstats = &lif->rxqstats[q_num];
-
-               for (i = 0; i < IONIC_NUM_RX_STATS; i++) {
-                       **buf = IONIC_READ_STAT64(rxstats,
-                                                 &ionic_rx_stats_desc[i]);
-                       (*buf)++;
-               }
-
-               if (test_bit(IONIC_LIF_F_UP, lif->state) &&
-                   test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state)) {
-                       rxqcq = lif->rxqcqs[q_num];
-                       for (i = 0; i < IONIC_NUM_DBG_CQ_STATS; i++) {
-                               **buf = IONIC_READ_STAT64(&rxqcq->cq,
-                                                  &ionic_dbg_cq_stats_desc[i]);
-                               (*buf)++;
-                       }
-                       for (i = 0; i < IONIC_NUM_DBG_INTR_STATS; i++) {
-                               **buf = IONIC_READ_STAT64(&rxqcq->intr,
-                                                &ionic_dbg_intr_stats_desc[i]);
-                               (*buf)++;
-                       }
-                       for (i = 0; i < IONIC_NUM_DBG_NAPI_STATS; i++) {
-                               **buf = IONIC_READ_STAT64(&rxqcq->napi_stats,
-                                                &ionic_dbg_napi_stats_desc[i]);
-                               (*buf)++;
-                       }
-                       for (i = 0; i < IONIC_MAX_NUM_NAPI_CNTR; i++) {
-                               **buf = rxqcq->napi_stats.work_done_cntr[i];
-                               (*buf)++;
-                       }
-               }
-       }
+       for (q_num = 0; q_num < MAX_Q(lif); q_num++)
+               ionic_sw_stats_get_rxq_values(lif, buf, q_num);
 }
 
 const struct ionic_stats_group_intf ionic_stats_groups[] = {