[PATCH net-next 1/6] net: hns3: add support for page_pool_get_stats

From: Jijie Shao
Date: Sun Dec 10 2023 - 21:12:49 EST


From: Jian Shen <shenjian15@xxxxxxxxxx>

Add support for page_pool_get_stats, then the hns3 driver
can get page pool statistics by ethtool.

Signed-off-by: Jian Shen <shenjian15@xxxxxxxxxx>
Signed-off-by: Jijie Shao <shaojijie@xxxxxxxxxx>
---
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 5 +++
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 1 +
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 38 ++++++++++++++++++-
3 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index b618797a7e8d..94b27332cc3f 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -4959,6 +4959,11 @@ static void hns3_alloc_page_pool(struct hns3_enet_ring *ring)
}
}

+bool hns3_is_page_pool_enabled(void)
+{
+ return page_pool_enabled;
+}
+
static int hns3_alloc_ring_memory(struct hns3_enet_ring *ring)
{
int ret;
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
index acd756b0c7c9..75fd3638d724 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
@@ -754,4 +754,5 @@ void hns3_cq_period_mode_init(struct hns3_nic_priv *priv,

void hns3_external_lb_prepare(struct net_device *ndev, bool if_running);
void hns3_external_lb_restore(struct net_device *ndev, bool if_running);
+bool hns3_is_page_pool_enabled(void);
#endif
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
index 682239f33082..38e796f61475 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
@@ -5,6 +5,7 @@
#include <linux/string.h>
#include <linux/phy.h>
#include <linux/sfp.h>
+#include <net/page_pool/helpers.h>

#include "hns3_enet.h"
#include "hns3_ethtool.h"
@@ -474,14 +475,19 @@ static int hns3_get_sset_count(struct net_device *netdev, int stringset)
{
struct hnae3_handle *h = hns3_get_handle(netdev);
const struct hnae3_ae_ops *ops = h->ae_algo->ops;
+ int pp_stats_count = 0;

if (!ops->get_sset_count)
return -EOPNOTSUPP;

switch (stringset) {
case ETH_SS_STATS:
+#ifdef CONFIG_PAGE_POOL_STATS
+ if (hns3_is_page_pool_enabled())
+ pp_stats_count = page_pool_ethtool_stats_get_count();
+#endif
return ((HNS3_TQP_STATS_COUNT * h->kinfo.num_tqps) +
- ops->get_sset_count(h, stringset));
+ ops->get_sset_count(h, stringset) + pp_stats_count);

case ETH_SS_TEST:
return ops->get_sset_count(h, stringset);
@@ -549,6 +555,10 @@ static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)

switch (stringset) {
case ETH_SS_STATS:
+#ifdef CONFIG_PAGE_POOL_STATS
+ if (hns3_is_page_pool_enabled())
+ buff = page_pool_ethtool_stats_get_strings(buff);
+#endif
buff = hns3_get_strings_tqps(h, buff);
ops->get_strings(h, stringset, (u8 *)buff);
break;
@@ -596,6 +606,28 @@ static u64 *hns3_get_stats_tqps(struct hnae3_handle *handle, u64 *data)
return data;
}

+#ifdef CONFIG_PAGE_POOL_STATS
+static u64 *hns3_ethtool_pp_stats(struct hnae3_handle *handle, u64 *data)
+{
+ struct hns3_nic_priv *priv = handle->priv;
+ int ring_num = handle->kinfo.num_tqps;
+ struct page_pool_stats stats = {0};
+ struct page_pool *page_pool;
+ int i;
+
+ if (!hns3_is_page_pool_enabled())
+ return data;
+
+ for (i = 0; i < ring_num; i++) {
+ page_pool = priv->ring[i + ring_num].page_pool;
+ if (page_pool)
+ page_pool_get_stats(page_pool, &stats);
+ }
+
+ return page_pool_ethtool_stats_get(data, &stats);
+}
+#endif
+
/* hns3_get_stats - get detail statistics.
* @netdev: net device
* @stats: statistics info.
@@ -617,6 +649,10 @@ static void hns3_get_stats(struct net_device *netdev,
return;
}

+#ifdef CONFIG_PAGE_POOL_STATS
+ p = hns3_ethtool_pp_stats(h, p);
+#endif
+
h->ae_algo->ops->update_stats(h);

/* get per-queue stats */
--
2.30.0