<snip> Hi Chengwen,
While testing the IOAT driver I realised that we hadn't implemented the new RTE_DMADEV_ALL_VCHAN flag for stats. Rather than every driver that only supports 1 vchan enabling support for this flag it would probably be better to catch it in the library as shown below. Thanks, Conor. > +int > +rte_dmadev_stats_get(uint16_t dev_id, uint16_t vchan, > + struct rte_dmadev_stats *stats) > +{ > + const struct rte_dmadev *dev = &rte_dmadevices[dev_id]; > + > + RTE_DMADEV_VALID_DEV_ID_OR_ERR_RET(dev_id, -EINVAL); > + if (stats == NULL) > + return -EINVAL; > + if (vchan >= dev->data->dev_conf.nb_vchans && > + vchan != RTE_DMADEV_ALL_VCHAN) { > + RTE_DMADEV_LOG(ERR, > + "Device %u vchan %u out of range", dev_id, vchan); > + return -EINVAL; > + } if (vchan == RTE_DMADEV_ALL_VCHAN && dev->data->dev_conf.nb_vchans == 1) vchan = 0; > + > + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_get, - > ENOTSUP); > + memset(stats, 0, sizeof(struct rte_dmadev_stats)); > + return (*dev->dev_ops->stats_get)(dev, vchan, stats, > + sizeof(struct rte_dmadev_stats)); > +} > + > +int > +rte_dmadev_stats_reset(uint16_t dev_id, uint16_t vchan) > +{ > + struct rte_dmadev *dev = &rte_dmadevices[dev_id]; > + > + RTE_DMADEV_VALID_DEV_ID_OR_ERR_RET(dev_id, -EINVAL); > + if (vchan >= dev->data->dev_conf.nb_vchans && > + vchan != RTE_DMADEV_ALL_VCHAN) { > + RTE_DMADEV_LOG(ERR, > + "Device %u vchan %u out of range", dev_id, vchan); > + return -EINVAL; > + } if (vchan == RTE_DMADEV_ALL_VCHAN && dev->data->dev_conf.nb_vchans == 1) vchan = 0; > + > + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_reset, - > ENOTSUP); > + return (*dev->dev_ops->stats_reset)(dev, vchan); > +} <snip>