From: Ivan Ilchenko <ivan.ilche...@oktetlabs.ru>

Optimize getting number of SW stats by caching the
value during device configure since it's the only
place it may change.

Signed-off-by: Ivan Ilchenko <ivan.ilche...@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <andrew.rybche...@oktetlabs.ru>
---
 drivers/net/sfc/sfc.h          |  2 ++
 drivers/net/sfc/sfc_sw_stats.c | 14 ++++----------
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 93d5202a24..b9ff8baed2 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -218,6 +218,8 @@ struct sfc_counter_rxq {
 };
 
 struct sfc_sw_stats {
+       /* Number extended statistics provided by SW stats */
+       unsigned int                    xstats_count;
        uint64_t                        *reset_vals;
 
        rte_spinlock_t                  queues_bitmap_lock;
diff --git a/drivers/net/sfc/sfc_sw_stats.c b/drivers/net/sfc/sfc_sw_stats.c
index de99e1cfaf..0f93091500 100644
--- a/drivers/net/sfc/sfc_sw_stats.c
+++ b/drivers/net/sfc/sfc_sw_stats.c
@@ -329,17 +329,8 @@ sfc_sw_xstat_get_values_by_id(struct sfc_adapter *sa,
 unsigned int
 sfc_sw_xstats_get_nb_supported(struct sfc_adapter *sa)
 {
-       unsigned int nb_supported = 0;
-       unsigned int i;
-
        SFC_ASSERT(sfc_adapter_is_locked(sa));
-
-       for (i = 0; i < RTE_DIM(sfc_sw_stats_descr); i++) {
-               nb_supported += sfc_sw_xstat_get_nb_supported(sa,
-                                                       &sfc_sw_stats_descr[i]);
-       }
-
-       return nb_supported;
+       return sa->sw_stats.xstats_count;
 }
 
 void
@@ -506,6 +497,7 @@ sfc_sw_xstats_configure(struct sfc_adapter *sa)
        for (i = 0; i < RTE_DIM(sfc_sw_stats_descr); i++)
                nb_supported += sfc_sw_xstat_get_nb_supported(sa,
                                                        &sfc_sw_stats_descr[i]);
+       sa->sw_stats.xstats_count = nb_supported;
 
        *reset_vals = rte_realloc(*reset_vals,
                                  nb_supported * sizeof(**reset_vals), 0);
@@ -559,6 +551,7 @@ sfc_sw_xstats_alloc_queues_bitmap(struct sfc_adapter *sa)
 int
 sfc_sw_xstats_init(struct sfc_adapter *sa)
 {
+       sa->sw_stats.xstats_count = 0;
        sa->sw_stats.reset_vals = NULL;
 
        return sfc_sw_xstats_alloc_queues_bitmap(sa);
@@ -570,4 +563,5 @@ sfc_sw_xstats_close(struct sfc_adapter *sa)
        sfc_sw_xstats_free_queues_bitmap(sa);
        rte_free(sa->sw_stats.reset_vals);
        sa->sw_stats.reset_vals = NULL;
+       sa->sw_stats.xstats_count = 0;
 }
-- 
2.30.2

Reply via email to