[PATCH v4-S3 19/65] net/dpaa2: reimplement xstats_get() on top of xstats_get_by_id()
Prashant Gupta
prashant.gupta_3 at nxp.com
Fri Oct 23 15:42:59 CEST 2026
From: Jun Yang <jun.yang at nxp.com>
dpaa2_dev_xstats_get() duplicated almost all of the logic already
present in dpaa2_dev_xstats_get_by_id(): it walked the DPNI pages
one by one with dpaa2_xstats_id_parse(), called dpni_get_statistics()
per page, special-cased the DPMAC counter range with its own
dpni_get_mac_statistics() path, handled per-page/per-MAC availability
with inline zero-fill loops, etc. All of that behavior is already
provided by dpaa2_dev_xstats_get_by_id(), so the standalone
implementation was just a second place to keep in sync.
Rewrite dpaa2_dev_xstats_get() as a thin wrapper:
- Clamp the requested count to DPAA2_XSTAT_MAX_NUM (new helper
defined as sizeof(struct dpaa2_xstats_seq) / sizeof(uint64_t))
with a warning when the caller asks for more.
- Build a trivial [0..n) id array, pre-zero the xstats[] entries,
and call dpaa2_dev_xstats_get_by_id() once.
- Copy the returned values into xstats[].value and return the
number of entries dpaa2_dev_xstats_get_by_id() produced.
Also reuse DPAA2_XSTAT_MAX_NUM in dpaa2_dev_xstats_get_names() and
dpaa2_dev_xstats_get_names_by_id() in place of the open-coded
sizeof(struct dpaa2_xstats_seq) / sizeof(uint64_t) local array
sizes, and move dpaa2_dev_xstats_get() below the _by_id variants
to reflect the new dependency direction.
No functional change: availability gating (DPNI page / DPMAC MC
version), per-page dpni_get_statistics() batching and the DPMAC
dpni_get_mac_statistics() path are all still performed, now solely
inside dpaa2_dev_xstats_get_by_id().
Signed-off-by: Jun Yang <jun.yang at nxp.com>
---
drivers/net/dpaa2/dpaa2_ethdev.c | 146 +++++++++----------------------
1 file changed, 42 insertions(+), 104 deletions(-)
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index b30a8e7b3d..a0c5eccf57 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -180,6 +180,9 @@ struct dpaa2_xstats_seq {
struct dpni_dpmac_counters mac_cnt;
};
+#define DPAA2_XSTAT_MAX_NUM \
+ (sizeof(struct dpaa2_xstats_seq) / sizeof(uint64_t))
+
#define DPAA2_DPNI_XSTAT_MAX_NUM \
(offsetof(struct dpaa2_xstats_seq, mac_cnt) / sizeof(uint64_t))
@@ -2186,115 +2189,13 @@ dpaa2_dev_dpni_xstats_avail(struct rte_eth_dev *dev,
return false;
}
-/*
- * dpaa2_dev_xstats_get(): Get counters of dpni and dpmac.
- * MAC (mac_*) counters are supported on MC version > 10.39.0
- * TC_x_policer_* counters are supported only when Policer is enable.
- */
-static int
-dpaa2_dev_xstats_get(struct rte_eth_dev *dev,
- struct rte_eth_xstat *xstats, uint32_t n)
-{
- struct fsl_mc_io *dpni = dev->process_private;
- uint16_t i, j, param, stat_cnt, size;
- struct dpaa2_dev_priv *priv = dev->data->dev_private;
- union dpni_statistics values;
- uint8_t page_id, stat_id;
- uint64_t *cnt_values;
- int retcode;
-
- stat_cnt = DPAA2_DPNI_XSTAT_MAX_NUM;
- if (priv->ep_dev_type == DPAA2_MAC)
- stat_cnt += DPAA2_MAC_NUM_STATS;
-
- if (n > stat_cnt) {
- DPAA2_PMD_ERR("%s: Expected number(%d) > max number(%d)",
- __func__, n, stat_cnt);
- return -EINVAL;
- }
-
- if (!xstats)
- return 0;
-
- i = 0;
- while (i < n) {
- if (i >= DPAA2_MAC_XSTATS_START_ID) {
- if (!dpaa2_dev_mac_xstats_avail(dev)) {
- for (j = i; j < n; j++) {
- xstats[j].id = j;
- xstats[j].value = 0;
- }
- i = n;
- break;
- }
- goto dpmac_get_xstat;
- }
-
- page_id = 0;
- stat_id = 0;
- param = 0;
- retcode = dpaa2_xstats_id_parse(i, &page_id, &stat_id, ¶m, &size);
- if (retcode)
- return retcode;
- if (!dpaa2_dev_dpni_xstats_avail(dev, page_id, param)) {
- xstats[i].id = i;
- xstats[i].value = 0;
- i++;
- continue;
- }
- retcode = dpni_get_statistics(dpni, CMD_PRI_LOW,
- priv->token, page_id, param, &values);
- if (retcode) {
- DPAA2_PMD_ERR("%s: Failed(%d) to get %s's statistcis of page%d!",
- __func__, retcode, dev->data->name, page_id);
- return retcode;
- }
- cnt_values = (void *)&values;
- j = stat_id;
- while (i < n && j < size) {
- xstats[i].id = i;
- xstats[i].value = cnt_values[j];
- i++;
- j++;
- }
- continue;
-
-dpmac_get_xstat:
- retcode = dpaa2_dev_xstat_mac_setup_mem(dev);
- if (retcode) {
- DPAA2_PMD_ERR("%s: Failed(%d) to setup %s MAC statistics!",
- __func__, retcode, dev->data->name);
- return retcode;
- }
- retcode = dpni_get_mac_statistics(dpni, CMD_PRI_LOW,
- priv->token, priv->cnt_idx_iova,
- priv->cnt_values_iova, DPAA2_MAC_NUM_STATS);
- if (retcode) {
- DPAA2_PMD_ERR("%s: Failed(%d) to get %s's MAC statistics!",
- __func__, retcode, dev->data->name);
- return retcode;
- }
- cnt_values = priv->cnt_values_dma_mem;
-
- j = i - DPAA2_MAC_XSTATS_START_ID;
- while (i < n && j < DPAA2_MAC_NUM_STATS) {
- xstats[i].id = i;
- xstats[i].value = cnt_values[j];
- i++;
- j++;
- }
- }
-
- return i;
-}
-
static int
dpaa2_dev_xstats_get_names(struct rte_eth_dev *dev,
struct rte_eth_xstat_name *xstats_names, uint32_t limit)
{
struct dpaa2_dev_priv *priv = dev->data->dev_private;
uint16_t i, stat_cnt;
- uint64_t xstat_str[sizeof(struct dpaa2_xstats_seq) / sizeof(uint64_t)];
+ uint64_t xstat_str[DPAA2_XSTAT_MAX_NUM];
stat_cnt = DPAA2_DPNI_XSTAT_MAX_NUM;
if (priv->ep_dev_type == DPAA2_MAC)
@@ -2420,7 +2321,7 @@ dpaa2_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,
{
struct dpaa2_dev_priv *priv = dev->data->dev_private;
uint16_t i, stat_cnt;
- uint64_t xstat_str[sizeof(struct dpaa2_xstats_seq) / sizeof(uint64_t)];
+ uint64_t xstat_str[DPAA2_XSTAT_MAX_NUM];
stat_cnt = DPAA2_DPNI_XSTAT_MAX_NUM;
if (priv->ep_dev_type == DPAA2_MAC)
@@ -2442,6 +2343,43 @@ dpaa2_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,
return limit;
}
+/*
+ * dpaa2_dev_xstats_get(): Get counters of dpni and dpmac.
+ * MAC (mac_*) counters are supported on MC version > 10.39.0
+ * TC_x_policer_* counters are supported only when Policer is enable.
+ */
+static int
+dpaa2_dev_xstats_get(struct rte_eth_dev *dev,
+ struct rte_eth_xstat *xstats, uint32_t n)
+{
+ int retcode;
+ uint32_t i;
+ uint64_t ids[DPAA2_XSTAT_MAX_NUM], vals[DPAA2_XSTAT_MAX_NUM];
+
+ if (!xstats || !n)
+ return 0;
+
+ if (n > DPAA2_XSTAT_MAX_NUM) {
+ DPAA2_PMD_WARN("%s: Expected xstat number(%d) > max(%ld)",
+ __func__, n, DPAA2_XSTAT_MAX_NUM);
+ n = DPAA2_XSTAT_MAX_NUM;
+ }
+ for (i = 0; i < n; i++) {
+ ids[i] = i;
+ xstats[i].id = i;
+ xstats[i].value = 0;
+ }
+
+ retcode = dpaa2_dev_xstats_get_by_id(dev, ids, vals, n);
+ if (retcode < 0)
+ return retcode;
+
+ for (i = 0; i < (uint32_t)retcode; i++)
+ xstats[i].value = vals[i];
+
+ return retcode;
+}
+
static int
dpaa2_dev_stats_get(struct rte_eth_dev *dev,
struct rte_eth_stats *stats, struct eth_queue_stats *qstats)
--
2.43.0
More information about the dev
mailing list