net: mscc: ocelot: issue a warning if stats are incorrectly ordered
authorColin Foster <colin.foster@in-advantage.com>
Sat, 19 Nov 2022 23:14:06 +0000 (15:14 -0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Nov 2022 14:36:44 +0000 (15:36 +0100)
Ocelot uses regmap_bulk_read() operations to efficiently read stats
registers. Currently the implementation relies on the stats layout to be
ordered to be most efficient.

Issue a warning if any future implementations happen to break this pattern.

Signed-off-by: Colin Foster <colin.foster@in-advantage.com>
Co-developed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mscc/ocelot_stats.c

index 68e9f45..1478c3b 100644 (file)
@@ -602,7 +602,7 @@ EXPORT_SYMBOL(ocelot_port_get_stats64);
 static int ocelot_prepare_stats_regions(struct ocelot *ocelot)
 {
        struct ocelot_stats_region *region = NULL;
-       unsigned int last;
+       unsigned int last = 0;
        int i;
 
        INIT_LIST_HEAD(&ocelot->stats_regions);
@@ -619,6 +619,12 @@ static int ocelot_prepare_stats_regions(struct ocelot *ocelot)
                        if (!region)
                                return -ENOMEM;
 
+                       /* enum ocelot_stat must be kept sorted in the same
+                        * order as ocelot_stats_layout[i].reg in order to have
+                        * efficient bulking
+                        */
+                       WARN_ON(last >= ocelot_stats_layout[i].reg);
+
                        region->base = ocelot_stats_layout[i].reg;
                        region->count = 1;
                        list_add_tail(&region->node, &ocelot->stats_regions);