[v4,1/9] ethdev: specify return value of xstats-get API
Checks
Commit Message
Currently the value returned when xstats is NULL of rte_eth_xstats_get()
is not specified, some PMDs (eg. hns3/ipn3ke/mvpp2/axgbe) return zero
while others return the required number of elements.
In this patch, special parameter combinations are restricted:
1. specify that xstats is NULL if and only if n is 0.
2. specify that if n is lower than the required number of elements, the
function returns the required number of elements.
3. specify that if n is zero, the xstats must be NULL, the function
returns the required number of elements.
This patch also makes sure that xstats is NULL if n is lower or equal to
the number of basic stats when invoke driver's ops.
Fixes: ce757f5c9a4d ("ethdev: new method to retrieve extended statistics")
Cc: stable@dpdk.org
Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
lib/ethdev/rte_ethdev.c | 4 +++-
lib/ethdev/rte_ethdev.h | 6 +++++-
2 files changed, 8 insertions(+), 2 deletions(-)
@@ -2973,6 +2973,8 @@ rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
int ret;
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+ if (xstats == NULL && n > 0)
+ return -EINVAL;
dev = &rte_eth_devices[port_id];
nb_rxqs = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
@@ -2989,7 +2991,7 @@ rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
* xstats struct.
*/
xcount = (*dev->dev_ops->xstats_get)(dev,
- xstats ? xstats + count : NULL,
+ (n > count) ? xstats + count : NULL,
(n > count) ? n - count : 0);
if (xcount < 0)
@@ -3174,9 +3174,13 @@ int rte_eth_xstats_get_names(uint16_t port_id,
* @param xstats
* A pointer to a table of structure of type *rte_eth_xstat*
* to be filled with device statistics ids and values.
- * This parameter can be set to NULL if n is 0.
+ * This parameter can be set to NULL if and only if n is 0.
* @param n
* The size of the xstats array (number of elements).
+ * If lower than the required number of elements, the function returns
+ * the required number of elements.
+ * If equal to zero, the xstats must be NULL, the function returns the
+ * required number of elements.
* @return
* - A positive value lower or equal to n: success. The return value
* is the number of entries filled in the stats table.