@@ -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;
@@ -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
@@ -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 */