On Wed, Dec 23, 2020 at 3:14 PM Michael Shamis <michae...@marvell.com> wrote: > > Reviewed-by: Michael Shamis <michae...@marvell.com> > > -----Original Message----- > From: dev <dev-boun...@dpdk.org> On Behalf Of lir...@marvell.com > Sent: Wednesday, December 2, 2020 12:12 PM > To: Jerin Jacob Kollanukkaran <jer...@marvell.com> > Cc: dev@dpdk.org; Yuri Chipchev <yu...@marvell.com>; Liron Himi > <lir...@marvell.com> > Subject: [dpdk-dev] [PATCH v1 09/38] net/mvpp2: extend xstats support > > From: Yuri Chipchev <yu...@marvell.com> > > add xstats_by_id callbacks > > Signed-off-by: Yuri Chipchev <yu...@marvell.com> > Reviewed-by: Liron Himi <lir...@marvell.com> > --- > drivers/net/mvpp2/mrvl_ethdev.c | 90 +++++++++++++++++++++++++++++++++ > 1 file changed, 90 insertions(+) > > diff --git a/drivers/net/mvpp2/mrvl_ethdev.c > b/drivers/net/mvpp2/mrvl_ethdev.c index 46e7260be..e81d5ee91 100644 > --- a/drivers/net/mvpp2/mrvl_ethdev.c > +++ b/drivers/net/mvpp2/mrvl_ethdev.c > @@ -2027,6 +2027,94 @@ mrvl_eth_filter_ctrl(struct rte_eth_dev *dev > __rte_unused, > } > } > > +/** > + * DPDK callback to get xstats by id. > + * > + * @param dev > + * Pointer to the device structure. > + * @param ids > + * Pointer to the ids table. > + * @param values > + * Pointer to the values table. > + * @param n > + * Values table size. > + * @returns > + * Number of read values, negative value otherwise. > + */ > +static int > +mrvl_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, > + uint64_t *values, unsigned int n) { > + unsigned int i, num = RTE_DIM(mrvl_xstats_tbl); > + uint64_t vals[n];
Please add boundary checks for "n". > + int ret; > + > + if (!ids) { According to spec, if ids == NULL, we just need to return the size of max objects, no need to copy to values. > + struct rte_eth_xstat xstats[num]; > + int j; > + > + ret = mrvl_xstats_get(dev, xstats, num); > + for (j = 0; j < ret; i++) > + values[j] = xstats[j].value; > + > + return ret; > + } > + > + ret = mrvl_xstats_get_by_id(dev, NULL, vals, n); > + if (ret < 0) > + return ret; > + > + for (i = 0; i < n; i++) { > + if (ids[i] >= num) { > + MRVL_LOG(ERR, "id value is not valid\n"); > + return -1; > + } > + > + values[i] = vals[ids[i]]; > + } > + > + return n; > +} > + > +/** > + * DPDK callback to get xstats names by ids. > + * > + * @param dev > + * Pointer to the device structure. > + * @param xstats_names > + * Pointer to table with xstats names. > + * @param ids > + * Pointer to table with ids. > + * @param size > + * Xstats names table size. > + * @returns > + * Number of names read, negative value otherwise. > + */ > +static int > +mrvl_xstats_get_names_by_id(struct rte_eth_dev *dev, > + struct rte_eth_xstat_name *xstats_names, > + const uint64_t *ids, unsigned int size) { > + unsigned int i, num = RTE_DIM(mrvl_xstats_tbl); > + struct rte_eth_xstat_name names[num]; Above comments appliable here too. > + > + if (!ids) > + return mrvl_xstats_get_names(dev, xstats_names, size); > + > + mrvl_xstats_get_names(dev, names, size); > + for (i = 0; i < size; i++) { > + if (ids[i] >= num) { > + MRVL_LOG(ERR, "id value is not valid"); > + return -1; > + } > + > + snprintf(xstats_names[i].name, RTE_ETH_XSTATS_NAME_SIZE, > + "%s", names[ids[i]].name); > + } > + > + return size; > +} > + > /** > * DPDK callback to get rte_mtr callbacks. > * > @@ -2102,6 +2190,8 @@ static const struct eth_dev_ops mrvl_ops = { > .rss_hash_update = mrvl_rss_hash_update, > .rss_hash_conf_get = mrvl_rss_hash_conf_get, > .filter_ctrl = mrvl_eth_filter_ctrl, > + .xstats_get_by_id = mrvl_xstats_get_by_id, > + .xstats_get_names_by_id = mrvl_xstats_get_names_by_id, > .mtr_ops_get = mrvl_mtr_ops_get, > .tm_ops_get = mrvl_tm_ops_get, > }; > -- > 2.28.0 >