Skip to contentSkip to conversation

net: mvneta: add support for page_pool_get_stats

PATCH Superseded Lorenzo Bianconi 3 participants 5 messages Apr 11, 2022

Subsystems (4)

v4 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

v4 cover net: mvneta: add support for page_pool_get_stats

Introduce page_pool stats ethtool APIs in order to avoid driver duplicated code.

Changes since v3:
- get rid of wrong for loop in page_pool_ethtool_stats_get()
- add API stubs when page_pool_stats are not compiled in

Changes since v2:
- remove enum list of page_pool stats in page_pool.h
- remove leftover change in mvneta.c for ethtool_stats array allocation

Changes since v1:
- move stats accounting to page_pool code
- move stats string management to page_pool code

Lorenzo Bianconi (2):
net: page_pool: introduce ethtool stats
net: mvneta: add support for page_pool_get_stats

 drivers/net/ethernet/marvell/Kconfig  |  1 +
 drivers/net/ethernet/marvell/mvneta.c | 20 ++++++++-
 include/net/page_pool.h               | 21 +++++++++
 net/core/page_pool.c                  | 63 ++++++++++++++++++++++++++-
 4 files changed, 103 insertions(+), 2 deletions(-)
Signature · 1 line
2.35.1
#1 lore raw

PATCH v4 1/2 net: page_pool: introduce ethtool stats

Introduce page_pool APIs to report stats through ethtool and reduce duplicated code in each driver.

---
 include/net/page_pool.h | 21 ++++++++++++++
 net/core/page_pool.c    | 63 ++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 83 insertions(+), 1 deletion(-)
include/net/page_pool.h +21 -0
index ea5fb70e5101..813c93499f20 100644
@@ -117,6 +117,10 @@ struct page_pool_stats {
 	struct page_pool_recycle_stats recycle_stats;
 };
 
+int page_pool_ethtool_stats_get_count(void);
+u8 *page_pool_ethtool_stats_get_strings(u8 *data);
+u64 *page_pool_ethtool_stats_get(u64 *data, void *stats);
+
 /*
  * Drivers that wish to harvest page pool stats and report them to users
  * (perhaps via ethtool, debugfs, or another mechanism) can allocate a
@@ -124,6 +128,23 @@ struct page_pool_stats {
  */
 bool page_pool_get_stats(struct page_pool *pool,
 			 struct page_pool_stats *stats);
+#else
+
+static inline int page_pool_ethtool_stats_get_count(void)
+{
+	return 0;
+}
+
+static inline u8 *page_pool_ethtool_stats_get_strings(u8 *data)
+{
+	return data;
+}
+
+static inline u64 *page_pool_ethtool_stats_get(u64 *data, void *stats)
+{
+	return data;
+}
+
 #endif
 
 struct page_pool {
net/core/page_pool.c +62 -1

87 lines not on this page · raw message

Signature · 1 line
2.35.1
#2 lore raw

PATCH v4 2/2 net: mvneta: add support for page_pool_get_stats

In reply to Lorenzo Bianconi

Introduce support for the page_pool stats APIs into mvneta driver. Report page_pool stats through ethtool.

---
 drivers/net/ethernet/marvell/Kconfig  |  1 +
 drivers/net/ethernet/marvell/mvneta.c | 20 +++++++++++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)
drivers/net/ethernet/marvell/Kconfig +1 -0
index fe0989c0fc25..1240cb2dc07f 100644
@@ -62,6 +62,7 @@ config MVNETA
 	select MVMDIO
 	select PHYLINK
 	select PAGE_POOL
+	select PAGE_POOL_STATS
 	help
 	  This driver supports the network interface units in the
 	  Marvell ARMADA XP, ARMADA 370, ARMADA 38x and
drivers/net/ethernet/marvell/mvneta.c +19 -1
index 934f6dd90992..f6a54c7f0c69 100644
@@ -4735,6 +4735,9 @@ static void mvneta_ethtool_get_strings(struct net_device *netdev, u32 sset,
 		for (i = 0; i < ARRAY_SIZE(mvneta_statistics); i++)
 			memcpy(data + i * ETH_GSTRING_LEN,
 			       mvneta_statistics[i].name, ETH_GSTRING_LEN);
+
+		data += ETH_GSTRING_LEN * ARRAY_SIZE(mvneta_statistics);
+		page_pool_ethtool_stats_get_strings(data);
 	}
 }
 
@@ -4847,6 +4850,17 @@ static void mvneta_ethtool_update_stats(struct mvneta_port *pp)
 	}
 }
 
+static void mvneta_ethtool_pp_stats(struct mvneta_port *pp, u64 *data)
+{
+	struct page_pool_stats stats = {};
+	int i;
+
+	for (i = 0; i < rxq_number; i++)
+		page_pool_get_stats(pp->rxqs[i].page_pool, &stats);
+
+	page_pool_ethtool_stats_get(data, &stats);
+}
+
 static void mvneta_ethtool_get_stats(struct net_device *dev,
 				     struct ethtool_stats *stats, u64 *data)
 {
@@ -4857,12 +4871,16 @@ static void mvneta_ethtool_get_stats(struct net_device *dev,
 
 	for (i = 0; i < ARRAY_SIZE(mvneta_statistics); i++)
 		*data++ = pp->ethtool_stats[i];
+
+	mvneta_ethtool_pp_stats(pp, data);
 }
 
 static int mvneta_ethtool_get_sset_count(struct net_device *dev, int sset)
 {
 	if (sset == ETH_SS_STATS)
-		return ARRAY_SIZE(mvneta_statistics);
+		return ARRAY_SIZE(mvneta_statistics) +
+		       page_pool_ethtool_stats_get_count();
+
 	return -EOPNOTSUPP;
 }
 
Signature · 1 line
2.35.1
maintainer
#3 lore raw
In reply to Lorenzo Bianconi
Quoted 2 lines · On Mon, 11 Apr 2022 17:11:40 +0200 Lorenzo Bianconi wrote:

Introduce page_pool stats ethtool APIs in order to avoid driver duplicated code.

Does not apply at the time of posting.

If series depends on other patches people post it as RFC until dependencies are merged.

#4 lore raw
Quoted 5 lines · On Mon, 11 Apr 2022 17:11:40 +0200 Lorenzo Bianconi wrote:
Quoted 2 lines

Introduce page_pool stats ethtool APIs in order to avoid driver duplicated code.

Does not apply at the time of posting.

Yep, sorry. This series depends on the following patch I posted:

"v2: page_pool: Add recycle stats to page_pool_put_page_bulk"
https://lore.kernel.org/netdev/CAC_iWjJZYBR2OAUJuqrUU+UxX3G17OLZ6sgchOhfaWgB=reGTw@mail.gmail.com/T/#t

I will repost when it is merged.

Regards,
Lorenzo

Quoted 4 lines

If series depends on other patches people post it as RFC until dependencies are merged.