Driver was returning 0 if the 'xstats' parameter being passed to xstats_get_op was NULL. This won't work on some applications that rely on a valid count being passed even in this case so that it can allocate memory accordingly followed by a reissue of the xstats_get_op to get the actual stats populated by the driver.
Fixes: 063e59ddd28 ("net/bnxt: fix crash in xstats get") Cc: sta...@dpdk.org Reviewed-by: Kalesh Anakkur Purayil <kalesh-anakkur.pura...@broadcom.com> Reviewed-by: Lance Richardson <lance.richard...@broadcom.com> Signed-off-by: Somnath Kotur <somnath.ko...@broadcom.com> --- drivers/net/bnxt/bnxt_stats.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c index 01d90dee8d..bb4b2eee19 100644 --- a/drivers/net/bnxt/bnxt_stats.c +++ b/drivers/net/bnxt/bnxt_stats.c @@ -594,10 +594,15 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev, if (rc) return rc; - if (xstats == NULL) - return 0; + stat_count = RTE_DIM(bnxt_rx_stats_strings) + + RTE_DIM(bnxt_tx_stats_strings) + + RTE_DIM(bnxt_func_stats_strings) + + RTE_DIM(bnxt_rx_ext_stats_strings) + + RTE_DIM(bnxt_tx_ext_stats_strings) + + bnxt_flow_stats_cnt(bp); - memset(xstats, 0, sizeof(*xstats)); + if (n < stat_count || xstats == NULL) + return stat_count; bnxt_hwrm_func_qstats(bp, 0xffff, NULL, &func_qstats); bnxt_hwrm_port_qstats(bp); @@ -609,17 +614,7 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev, (bp->fw_tx_port_stats_ext_size / stat_size)); - count = RTE_DIM(bnxt_rx_stats_strings) + - RTE_DIM(bnxt_tx_stats_strings) + - RTE_DIM(bnxt_func_stats_strings) + - RTE_DIM(bnxt_rx_ext_stats_strings) + - RTE_DIM(bnxt_tx_ext_stats_strings) + - bnxt_flow_stats_cnt(bp); - - stat_count = count; - - if (n < count) - return count; + memset(xstats, 0, sizeof(*xstats)); count = 0; for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) { -- 2.28.0.497.g54e85e7