<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
Hi,</div>
<div id="appendonsend"></div>
<div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<hr style="display: inline-block; width: 98%;">
<div id="divRplyFwdMsg">
<div style="direction: ltr; font-family: Calibri, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);" class="elementToProof">
<b>From:</b> Bruce Richardson <bruce.richardson@intel.com><br>
<b>Sent:</b> Tuesday, September 23, 2025 10:12 PM<br>
<b>To:</b> dev@dpdk.org <dev@dpdk.org><br>
<b>Cc:</b> Bruce Richardson <bruce.richardson@intel.com>; John W. Linville <linville@tuxdriver.com>; Ciara Loftus <ciara.loftus@intel.com>; Maryam Tahhan <mtahhan@redhat.com>; shepard.siegel <shepard.siegel@atomicrules.com>; Ed Czeck <ed.czeck@atomicrules.com>;
John Miller <john.miller@atomicrules.com>; Igor Russkikh <irusskikh@marvell.com>; Steven Webster <steven.webster@windriver.com>; Matt Peters <matt.peters@windriver.com>; Selwin Sebastian <selwin.sebastian@amd.com>; Julien Aube <julien_dpdk@jaube.fr>; Ajit
Khaparde <ajit.khaparde@broadcom.com>; Somnath Kotur <somnath.kotur@broadcom.com>; Chas Williams <3chas3@gmail.com>; Min Hu (Connor) <humin29@huawei.com>; Nithin Dabilpuram <ndabilpuram@marvell.com>; Kiran Kumar K <kirankumark@marvell.com>; Sunil Kumar Kori
<skori@marvell.com>; Satha Rao <skoteshwar@marvell.com>; Harman Kalra <hkalra@marvell.com>; Potnuri Bharat Teja <bharat@chelsio.com>; Hemant Agrawal <hemant.agrawal@nxp.com>; Sachin Saxena <sachin.saxena@nxp.com>; Shai Brandes <shaibran@amazon.com>; Evgeny
Schemeilin <evgenys@amazon.com>; Ron Beider <rbeider@amazon.com>; Amit Bernstein <amitbern@amazon.com>; Wajeeh Atrash <atrwajee@amazon.com>; Gagandeep Singh <g.singh@nxp.com>; Apeksha Gupta <apeksha.gupta@nxp.com>; John Daley <johndale@cisco.com>; Hyong Youb
Kim <hyonkim@cisco.com>; Gaetan Rivet <grive@u256.net>; Jeroen de Borst <jeroendb@google.com>; Joshua Washington <joshwash@google.com>; Ziyang Xuan <xuanziyang2@huawei.com>; Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>; Xingui Yang <yangxingui@huawei.com>;
Chengwen Feng <fengchengwen@huawei.com>; Praveen Shetty <praveen.shetty@intel.com>; Vladimir Medvedkin <vladimir.medvedkin@intel.com>; Anatoly Burakov <anatoly.burakov@intel.com>; Jingjing Wu <jingjing.wu@intel.com>; Xu, Rosen <rosen.xu@altera.com>; Andrew
Boyer <andrew.boyer@amd.com>; Long Li <longli@microsoft.com>; Wei Hu <weh@microsoft.com>; Jakub Grajciar <jgrajcia@cisco.com>; Matan Azrad <matan@nvidia.com>; Viacheslav Ovsiienko <viacheslavo@nvidia.com>; Dariusz Sosnowski <dsosnowski@nvidia.com>; Bing Zhao
<bingz@nvidia.com>; Ori Kam <orika@nvidia.com>; Suanming Mou <suanmingm@nvidia.com>; Zyta Szpak <zyta@marvell.com>; Liron Himi <lironh@marvell.com>; Chaoyong He <chaoyong.he@corigine.com>; Jiawen Wu <jiawenwu@trustnetic.com>; Zaiyu Wang <zaiyuwang@trustnetic.com>;
Christian Koue Muf <ckm@napatech.com>; Serhii Iliushyk <sil-plv@napatech.com>; Tetsuya Mukawa <mtetsuyah@gmail.com>; Vamsi Attunuru <vattunuru@marvell.com>; Devendra Singh Rawat <dsinghrawat@marvell.com>; Alok Prasad <palok@marvell.com>; Howard Wang <howard_wang@realsil.com.cn>;
Chunhao Lin <hau@realtek.com>; Xing Wang <xing_wang@realsil.com.cn>; Wenbo Cao <caowenbo@mucse.com>; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>; Stephen Hemminger <stephen@networkplumber.org>; Jerin Jacob <jerinj@marvell.com>; Maciej Czekaj <mczekaj@marvell.com>;
Jian Wang <jianwang@trustnetic.com>; Maxime Coquelin <maxime.coquelin@redhat.com>; Chenbo Xia <chenbox@nvidia.com>; Jochen Behrens <jochen.behrens@broadcom.com>; Renyong Wan <wanry@yunsilicon.com>; Na Na <nana@yunsilicon.com>; Rong Qian <qianr@yunsilicon.com>;
Xiaoxiong Zhang <zhangxx@yunsilicon.com>; Dongwei Xu <xudw@yunsilicon.com>; Junlong Wang <wang.junlong1@zte.com.cn>; Lijie Shan <shan.lijie@zte.com.cn><br>
<b>Subject:</b> [RFC PATCH 4/6] drivers/net: update to remove queue stats from eth stats</div>
<div style="direction: ltr;"> </div>
</div>
<div style="font-size: 11pt;" class="elementToProof">Now that we have removed the queue stats from the ethdev stats, we need<br>
to update the various PMDs to take account of the changes.<br>
<br>
Update each stats_get function to take the extra parameters for qstats,<br>
just marking it as unused if the driver does not fill in queue stats.<br>
For those that do complete queue stats, update the structure reference<br>
as appropriate.<br>
<br>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com><br>
---<br>
drivers/net/af_packet/rte_eth_af_packet.c | 13 +-<br>
drivers/net/af_xdp/rte_eth_af_xdp.c | 35 +++--<br>
drivers/net/ark/ark_ethdev.c | 36 +++--<br>
drivers/net/ark/ark_ethdev_rx.c | 14 +-<br>
drivers/net/ark/ark_ethdev_rx.h | 3 +-<br>
drivers/net/ark/ark_ethdev_tx.c | 12 +-<br>
drivers/net/ark/ark_ethdev_tx.h | 3 +-<br>
drivers/net/atlantic/atl_ethdev.c | 19 +--<br>
drivers/net/atlantic/atl_types.h | 1 +<br>
drivers/net/avp/avp_ethdev.c | 20 ++-<br>
drivers/net/axgbe/axgbe_ethdev.c | 22 +--<br>
drivers/net/axgbe/axgbe_ethdev.h | 1 +<br>
drivers/net/bnx2x/bnx2x_ethdev.c | 3 +-<br>
drivers/net/bnxt/bnxt_reps.c | 14 +-<br>
drivers/net/bnxt/bnxt_reps.h | 2 +-<br>
drivers/net/bnxt/bnxt_stats.c | 133 ++++++++++--------<br>
drivers/net/bnxt/bnxt_stats.h | 2 +-<br>
drivers/net/bonding/rte_eth_bond_pmd.c | 14 +-<br>
drivers/net/cnxk/cnxk_ethdev.h | 3 +-<br>
drivers/net/cnxk/cnxk_rep.h | 3 +-<br>
drivers/net/cnxk/cnxk_rep_ops.c | 15 +-<br>
drivers/net/cnxk/cnxk_stats.c | 49 ++++---<br>
drivers/net/cxgbe/cxgbe_ethdev.c | 3 +-<br>
drivers/net/cxgbe/cxgbevf_ethdev.c | 3 +-<br>
drivers/net/dpaa/dpaa_ethdev.c | 3 +-<br>
drivers/net/dpaa2/dpaa2_ethdev.c | 28 ++--<br>
drivers/net/ena/ena_ethdev.c | 46 +++---<br>
drivers/net/enetc/enetc_ethdev.c | 4 +-<br>
drivers/net/enetfec/enet_ethdev.c | 3 +-<br>
drivers/net/enic/enic.h | 3 +-<br>
drivers/net/enic/enic_ethdev.c | 4 +-<br>
drivers/net/enic/enic_main.c | 3 +-<br>
drivers/net/enic/enic_vf_representor.c | 3 +-<br>
drivers/net/failsafe/failsafe_ether.c | 9 --<br>
drivers/net/failsafe/failsafe_ops.c | 3 +-<br>
drivers/net/gve/gve_ethdev.c | 4 +-<br>
drivers/net/hinic/hinic_pmd_ethdev.c | 64 ++++++---<br>
drivers/net/hns3/hns3_stats.c | 4 +-<br>
drivers/net/hns3/hns3_stats.h | 3 +-<br>
drivers/net/intel/cpfl/cpfl_ethdev.c | 3 +-<br>
drivers/net/intel/e1000/em_ethdev.c | 7 +-<br>
drivers/net/intel/e1000/igb_ethdev.c | 14 +-<br>
drivers/net/intel/e1000/igc_ethdev.c | 33 +++--<br>
drivers/net/intel/fm10k/fm10k_ethdev.c | 27 ++--<br>
drivers/net/intel/i40e/i40e_ethdev.c | 5 +-<br>
drivers/net/intel/i40e/i40e_vf_representor.c | 2 +-<br>
drivers/net/intel/iavf/iavf_ethdev.c | 5 +-<br>
drivers/net/intel/ice/ice_dcf_ethdev.c | 3 +-<br>
drivers/net/intel/ice/ice_ethdev.c | 5 +-<br>
drivers/net/intel/idpf/idpf_ethdev.c | 3 +-<br>
drivers/net/intel/ipn3ke/ipn3ke_representor.c | 3 +-<br>
drivers/net/intel/ixgbe/ixgbe_ethdev.c | 29 ++--<br>
drivers/net/ionic/ionic_ethdev.c | 6 +-<br>
drivers/net/ionic/ionic_lif.c | 35 +++--<br>
drivers/net/ionic/ionic_lif.h | 3 +-<br>
drivers/net/mana/mana.c | 15 +-<br>
drivers/net/memif/rte_eth_memif.c | 15 +-<br>
drivers/net/mlx4/mlx4.h | 3 +-<br>
drivers/net/mlx4/mlx4_ethdev.c | 17 +--<br>
drivers/net/mlx5/mlx5.h | 3 +-<br>
drivers/net/mlx5/mlx5_stats.c | 17 +--<br>
drivers/net/mvneta/mvneta_ethdev.c | 5 +-<br>
drivers/net/mvpp2/mrvl_ethdev.c | 23 +--<br>
drivers/net/netvsc/hn_ethdev.c | 17 +--<br>
drivers/net/netvsc/hn_var.h | 3 +-<br>
drivers/net/netvsc/hn_vf.c | 3 +-<br>
drivers/net/nfp/flower/nfp_flower.c | 8 +-<br>
.../net/nfp/flower/nfp_flower_representor.c | 19 +--<br>
.../net/nfp/flower/nfp_flower_representor.h | 3 +<br>
drivers/net/nfp/nfp_net_common.c | 46 +++---<br>
drivers/net/nfp/nfp_net_common.h | 4 +-<br>
drivers/net/ngbe/ngbe_ethdev.c | 53 +++----<br>
drivers/net/ngbe/ngbe_ethdev_vf.c | 5 +-<br>
drivers/net/ntnic/ntnic_ethdev.c | 22 +--<br>
drivers/net/null/rte_eth_null.c | 15 +-<br>
drivers/net/octeon_ep/otx_ep_ethdev.c | 17 ++-<br>
drivers/net/octeontx/octeontx_ethdev.c | 3 +-<br>
drivers/net/pcap/pcap_ethdev.c | 23 +--<br>
drivers/net/pfe/pfe_ethdev.c | 3 +-<br>
drivers/net/qede/qede_ethdev.c | 23 ++-<br>
drivers/net/r8169/r8169_ethdev.c | 6 +-<br>
drivers/net/ring/rte_eth_ring.c | 13 +-<br>
drivers/net/rnp/rnp_ethdev.c | 15 +-<br>
drivers/net/sfc/sfc_ethdev.c | 3 +-<br>
drivers/net/sfc/sfc_repr.c | 3 +-<br>
drivers/net/tap/rte_eth_tap.c | 23 +--<br>
drivers/net/thunderx/nicvf_ethdev.c | 27 ++--<br>
drivers/net/txgbe/txgbe_ethdev.c | 53 +++----<br>
drivers/net/txgbe/txgbe_ethdev_vf.c | 5 +-<br>
drivers/net/vhost/rte_eth_vhost.c | 26 ++--<br>
drivers/net/virtio/virtio_ethdev.c | 23 +--<br>
drivers/net/vmxnet3/vmxnet3_ethdev.c | 20 +--<br>
drivers/net/xsc/xsc_ethdev.c | 19 +--<br>
drivers/net/zxdh/zxdh_ethdev_ops.c | 39 ++---<br>
drivers/net/zxdh/zxdh_ethdev_ops.h | 3 +-<br>
95 files changed, 828 insertions(+), 605 deletions(-)<br>
<br>
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c<br>
index 85bc1201b4..88eb705a48 100644<br>
--- a/drivers/net/af_packet/rte_eth_af_packet.c<br>
+++ b/drivers/net/af_packet/rte_eth_af_packet.c<br>
@@ -426,7 +426,7 @@ packet_drop_count(int sockfd)<br>
}<br>
<br>
static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
{<br>
unsigned int i;<br>
unsigned long rx_total = 0, rx_dropped_total = 0, rx_nombuf_total = 0;<br>
@@ -448,11 +448,12 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
tx_err_total += internal->tx_queue[i].err_pkts;<br>
tx_bytes_total += internal->tx_queue[i].tx_bytes;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_ipackets[i] = internal->rx_queue[i].rx_pkts;<br>
- stats->q_ibytes[i] = internal->rx_queue[i].rx_bytes;<br>
- stats->q_opackets[i] = internal->tx_queue[i].tx_pkts;<br>
- stats->q_obytes[i] = internal->tx_queue[i].tx_bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = internal->rx_queue[i].rx_pkts;<br>
+ qstats->q_ibytes[i] = internal->rx_queue[i].rx_bytes;<br>
+ qstats->q_opackets[i] = internal->tx_queue[i].tx_pkts;<br>
+ qstats->q_obytes[i] = internal->tx_queue[i].tx_bytes;<br>
+ qstats->q_errors[i] = internal->rx_queue[i].rx_nombuf;<br>
}<br>
}<br>
<br>
diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c<br>
index f68895c93c..f2a8fb95d1 100644<br>
--- a/drivers/net/af_xdp/rte_eth_af_xdp.c<br>
+++ b/drivers/net/af_xdp/rte_eth_af_xdp.c<br>
@@ -892,7 +892,8 @@ eth_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)<br>
}<br>
<br>
static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct pmd_internals *internals = dev->data->dev_private;<br>
struct pmd_process_private *process_private = dev->process_private;<br>
@@ -901,20 +902,25 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
struct pkt_tx_queue *txq;<br>
socklen_t optlen;<br>
int i, ret, fd;<br>
+ unsigned long ipackets = 0, ibytes = 0, opackets = 0, obytes = 0;<br>
+ unsigned long oerrors = 0, imissed = 0;<br>
<br>
for (i = 0; i < dev->data->nb_rx_queues; i++) {<br>
optlen = sizeof(struct xdp_statistics);<br>
rxq = &internals->rx_queues[i];<br>
txq = rxq->pair;<br>
- stats->q_ipackets[i] = rxq->stats.rx_pkts;<br>
- stats->q_ibytes[i] = rxq->stats.rx_bytes;<br>
<br>
- stats->q_opackets[i] = txq->stats.tx_pkts;<br>
- stats->q_obytes[i] = txq->stats.tx_bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = rxq->stats.rx_pkts;<br>
+ qstats->q_ibytes[i] = rxq->stats.rx_bytes;<br>
+ qstats->q_opackets[i] = txq->stats.tx_pkts;<br>
+ qstats->q_obytes[i] = txq->stats.tx_bytes;<br>
+ qstats->q_errors[i] = 0; /* Not used */<br>
+ }<br>
<br>
- stats->ipackets += stats->q_ipackets[i];<br>
- stats->ibytes += stats->q_ibytes[i];<br>
- stats->oerrors += txq->stats.tx_dropped;<br>
+ ipackets += rxq->stats.rx_pkts;<br>
+ ibytes += rxq->stats.rx_bytes;<br>
+ oerrors += txq->stats.tx_dropped;<br>
fd = process_private->rxq_xsk_fds[i];<br>
ret = fd >= 0 ? getsockopt(fd, SOL_XDP, XDP_STATISTICS,<br>
&xdp_stats, &optlen) : -1;<br>
@@ -922,12 +928,19 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
AF_XDP_LOG_LINE(ERR, "getsockopt() failed for XDP_STATISTICS.");<br>
return -1;<br>
}<br>
- stats->imissed += xdp_stats.rx_dropped - rxq->stats.imissed_offset;<br>
+ imissed += xdp_stats.rx_dropped - rxq->stats.imissed_offset;<br>
<br>
- stats->opackets += stats->q_opackets[i];<br>
- stats->obytes += stats->q_obytes[i];<br>
+ opackets += txq->stats.tx_pkts;<br>
+ obytes += txq->stats.tx_bytes;<br>
}<br>
<br>
+ stats->ipackets = ipackets;<br>
+ stats->ibytes = ibytes;<br>
+ stats->opackets = opackets;<br>
+ stats->obytes = obytes;<br>
+ stats->oerrors = oerrors;<br>
+ stats->imissed = imissed;<br>
+<br>
return 0;<br>
}<br>
<br>
diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c<br>
index c029dc46b3..02d6683ab9 100644<br>
--- a/drivers/net/ark/ark_ethdev.c<br>
+++ b/drivers/net/ark/ark_ethdev.c<br>
@@ -37,7 +37,8 @@ static int eth_ark_dev_link_update(struct rte_eth_dev *dev,<br>
static int eth_ark_dev_set_link_up(struct rte_eth_dev *dev);<br>
static int eth_ark_dev_set_link_down(struct rte_eth_dev *dev);<br>
static int eth_ark_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
static int eth_ark_dev_stats_reset(struct rte_eth_dev *dev);<br>
static int eth_ark_set_default_mac_addr(struct rte_eth_dev *dev,<br>
struct rte_ether_addr *mac_addr);<br>
@@ -780,25 +781,36 @@ eth_ark_dev_set_link_down(struct rte_eth_dev *dev)<br>
}<br>
<br>
static int<br>
-eth_ark_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_ark_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
uint16_t i;<br>
struct ark_adapter *ark = dev->data->dev_private;<br>
+ struct rte_eth_dev_data *data = dev->data;<br>
<br>
- stats->ipackets = 0;<br>
- stats->ibytes = 0;<br>
- stats->opackets = 0;<br>
- stats->obytes = 0;<br>
- stats->imissed = 0;<br>
- stats->oerrors = 0;<br>
+ /* Initialize stats to 0 */<br>
+ memset(stats, 0, sizeof(*stats));<br>
<br>
- for (i = 0; i < dev->data->nb_tx_queues; i++)<br>
- eth_tx_queue_stats_get(dev->data->tx_queues[i], stats);<br>
- for (i = 0; i < dev->data->nb_rx_queues; i++)<br>
- eth_rx_queue_stats_get(dev->data->rx_queues[i], stats);<br>
+ if (qstats)<br>
+ memset(qstats, 0, sizeof(*qstats));<br>
+<br>
+ /* Get stats for each RX queue */<br>
+ for (i = 0; i < data->nb_rx_queues; i++) {<br>
+ if (data->rx_queues[i])<br>
+ eth_rx_queue_stats_get(data->rx_queues[i], stats, qstats);<br>
+ }<br>
+<br>
+ /* Get stats for each TX queue */<br>
+ for (i = 0; i < data->nb_tx_queues; i++) {<br>
+ if (data->tx_queues[i])<br>
+ eth_tx_queue_stats_get(data->tx_queues[i], stats, qstats);<br>
+ }<br>
+<br>
+ /* Call user extension if registered */<br>
if (ark->user_ext.stats_get)<br>
return ark->user_ext.stats_get(dev, stats,<br>
ark->user_data[dev->data->port_id]);<br>
+<br>
return 0;<br>
}<br>
<br>
diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c<br>
index 2fff0ffded..d7d480ac90 100644<br>
--- a/drivers/net/ark/ark_ethdev_rx.c<br>
+++ b/drivers/net/ark/ark_ethdev_rx.c<br>
@@ -560,13 +560,14 @@ eth_ark_dev_rx_queue_release(void *vqueue)<br>
}<br>
<br>
void<br>
-eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats)<br>
+eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct ark_rx_queue *queue;<br>
struct ark_udm_t *udm;<br>
<br>
queue = vqueue;<br>
- if (queue == 0)<br>
+ if (queue == NULL)<br>
return;<br>
udm = queue->udm;<br>
<br>
@@ -574,12 +575,15 @@ eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats)<br>
uint64_t ipackets = ark_udm_packets(udm);<br>
uint64_t idropped = ark_udm_dropped(queue->udm);<br>
<br>
- stats->q_ipackets[queue->queue_index] = ipackets;<br>
- stats->q_ibytes[queue->queue_index] = ibytes;<br>
- stats->q_errors[queue->queue_index] = idropped;<br>
stats->ipackets += ipackets;<br>
stats->ibytes += ibytes;<br>
stats->imissed += idropped;<br>
+<br>
+ if (qstats && queue->queue_index < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[queue->queue_index] = ipackets;<br>
+ qstats->q_ibytes[queue->queue_index] = ibytes;<br>
+ qstats->q_errors[queue->queue_index] = idropped;<br>
+ }<br>
}<br>
<br>
void<br>
diff --git a/drivers/net/ark/ark_ethdev_rx.h b/drivers/net/ark/ark_ethdev_rx.h<br>
index 12d4f61637..27b87445b1 100644<br>
--- a/drivers/net/ark/ark_ethdev_rx.h<br>
+++ b/drivers/net/ark/ark_ethdev_rx.h<br>
@@ -23,7 +23,8 @@ int eth_ark_rx_start_queue(struct rte_eth_dev *dev, uint16_t queue_id);<br>
uint16_t eth_ark_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,<br>
uint16_t nb_pkts);<br>
void eth_ark_dev_rx_queue_release(void *rx_queue);<br>
-void eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats);<br>
+void eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
void eth_rx_queue_stats_reset(void *vqueue);<br>
void eth_ark_rx_dump_queue(struct rte_eth_dev *dev, uint16_t queue_id,<br>
const char *msg);<br>
diff --git a/drivers/net/ark/ark_ethdev_tx.c b/drivers/net/ark/ark_ethdev_tx.c<br>
index ca6cd297a1..5c22de6080 100644<br>
--- a/drivers/net/ark/ark_ethdev_tx.c<br>
+++ b/drivers/net/ark/ark_ethdev_tx.c<br>
@@ -415,23 +415,29 @@ free_completed_tx(struct ark_tx_queue *queue)<br>
<br>
/* ************************************************************************* */<br>
void<br>
-eth_tx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats)<br>
+eth_tx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct ark_tx_queue *queue;<br>
struct ark_ddm_t *ddm;<br>
uint64_t bytes, pkts;<br>
<br>
queue = vqueue;<br>
+ if (queue == NULL)<br>
+ return;<br>
ddm = queue->ddm;<br>
<br>
bytes = ark_ddm_queue_byte_count(ddm);<br>
pkts = ark_ddm_queue_pkt_count(ddm);<br>
<br>
- stats->q_opackets[queue->queue_index] = pkts;<br>
- stats->q_obytes[queue->queue_index] = bytes;<br>
stats->opackets += pkts;<br>
stats->obytes += bytes;<br>
stats->oerrors += queue->tx_errors;<br>
+<br>
+ if (qstats && queue->queue_index < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[queue->queue_index] = pkts;<br>
+ qstats->q_obytes[queue->queue_index] = bytes;<br>
+ }<br>
}<br>
<br>
void<br>
diff --git a/drivers/net/ark/ark_ethdev_tx.h b/drivers/net/ark/ark_ethdev_tx.h<br>
index 7134dbfeed..639ee8adb4 100644<br>
--- a/drivers/net/ark/ark_ethdev_tx.h<br>
+++ b/drivers/net/ark/ark_ethdev_tx.h<br>
@@ -21,7 +21,8 @@ int eth_ark_tx_queue_setup(struct rte_eth_dev *dev,<br>
void eth_ark_tx_queue_release(void *vtx_queue);<br>
int eth_ark_tx_queue_stop(struct rte_eth_dev *dev, uint16_t queue_id);<br>
int eth_ark_tx_queue_start(struct rte_eth_dev *dev, uint16_t queue_id);<br>
-void eth_tx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats);<br>
+void eth_tx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
void eth_tx_queue_stats_reset(void *vqueue);<br>
<br>
#endif<br>
diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c<br>
index 9cde935834..2925dc2478 100644<br>
--- a/drivers/net/atlantic/atl_ethdev.c<br>
+++ b/drivers/net/atlantic/atl_ethdev.c<br>
@@ -33,7 +33,7 @@ static int atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,<br>
unsigned int size);<br>
<br>
static int atl_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
<br>
static int atl_dev_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *stats, unsigned int n);<br>
@@ -930,7 +930,8 @@ int atl_macsec_select_rxsa(struct rte_eth_dev *dev,<br>
}<br>
<br>
static int<br>
-atl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+atl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct atl_adapter *adapter = ATL_DEV_TO_ADAPTER(dev);<br>
struct aq_hw_s *hw = &adapter->hw;<br>
@@ -951,12 +952,14 @@ atl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
<br>
stats->rx_nombuf = swstats->rx_nombuf;<br>
<br>
- for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
- stats->q_ipackets[i] = swstats->q_ipackets[i];<br>
- stats->q_opackets[i] = swstats->q_opackets[i];<br>
- stats->q_ibytes[i] = swstats->q_ibytes[i];<br>
- stats->q_obytes[i] = swstats->q_obytes[i];<br>
- stats->q_errors[i] = swstats->q_errors[i];<br>
+ if (qstats != NULL) {<br>
+ for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
+ qstats->q_ipackets[i] = swstats->q_ipackets[i];<br>
+ qstats->q_opackets[i] = swstats->q_opackets[i];<br>
+ qstats->q_ibytes[i] = swstats->q_ibytes[i];<br>
+ qstats->q_obytes[i] = swstats->q_obytes[i];<br>
+ qstats->q_errors[i] = swstats->q_errors[i];<br>
+ }<br>
}<br>
return 0;<br>
}<br>
diff --git a/drivers/net/atlantic/atl_types.h b/drivers/net/atlantic/atl_types.h<br>
index e813d9f326..dfd7016600 100644<br>
--- a/drivers/net/atlantic/atl_types.h<br>
+++ b/drivers/net/atlantic/atl_types.h<br>
@@ -13,6 +13,7 @@<br>
#include <pthread.h><br>
<br>
#include <rte_common.h><br>
+#include <ethdev_driver.h><br>
<br>
typedef uint8_t u8;<br>
typedef int8_t s8;<br>
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c<br>
index ed44c1645d..3bc5171336 100644<br>
--- a/drivers/net/avp/avp_ethdev.c<br>
+++ b/drivers/net/avp/avp_ethdev.c<br>
@@ -79,7 +79,8 @@ static void avp_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid);<br>
static void avp_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid);<br>
<br>
static int avp_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
static int avp_dev_stats_reset(struct rte_eth_dev *dev);<br>
<br>
<br>
@@ -2241,7 +2242,8 @@ avp_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)<br>
}<br>
<br>
static int<br>
-avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
+avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);<br>
unsigned int i;<br>
@@ -2254,9 +2256,11 @@ avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
stats->ibytes += rxq->bytes;<br>
stats->ierrors += rxq->errors;<br>
<br>
- stats->q_ipackets[i] += rxq->packets;<br>
- stats->q_ibytes[i] += rxq->bytes;<br>
- stats->q_errors[i] += rxq->errors;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] += rxq->packets;<br>
+ qstats->q_ibytes[i] += rxq->bytes;<br>
+ qstats->q_errors[i] += rxq->errors;<br>
+ }<br>
}<br>
}<br>
<br>
@@ -2268,8 +2272,10 @@ avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
stats->obytes += txq->bytes;<br>
stats->oerrors += txq->errors;<br>
<br>
- stats->q_opackets[i] += txq->packets;<br>
- stats->q_obytes[i] += txq->bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] += txq->packets;<br>
+ qstats->q_obytes[i] += txq->bytes;<br>
+ }<br>
}<br>
}<br>
<br>
diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c<br>
index bc73536604..31d35ff182 100644<br>
--- a/drivers/net/axgbe/axgbe_ethdev.c<br>
+++ b/drivers/net/axgbe/axgbe_ethdev.c<br>
@@ -51,7 +51,8 @@ static int axgbe_dev_link_update(struct rte_eth_dev *dev,<br>
static int axgbe_dev_get_regs(struct rte_eth_dev *dev,<br>
struct rte_dev_reg_info *regs);<br>
static int axgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
static int axgbe_dev_stats_reset(struct rte_eth_dev *dev);<br>
static int axgbe_dev_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *stats,<br>
@@ -1133,7 +1134,7 @@ axgbe_dev_xstats_reset(struct rte_eth_dev *dev)<br>
<br>
static int<br>
axgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
{<br>
struct axgbe_rx_queue *rxq;<br>
struct axgbe_tx_queue *txq;<br>
@@ -1148,14 +1149,16 @@ axgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
for (i = 0; i < dev->data->nb_rx_queues; i++) {<br>
rxq = dev->data->rx_queues[i];<br>
if (rxq) {<br>
- stats->q_ipackets[i] = rxq->pkts;<br>
stats->ipackets += rxq->pkts;<br>
- stats->q_ibytes[i] = rxq->bytes;<br>
stats->ibytes += rxq->bytes;<br>
stats->rx_nombuf += rxq->rx_mbuf_alloc_failed;<br>
- stats->q_errors[i] = rxq->errors<br>
- + rxq->rx_mbuf_alloc_failed;<br>
stats->ierrors += rxq->errors;<br>
+<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = rxq->pkts;<br>
+ qstats->q_ibytes[i] = rxq->bytes;<br>
+ qstats->q_errors[i] = rxq->errors + rxq->rx_mbuf_alloc_failed;<br>
+ }<br>
} else {<br>
PMD_DRV_LOG_LINE(DEBUG, "Rx queue not setup for port %d",<br>
dev->data->port_id);<br>
@@ -1165,11 +1168,14 @@ axgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
for (i = 0; i < dev->data->nb_tx_queues; i++) {<br>
txq = dev->data->tx_queues[i];<br>
if (txq) {<br>
- stats->q_opackets[i] = txq->pkts;<br>
stats->opackets += txq->pkts;<br>
- stats->q_obytes[i] = txq->bytes;<br>
stats->obytes += txq->bytes;<br>
stats->oerrors += txq->errors;<br>
+<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] = txq->pkts;<br>
+ qstats->q_obytes[i] = txq->bytes;<br>
+ }<br>
} else {<br>
PMD_DRV_LOG_LINE(DEBUG, "Tx queue not setup for port %d",<br>
dev->data->port_id);<br>
diff --git a/drivers/net/axgbe/axgbe_ethdev.h b/drivers/net/axgbe/axgbe_ethdev.h<br>
index 5cd4317d7a..b94a7f3562 100644<br>
--- a/drivers/net/axgbe/axgbe_ethdev.h<br>
+++ b/drivers/net/axgbe/axgbe_ethdev.h<br>
@@ -8,6 +8,7 @@<br>
<br>
#include <rte_mempool.h><br>
#include <rte_lcore.h><br>
+#include <ethdev_driver.h><br>
#include "axgbe_common.h"<br>
#include "rte_time.h"<br>
<br>
diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c<br>
index 1327cbe912..5e2e555525 100644<br>
--- a/drivers/net/bnx2x/bnx2x_ethdev.c<br>
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c<br>
@@ -427,7 +427,8 @@ bnx2xvf_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_comple<br>
}<br>
<br>
static int<br>
-bnx2x_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+bnx2x_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct bnx2x_softc *sc = dev->data->dev_private;<br>
uint32_t brb_truncate_discard;<br>
diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c<br>
index 6f5c3f80eb..bd3bfb8209 100644<br>
--- a/drivers/net/bnxt/bnxt_reps.c<br>
+++ b/drivers/net/bnxt/bnxt_reps.c<br>
@@ -877,7 +877,7 @@ void bnxt_rep_tx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx)<br>
}<br>
<br>
int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
{<br>
struct bnxt_representor *rep_bp = eth_dev->data->dev_private;<br>
unsigned int i;<br>
@@ -890,11 +890,13 @@ int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,<br>
stats->ipackets += rep_bp->rx_pkts[i];<br>
stats->imissed += rep_bp->rx_drop_pkts[i];<br>
<br>
- stats->q_ipackets[i] = rep_bp->rx_pkts[i];<br>
- stats->q_ibytes[i] = rep_bp->rx_bytes[i];<br>
- stats->q_opackets[i] = rep_bp->tx_pkts[i];<br>
- stats->q_obytes[i] = rep_bp->tx_bytes[i];<br>
- stats->q_errors[i] = rep_bp->rx_drop_pkts[i];<br>
+ if (qstats) {<br>
+ qstats->q_ipackets[i] = rep_bp->rx_pkts[i];<br>
+ qstats->q_ibytes[i] = rep_bp->rx_bytes[i];<br>
+ qstats->q_opackets[i] = rep_bp->tx_pkts[i];<br>
+ qstats->q_obytes[i] = rep_bp->tx_bytes[i];<br>
+ qstats->q_errors[i] = rep_bp->rx_drop_pkts[i];<br>
+ }<br>
}<br>
<br>
return 0;<br>
diff --git a/drivers/net/bnxt/bnxt_reps.h b/drivers/net/bnxt/bnxt_reps.h<br>
index 3f2db9d1ae..1615ecf11c 100644<br>
--- a/drivers/net/bnxt/bnxt_reps.h<br>
+++ b/drivers/net/bnxt/bnxt_reps.h<br>
@@ -47,7 +47,7 @@ void bnxt_rep_tx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx);<br>
int bnxt_rep_dev_stop_op(struct rte_eth_dev *eth_dev);<br>
int bnxt_rep_dev_close_op(struct rte_eth_dev *eth_dev);<br>
int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
int bnxt_rep_stats_reset_op(struct rte_eth_dev *eth_dev);<br>
int bnxt_rep_stop_all(struct bnxt *bp);<br>
#endif /* _BNXT_REPS_H_ */<br>
diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c<br>
index 9d7cdf925d..53f5613eb3 100644<br>
--- a/drivers/net/bnxt/bnxt_stats.c<br>
+++ b/drivers/net/bnxt/bnxt_stats.c<br>
@@ -561,84 +561,95 @@ void bnxt_free_stats(struct bnxt *bp)<br>
<br>
static void bnxt_fill_rte_eth_stats_ext(struct rte_eth_stats *stats,<br>
struct bnxt_ring_stats_ext *ring_stats,<br>
+ struct eth_queue_stats *qstats,<br>
unsigned int i, bool rx)<br>
{<br>
if (rx) {<br>
- stats->q_ipackets[i] = ring_stats->rx_ucast_pkts;<br>
- stats->q_ipackets[i] += ring_stats->rx_mcast_pkts;<br>
- stats->q_ipackets[i] += ring_stats->rx_bcast_pkts;<br>
-<br>
- stats->ipackets += stats->q_ipackets[i];<br>
-<br>
- stats->q_ibytes[i] = ring_stats->rx_ucast_bytes;<br>
- stats->q_ibytes[i] += ring_stats->rx_mcast_bytes;<br>
- stats->q_ibytes[i] += ring_stats->rx_bcast_bytes;<br>
-<br>
- stats->ibytes += stats->q_ibytes[i];<br>
-<br>
- stats->q_errors[i] = ring_stats->rx_discard_pkts;<br>
- stats->q_errors[i] += ring_stats->rx_error_pkts;<br>
-<br>
+ uint64_t ipackets = ring_stats->rx_ucast_pkts +<br>
+ ring_stats->rx_mcast_pkts +<br>
+ ring_stats->rx_bcast_pkts;<br>
+ uint64_t ibytes = ring_stats->rx_ucast_bytes +<br>
+ ring_stats->rx_mcast_bytes +<br>
+ ring_stats->rx_bcast_bytes;<br>
+ uint64_t ierrors = ring_stats->rx_discard_pkts +<br>
+ ring_stats->rx_error_pkts;<br>
+<br>
+ stats->ipackets += ipackets;<br>
+ stats->ibytes += ibytes;<br>
stats->imissed += ring_stats->rx_discard_pkts;<br>
stats->ierrors += ring_stats->rx_error_pkts;<br>
- } else {<br>
- stats->q_opackets[i] = ring_stats->tx_ucast_pkts;<br>
- stats->q_opackets[i] += ring_stats->tx_mcast_pkts;<br>
- stats->q_opackets[i] += ring_stats->tx_bcast_pkts;<br>
-<br>
- stats->opackets += stats->q_opackets[i];<br>
-<br>
- stats->q_obytes[i] = ring_stats->tx_ucast_bytes;<br>
- stats->q_obytes[i] += ring_stats->tx_mcast_bytes;<br>
- stats->q_obytes[i] += ring_stats->tx_bcast_bytes;<br>
-<br>
- stats->obytes += stats->q_obytes[i];<br>
<br>
+ if (qstats) {<br>
+ qstats->q_ipackets[i] = ipackets;<br>
+ qstats->q_ibytes[i] = ibytes;<br>
+ qstats->q_errors[i] = ierrors;<br>
+ }<br>
+ } else {<br>
+ uint64_t opackets = ring_stats->tx_ucast_pkts +<br>
+ ring_stats->tx_mcast_pkts +<br>
+ ring_stats->tx_bcast_pkts;<br>
+ uint64_t obytes = ring_stats->tx_ucast_bytes +<br>
+ ring_stats->tx_mcast_bytes +<br>
+ ring_stats->tx_bcast_bytes;<br>
+<br>
+ stats->opackets += opackets;<br>
+ stats->obytes += obytes;<br>
stats->oerrors += ring_stats->tx_discard_pkts;<br>
+<br>
+ if (qstats) {<br>
+ qstats->q_opackets[i] = opackets;<br>
+ qstats->q_obytes[i] = obytes;<br>
+ }<br>
}<br>
}<br>
<br>
static void bnxt_fill_rte_eth_stats(struct rte_eth_stats *stats,<br>
struct bnxt_ring_stats *ring_stats,<br>
+ struct eth_queue_stats *qstats,<br>
unsigned int i, bool rx)<br>
{<br>
if (rx) {<br>
- stats->q_ipackets[i] = ring_stats->rx_ucast_pkts;<br>
- stats->q_ipackets[i] += ring_stats->rx_mcast_pkts;<br>
- stats->q_ipackets[i] += ring_stats->rx_bcast_pkts;<br>
-<br>
- stats->ipackets += stats->q_ipackets[i];<br>
-<br>
- stats->q_ibytes[i] = ring_stats->rx_ucast_bytes;<br>
- stats->q_ibytes[i] += ring_stats->rx_mcast_bytes;<br>
- stats->q_ibytes[i] += ring_stats->rx_bcast_bytes;<br>
-<br>
- stats->ibytes += stats->q_ibytes[i];<br>
-<br>
- stats->q_errors[i] = ring_stats->rx_discard_pkts;<br>
- stats->q_errors[i] += ring_stats->rx_error_pkts;<br>
-<br>
+ uint64_t ipackets = ring_stats->rx_ucast_pkts +<br>
+ ring_stats->rx_mcast_pkts +<br>
+ ring_stats->rx_bcast_pkts;<br>
+ uint64_t ibytes = ring_stats->rx_ucast_bytes +<br>
+ ring_stats->rx_mcast_bytes +<br>
+ ring_stats->rx_bcast_bytes;<br>
+ uint64_t ierrors = ring_stats->rx_discard_pkts +<br>
+ ring_stats->rx_error_pkts;<br>
+<br>
+ stats->ipackets += ipackets;<br>
+ stats->ibytes += ibytes;<br>
stats->imissed += ring_stats->rx_discard_pkts;<br>
stats->ierrors += ring_stats->rx_error_pkts;<br>
- } else {<br>
- stats->q_opackets[i] = ring_stats->tx_ucast_pkts;<br>
- stats->q_opackets[i] += ring_stats->tx_mcast_pkts;<br>
- stats->q_opackets[i] += ring_stats->tx_bcast_pkts;<br>
-<br>
- stats->opackets += stats->q_opackets[i];<br>
-<br>
- stats->q_obytes[i] = ring_stats->tx_ucast_bytes;<br>
- stats->q_obytes[i] += ring_stats->tx_mcast_bytes;<br>
- stats->q_obytes[i] += ring_stats->tx_bcast_bytes;<br>
-<br>
- stats->obytes += stats->q_obytes[i];<br>
<br>
+ if (qstats) {<br>
+ qstats->q_ipackets[i] = ipackets;<br>
+ qstats->q_ibytes[i] = ibytes;<br>
+ qstats->q_errors[i] = ierrors;<br>
+ }<br>
+ } else {<br>
+ uint64_t opackets = ring_stats->tx_ucast_pkts +<br>
+ ring_stats->tx_mcast_pkts +<br>
+ ring_stats->tx_bcast_pkts;<br>
+ uint64_t obytes = ring_stats->tx_ucast_bytes +<br>
+ ring_stats->tx_mcast_bytes +<br>
+ ring_stats->tx_bcast_bytes;<br>
+<br>
+ stats->opackets += opackets;<br>
+ stats->obytes += obytes;<br>
stats->oerrors += ring_stats->tx_discard_pkts;<br>
+<br>
+ if (qstats) {<br>
+ qstats->q_opackets[i] = opackets;<br>
+ qstats->q_obytes[i] = obytes;<br>
+ }<br>
}<br>
}<br>
<br>
static int bnxt_stats_get_ext(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *bnxt_stats)<br>
+ struct rte_eth_stats *bnxt_stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
int rc = 0;<br>
unsigned int i;<br>
@@ -661,7 +672,7 @@ static int bnxt_stats_get_ext(struct rte_eth_dev *eth_dev,<br>
if (unlikely(rc))<br>
return rc;<br>
<br>
- bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, i, true);<br>
+ bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, qstats, i, true);<br>
bnxt_stats->rx_nombuf +=<br>
rte_atomic_load_explicit(&rxq->rx_mbuf_alloc_fail,<br>
rte_memory_order_relaxed);<br>
@@ -683,14 +694,14 @@ static int bnxt_stats_get_ext(struct rte_eth_dev *eth_dev,<br>
if (unlikely(rc))<br>
return rc;<br>
<br>
- bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, i, false);<br>
+ bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, qstats, i, false);<br>
}<br>
<br>
return rc;<br>
}<br>
<br>
int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *bnxt_stats)<br>
+ struct rte_eth_stats *bnxt_stats, struct eth_queue_stats *qstats)<br>
{<br>
int rc = 0;<br>
unsigned int i;<br>
@@ -705,7 +716,7 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
return -EIO;<br>
<br>
if (BNXT_TPA_V2_P7(bp))<br>
- return bnxt_stats_get_ext(eth_dev, bnxt_stats);<br>
+ return bnxt_stats_get_ext(eth_dev, bnxt_stats, qstats);<br>
<br>
num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,<br>
(unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
@@ -723,7 +734,7 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
if (unlikely(rc))<br>
return rc;<br>
<br>
- bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, i, true);<br>
+ bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, qstats, i, true);<br>
bnxt_stats->rx_nombuf +=<br>
rte_atomic_load_explicit(&rxq->rx_mbuf_alloc_fail,<br>
rte_memory_order_relaxed);<br>
@@ -745,7 +756,7 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
if (unlikely(rc))<br>
return rc;<br>
<br>
- bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, i, false);<br>
+ bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, qstats, i, false);<br>
bnxt_stats->oerrors +=<br>
rte_atomic_load_explicit(&txq->tx_mbuf_drop,<br>
rte_memory_order_relaxed);<br>
diff --git a/drivers/net/bnxt/bnxt_stats.h b/drivers/net/bnxt/bnxt_stats.h<br>
index e46c05eed3..c0508e773a 100644<br>
--- a/drivers/net/bnxt/bnxt_stats.h<br>
+++ b/drivers/net/bnxt/bnxt_stats.h<br>
@@ -10,7 +10,7 @@<br>
<br>
void bnxt_free_stats(struct bnxt *bp);<br>
int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *bnxt_stats);<br>
+ struct rte_eth_stats *bnxt_stats, struct eth_queue_stats *qstats);<br>
int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev);<br>
int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,<br>
struct rte_eth_xstat_name *xstats_names,<br>
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c<br>
index 4906701a95..b7bab6bc99 100644<br>
--- a/drivers/net/bonding/rte_eth_bond_pmd.c<br>
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c<br>
@@ -2636,11 +2636,12 @@ bond_ethdev_link_update(struct rte_eth_dev *ethdev, int wait_to_complete)<br>
<br>
<br>
static int<br>
-bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct bond_dev_private *internals = dev->data->dev_private;<br>
struct rte_eth_stats member_stats;<br>
- int i, j;<br>
+ int i;<br>
<br>
for (i = 0; i < internals->member_count; i++) {<br>
rte_eth_stats_get(internals->members[i].port_id, &member_stats);<br>
@@ -2653,15 +2654,6 @@ bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->ierrors += member_stats.ierrors;<br>
stats->oerrors += member_stats.oerrors;<br>
stats->rx_nombuf += member_stats.rx_nombuf;<br>
-<br>
- for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {<br>
- stats->q_ipackets[j] += member_stats.q_ipackets[j];<br>
- stats->q_opackets[j] += member_stats.q_opackets[j];<br>
- stats->q_ibytes[j] += member_stats.q_ibytes[j];<br>
- stats->q_obytes[j] += member_stats.q_obytes[j];<br>
- stats->q_errors[j] += member_stats.q_errors[j];<br>
- }<br>
-<br>
}<br>
<br>
return 0;<br>
diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h<br>
index 7868185768..67867c889b 100644<br>
--- a/drivers/net/cnxk/cnxk_ethdev.h<br>
+++ b/drivers/net/cnxk/cnxk_ethdev.h<br>
@@ -682,7 +682,8 @@ int cnxk_nix_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete);<br>
int cnxk_nix_queue_stats_mapping(struct rte_eth_dev *dev, uint16_t queue_id,<br>
uint8_t stat_idx, uint8_t is_rx);<br>
int cnxk_nix_stats_reset(struct rte_eth_dev *dev);<br>
-int cnxk_nix_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int cnxk_nix_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
int cnxk_nix_xstats_get(struct rte_eth_dev *eth_dev,<br>
struct rte_eth_xstat *xstats, unsigned int n);<br>
int cnxk_nix_xstats_get_names(struct rte_eth_dev *eth_dev,<br>
diff --git a/drivers/net/cnxk/cnxk_rep.h b/drivers/net/cnxk/cnxk_rep.h<br>
index b9601854ce..9ede1e6dad 100644<br>
--- a/drivers/net/cnxk/cnxk_rep.h<br>
+++ b/drivers/net/cnxk/cnxk_rep.h<br>
@@ -130,7 +130,8 @@ void cnxk_rep_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx);<br>
void cnxk_rep_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx);<br>
int cnxk_rep_dev_stop(struct rte_eth_dev *eth_dev);<br>
int cnxk_rep_dev_close(struct rte_eth_dev *eth_dev);<br>
-int cnxk_rep_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats);<br>
+int cnxk_rep_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
int cnxk_rep_stats_reset(struct rte_eth_dev *eth_dev);<br>
int cnxk_rep_flow_ops_get(struct rte_eth_dev *ethdev, const struct rte_flow_ops **ops);<br>
int cnxk_rep_state_update(struct cnxk_eswitch_dev *eswitch_dev, uint32_t state, uint16_t *rep_id);<br>
diff --git a/drivers/net/cnxk/cnxk_rep_ops.c b/drivers/net/cnxk/cnxk_rep_ops.c<br>
index c88d28ff72..c481015592 100644<br>
--- a/drivers/net/cnxk/cnxk_rep_ops.c<br>
+++ b/drivers/net/cnxk/cnxk_rep_ops.c<br>
@@ -574,7 +574,8 @@ native_repte_eth_stats(struct cnxk_rep_dev *rep_dev, struct rte_eth_stats *stats<br>
}<br>
<br>
int<br>
-cnxk_rep_stats_get(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats)<br>
+cnxk_rep_stats_get(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct cnxk_rep_dev *rep_dev = cnxk_rep_pmd_priv(ethdev);<br>
struct rte_eth_stats vf_stats;<br>
@@ -612,13 +613,15 @@ cnxk_rep_stats_get(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats)<br>
rte_memcpy(&vf_stats, adata.u.data, adata.size);<br>
}<br>
<br>
- stats->q_ipackets[0] = vf_stats.ipackets;<br>
- stats->q_ibytes[0] = vf_stats.ibytes;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ipackets[0] = vf_stats.ipackets;<br>
+ qstats->q_ibytes[0] = vf_stats.ibytes;<br>
+ qstats->q_opackets[0] = vf_stats.opackets;<br>
+ qstats->q_obytes[0] = vf_stats.obytes;<br>
+ }<br>
+<br>
stats->ipackets = vf_stats.ipackets;<br>
stats->ibytes = vf_stats.ibytes;<br>
-<br>
- stats->q_opackets[0] = vf_stats.opackets;<br>
- stats->q_obytes[0] = vf_stats.obytes;<br>
stats->opackets = vf_stats.opackets;<br>
stats->obytes = vf_stats.obytes;<br>
<br>
diff --git a/drivers/net/cnxk/cnxk_stats.c b/drivers/net/cnxk/cnxk_stats.c<br>
index 469faff405..d57659ef51 100644<br>
--- a/drivers/net/cnxk/cnxk_stats.c<br>
+++ b/drivers/net/cnxk/cnxk_stats.c<br>
@@ -8,7 +8,8 @@<br>
#define CNXK_NB_TXQ_STATS 4<br>
<br>
int<br>
-cnxk_nix_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
+cnxk_nix_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);<br>
struct roc_nix *nix = &dev->nix;<br>
@@ -32,28 +33,30 @@ cnxk_nix_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
stats->ibytes = nix_stats.rx_octs;<br>
stats->ierrors = nix_stats.rx_err;<br>
<br>
- for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
- struct roc_nix_stats_queue qstats;<br>
- uint16_t qidx;<br>
-<br>
- if (dev->txq_stat_map[i] & (1U << 31)) {<br>
- qidx = dev->txq_stat_map[i] & 0xFFFF;<br>
- rc = roc_nix_stats_queue_get(nix, qidx, 0, &qstats);<br>
- if (rc)<br>
- goto exit;<br>
- stats->q_opackets[i] = qstats.tx_pkts;<br>
- stats->q_obytes[i] = qstats.tx_octs;<br>
- stats->q_errors[i] = qstats.tx_drop_pkts;<br>
- }<br>
-<br>
- if (dev->rxq_stat_map[i] & (1U << 31)) {<br>
- qidx = dev->rxq_stat_map[i] & 0xFFFF;<br>
- rc = roc_nix_stats_queue_get(nix, qidx, 1, &qstats);<br>
- if (rc)<br>
- goto exit;<br>
- stats->q_ipackets[i] = qstats.rx_pkts;<br>
- stats->q_ibytes[i] = qstats.rx_octs;<br>
- stats->q_errors[i] += qstats.rx_drop_pkts;<br>
+ if (qstats != NULL) {<br>
+ for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
+ struct roc_nix_stats_queue qstats_data;<br>
+ uint16_t qidx;<br>
+<br>
+ if (dev->txq_stat_map[i] & (1U << 31)) {<br>
+ qidx = dev->txq_stat_map[i] & 0xFFFF;<br>
+ rc = roc_nix_stats_queue_get(nix, qidx, 0, &qstats_data);<br>
+ if (rc)<br>
+ goto exit;<br>
+ qstats->q_opackets[i] = qstats_data.tx_pkts;<br>
+ qstats->q_obytes[i] = qstats_data.tx_octs;<br>
+ qstats->q_errors[i] = qstats_data.tx_drop_pkts;<br>
+ }<br>
+<br>
+ if (dev->rxq_stat_map[i] & (1U << 31)) {<br>
+ qidx = dev->rxq_stat_map[i] & 0xFFFF;<br>
+ rc = roc_nix_stats_queue_get(nix, qidx, 1, &qstats_data);<br>
+ if (rc)<br>
+ goto exit;<br>
+ qstats->q_ipackets[i] = qstats_data.rx_pkts;<br>
+ qstats->q_ibytes[i] = qstats_data.rx_octs;<br>
+ qstats->q_errors[i] += qstats_data.rx_drop_pkts;<br>
+ }<br>
}<br>
}<br>
exit:<br>
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c<br>
index 9b6a3651f9..0c337a6cc8 100644<br>
--- a/drivers/net/cxgbe/cxgbe_ethdev.c<br>
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c<br>
@@ -701,7 +701,8 @@ void cxgbe_dev_rx_queue_release(struct rte_eth_dev *eth_dev, uint16_t qid)<br>
* Get port statistics.<br>
*/<br>
static int cxgbe_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *eth_stats)<br>
+ struct rte_eth_stats *eth_stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct port_info *pi = eth_dev->data->dev_private;<br>
struct adapter *adapter = pi->adapter;<br>
diff --git a/drivers/net/cxgbe/cxgbevf_ethdev.c b/drivers/net/cxgbe/cxgbevf_ethdev.c<br>
index a62c56c2b9..d8eba8afef 100644<br>
--- a/drivers/net/cxgbe/cxgbevf_ethdev.c<br>
+++ b/drivers/net/cxgbe/cxgbevf_ethdev.c<br>
@@ -34,7 +34,8 @@<br>
* Get port statistics.<br>
*/<br>
static int cxgbevf_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *eth_stats)<br>
+ struct rte_eth_stats *eth_stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct port_info *pi = eth_dev->data->dev_private;<br>
struct adapter *adapter = pi->adapter;<br>
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c<br>
index 34b691fde7..789a55c2a0 100644<br>
--- a/drivers/net/dpaa/dpaa_ethdev.c<br>
+++ b/drivers/net/dpaa/dpaa_ethdev.c<br>
@@ -855,7 +855,8 @@ static int dpaa_eth_link_update(struct rte_eth_dev *dev,<br>
}<br>
<br>
static int dpaa_eth_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
PMD_INIT_FUNC_TRACE();<br>
<br>
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c<br>
index 41678ce09b..ada4a79b36 100644<br>
--- a/drivers/net/dpaa2/dpaa2_ethdev.c<br>
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c<br>
@@ -1602,7 +1602,7 @@ dpaa2_dev_set_mac_addr(struct rte_eth_dev *dev,<br>
<br>
static int<br>
dpaa2_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
{<br>
struct dpaa2_dev_priv *priv = dev->data->dev_private;<br>
struct fsl_mc_io *dpni = dev->process_private;<br>
@@ -1659,18 +1659,20 @@ dpaa2_dev_stats_get(struct rte_eth_dev *dev,<br>
stats->imissed = value.page_2.ingress_nobuffer_discards;<br>
<br>
/* Fill in per queue stats */<br>
- for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&<br>
- (i < priv->nb_rx_queues || i < priv->nb_tx_queues); ++i) {<br>
- dpaa2_rxq = priv->rx_vq[i];<br>
- dpaa2_txq = priv->tx_vq[i];<br>
- if (dpaa2_rxq)<br>
- stats->q_ipackets[i] = dpaa2_rxq->rx_pkts;<br>
- if (dpaa2_txq)<br>
- stats->q_opackets[i] = dpaa2_txq->tx_pkts;<br>
-<br>
- /* Byte counting is not implemented */<br>
- stats->q_ibytes[i] = 0;<br>
- stats->q_obytes[i] = 0;<br>
+ if (qstats != NULL) {<br>
+ for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&<br>
+ (i < priv->nb_rx_queues || i < priv->nb_tx_queues); ++i) {<br>
+ dpaa2_rxq = priv->rx_vq[i];<br>
+ dpaa2_txq = priv->tx_vq[i];<br>
+ if (dpaa2_rxq)<br>
+ qstats->q_ipackets[i] = dpaa2_rxq->rx_pkts;<br>
+ if (dpaa2_txq)<br>
+ qstats->q_opackets[i] = dpaa2_txq->tx_pkts;<br>
+<br>
+ /* Byte counting is not implemented */<br>
+ qstats->q_ibytes[i] = 0;<br>
+ qstats->q_obytes[i] = 0;<br>
+ }<br>
}<br>
<br>
return 0;<br>
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c<br>
index f5cf5c3811..448de25fdc 100644<br>
--- a/drivers/net/ena/ena_ethdev.c<br>
+++ b/drivers/net/ena/ena_ethdev.c<br>
@@ -9,6 +9,7 @@<br>
#include <rte_version.h><br>
#include <rte_net.h><br>
#include <rte_kvargs.h><br>
+#include <ethdev_driver.h><br>
<br>
#include "ena_ethdev.h"<br>
#include "ena_logs.h"<br>
@@ -270,7 +271,8 @@ static int ena_start(struct rte_eth_dev *dev);<br>
static int ena_stop(struct rte_eth_dev *dev);<br>
static int ena_close(struct rte_eth_dev *dev);<br>
static int ena_dev_reset(struct rte_eth_dev *dev);<br>
-static int ena_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+static int ena_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
static void ena_rx_queue_release_all(struct rte_eth_dev *dev);<br>
static void ena_tx_queue_release_all(struct rte_eth_dev *dev);<br>
static void ena_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid);<br>
@@ -1240,7 +1242,8 @@ static void ena_stats_restart(struct rte_eth_dev *dev)<br>
}<br>
<br>
static int ena_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct ena_admin_basic_stats ena_stats;<br>
struct ena_adapter *adapter = dev->data->dev_private;<br>
@@ -1276,26 +1279,29 @@ static int ena_stats_get(struct rte_eth_dev *dev,<br>
stats->oerrors = rte_atomic64_read(&adapter->drv_stats->oerrors);<br>
stats->rx_nombuf = rte_atomic64_read(&adapter->drv_stats->rx_nombuf);<br>
<br>
- max_rings_stats = RTE_MIN(dev->data->nb_rx_queues,<br>
- RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
- for (i = 0; i < max_rings_stats; ++i) {<br>
- struct ena_stats_rx *rx_stats = &adapter->rx_ring[i].rx_stats;<br>
-<br>
- stats->q_ibytes[i] = rx_stats->bytes;<br>
- stats->q_ipackets[i] = rx_stats->cnt;<br>
- stats->q_errors[i] = rx_stats->bad_desc_num +<br>
- rx_stats->bad_req_id +<br>
- rx_stats->bad_desc +<br>
- rx_stats->unknown_error;<br>
- }<br>
+ /* Queue statistics */<br>
+ if (qstats) {<br>
+ max_rings_stats = RTE_MIN(dev->data->nb_rx_queues,<br>
+ RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+ for (i = 0; i < max_rings_stats; ++i) {<br>
+ struct ena_stats_rx *rx_stats = &adapter->rx_ring[i].rx_stats;<br>
+<br>
+ qstats->q_ibytes[i] = rx_stats->bytes;<br>
+ qstats->q_ipackets[i] = rx_stats->cnt;<br>
+ qstats->q_errors[i] = rx_stats->bad_desc_num +<br>
+ rx_stats->bad_req_id +<br>
+ rx_stats->bad_desc +<br>
+ rx_stats->unknown_error;<br>
+ }<br>
<br>
- max_rings_stats = RTE_MIN(dev->data->nb_tx_queues,<br>
- RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
- for (i = 0; i < max_rings_stats; ++i) {<br>
- struct ena_stats_tx *tx_stats = &adapter->tx_ring[i].tx_stats;<br>
+ max_rings_stats = RTE_MIN(dev->data->nb_tx_queues,<br>
+ RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+ for (i = 0; i < max_rings_stats; ++i) {<br>
+ struct ena_stats_tx *tx_stats = &adapter->tx_ring[i].tx_stats;<br>
<br>
- stats->q_obytes[i] = tx_stats->bytes;<br>
- stats->q_opackets[i] = tx_stats->cnt;<br>
+ qstats->q_obytes[i] = tx_stats->bytes;<br>
+ qstats->q_opackets[i] = tx_stats->cnt;<br>
+ }<br>
}<br>
<br>
return 0;<br>
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c<br>
index ffbecc407c..37a61f8ff6 100644<br>
--- a/drivers/net/enetc/enetc_ethdev.c<br>
+++ b/drivers/net/enetc/enetc_ethdev.c<br>
@@ -4,6 +4,7 @@<br>
<br>
#include <stdbool.h><br>
#include <ethdev_pci.h><br>
+#include <ethdev_driver.h><br>
#include <rte_random.h><br>
#include <dpaax_iova_table.h><br>
<br>
@@ -543,7 +544,8 @@ enetc_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid)<br>
<br>
static<br>
int enetc_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct enetc_eth_hw *hw =<br>
ENETC_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c<br>
index 7c2926409e..c336db75e8 100644<br>
--- a/drivers/net/enetfec/enet_ethdev.c<br>
+++ b/drivers/net/enetfec/enet_ethdev.c<br>
@@ -314,7 +314,8 @@ enetfec_set_mac_address(struct rte_eth_dev *dev,<br>
<br>
static int<br>
enetfec_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct enetfec_private *fep = dev->data->dev_private;<br>
struct rte_eth_stats *eth_stats = &fep->stats;<br>
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h<br>
index dc1d16f7d5..87f6b35fcd 100644<br>
--- a/drivers/net/enic/enic.h<br>
+++ b/drivers/net/enic/enic.h<br>
@@ -419,7 +419,8 @@ int enic_disable(struct enic *enic);<br>
void enic_remove(struct enic *enic);<br>
int enic_get_link_status(struct enic *enic);<br>
int enic_dev_stats_get(struct enic *enic,<br>
- struct rte_eth_stats *r_stats);<br>
+ struct rte_eth_stats *r_stats,<br>
+ struct eth_queue_stats *qstats __rte_unused);<br>
int enic_dev_stats_clear(struct enic *enic);<br>
int enic_add_packet_filter(struct enic *enic);<br>
int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr);<br>
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c<br>
index 749cc9ca5c..a853a5047a 100644<br>
--- a/drivers/net/enic/enic_ethdev.c<br>
+++ b/drivers/net/enic/enic_ethdev.c<br>
@@ -432,12 +432,12 @@ static int enicpmd_dev_link_update(struct rte_eth_dev *eth_dev,<br>
}<br>
<br>
static int enicpmd_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
{<br>
struct enic *enic = pmd_priv(eth_dev);<br>
<br>
ENICPMD_FUNC_TRACE();<br>
- return enic_dev_stats_get(enic, stats);<br>
+ return enic_dev_stats_get(enic, stats, qstats);<br>
}<br>
<br>
static int enicpmd_dev_stats_reset(struct rte_eth_dev *eth_dev)<br>
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c<br>
index 4124c48b85..2696fa77d4 100644<br>
--- a/drivers/net/enic/enic_main.c<br>
+++ b/drivers/net/enic/enic_main.c<br>
@@ -111,7 +111,8 @@ int enic_dev_stats_clear(struct enic *enic)<br>
return 0;<br>
}<br>
<br>
-int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)<br>
+int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct vnic_stats *stats;<br>
struct enic_soft_stats *soft_stats = &enic->soft_stats;<br>
diff --git a/drivers/net/enic/enic_vf_representor.c b/drivers/net/enic/enic_vf_representor.c<br>
index 8469e06de9..05b2efedcb 100644<br>
--- a/drivers/net/enic/enic_vf_representor.c<br>
+++ b/drivers/net/enic/enic_vf_representor.c<br>
@@ -419,13 +419,14 @@ static int enic_vf_link_update(struct rte_eth_dev *eth_dev,<br>
}<br>
<br>
static int enic_vf_stats_get(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct enic_vf_representor *vf;<br>
struct vnic_stats *vs;<br>
int err;<br>
<br>
ENICPMD_FUNC_TRACE();<br>
+<br>
vf = eth_dev->data->dev_private;<br>
/* Get VF stats via PF */<br>
err = vnic_dev_stats_dump(vf->enic.vdev, &vs);<br>
diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c<br>
index dc4aba6e30..f0fd662c7b 100644<br>
--- a/drivers/net/failsafe/failsafe_ether.c<br>
+++ b/drivers/net/failsafe/failsafe_ether.c<br>
@@ -565,8 +565,6 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)<br>
void<br>
failsafe_stats_increment(struct rte_eth_stats *to, struct rte_eth_stats *from)<br>
{<br>
- uint32_t i;<br>
-<br>
RTE_ASSERT(to != NULL && from != NULL);<br>
to->ipackets += from->ipackets;<br>
to->opackets += from->opackets;<br>
@@ -576,13 +574,6 @@ failsafe_stats_increment(struct rte_eth_stats *to, struct rte_eth_stats *from)<br>
to->ierrors += from->ierrors;<br>
to->oerrors += from->oerrors;<br>
to->rx_nombuf += from->rx_nombuf;<br>
- for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {<br>
- to->q_ipackets[i] += from->q_ipackets[i];<br>
- to->q_opackets[i] += from->q_opackets[i];<br>
- to->q_ibytes[i] += from->q_ibytes[i];<br>
- to->q_obytes[i] += from->q_obytes[i];<br>
- to->q_errors[i] += from->q_errors[i];<br>
- }<br>
}<br>
<br>
int<br>
diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c<br>
index 5321c3385c..ddc8808ebe 100644<br>
--- a/drivers/net/failsafe/failsafe_ops.c<br>
+++ b/drivers/net/failsafe/failsafe_ops.c<br>
@@ -898,7 +898,8 @@ fs_link_update(struct rte_eth_dev *dev,<br>
<br>
static int<br>
fs_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct rte_eth_stats backup;<br>
struct sub_device *sdev;<br>
diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c<br>
index 56e1a470b8..6341d89f39 100644<br>
--- a/drivers/net/gve/gve_ethdev.c<br>
+++ b/drivers/net/gve/gve_ethdev.c<br>
@@ -10,6 +10,7 @@<br>
#include "gve_version.h"<br>
#include "rte_ether.h"<br>
#include "gve_rss.h"<br>
+#include <ethdev_driver.h><br>
<br>
static void<br>
gve_write_version(uint8_t *driver_version_register)<br>
@@ -671,7 +672,8 @@ gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)<br>
}<br>
<br>
static int<br>
-gve_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+gve_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
uint16_t i;<br>
if (gve_is_gqi(dev->data->dev_private))<br>
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c<br>
index cb5c013b21..75534c1ce2 100644<br>
--- a/drivers/net/hinic/hinic_pmd_ethdev.c<br>
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c<br>
@@ -5,6 +5,7 @@<br>
#include <rte_pci.h><br>
#include <bus_pci_driver.h><br>
#include <ethdev_pci.h><br>
+#include <ethdev_driver.h><br>
#include <rte_mbuf.h><br>
#include <rte_malloc.h><br>
#include <rte_memcpy.h><br>
@@ -1305,7 +1306,8 @@ static int hinic_set_dev_promiscuous(struct hinic_nic_dev *nic_dev, bool enable)<br>
* negative error value otherwise.<br>
*/<br>
static int<br>
-hinic_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+hinic_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
int i, err, q_num;<br>
u64 rx_discards_pmd = 0;<br>
@@ -1326,29 +1328,45 @@ hinic_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
dev->data->rx_mbuf_alloc_failed = 0;<br>
<br>
/* rx queue stats */<br>
- q_num = (nic_dev->num_rq < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
- nic_dev->num_rq : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
- for (i = 0; i < q_num; i++) {<br>
- rxq = nic_dev->rxqs[i];<br>
- hinic_rxq_get_stats(rxq, &rxq_stats);<br>
- stats->q_ipackets[i] = rxq_stats.packets;<br>
- stats->q_ibytes[i] = rxq_stats.bytes;<br>
- stats->q_errors[i] = rxq_stats.rx_discards;<br>
-<br>
- stats->ierrors += rxq_stats.errors;<br>
- rx_discards_pmd += rxq_stats.rx_discards;<br>
- dev->data->rx_mbuf_alloc_failed += rxq_stats.rx_nombuf;<br>
- }<br>
+ if (qstats) {<br>
+ q_num = (nic_dev->num_rq < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
+ nic_dev->num_rq : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
+ for (i = 0; i < q_num; i++) {<br>
+ rxq = nic_dev->rxqs[i];<br>
+ hinic_rxq_get_stats(rxq, &rxq_stats);<br>
+ qstats->q_ipackets[i] = rxq_stats.packets;<br>
+ qstats->q_ibytes[i] = rxq_stats.bytes;<br>
+ qstats->q_errors[i] = rxq_stats.rx_discards;<br>
+<br>
+ stats->ierrors += rxq_stats.errors;<br>
+ rx_discards_pmd += rxq_stats.rx_discards;<br>
+ dev->data->rx_mbuf_alloc_failed += rxq_stats.rx_nombuf;<br>
+ }<br>
<br>
- /* tx queue stats */<br>
- q_num = (nic_dev->num_sq < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
- nic_dev->num_sq : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
- for (i = 0; i < q_num; i++) {<br>
- txq = nic_dev->txqs[i];<br>
- hinic_txq_get_stats(txq, &txq_stats);<br>
- stats->q_opackets[i] = txq_stats.packets;<br>
- stats->q_obytes[i] = txq_stats.bytes;<br>
- stats->oerrors += (txq_stats.tx_busy + txq_stats.off_errs);<br>
+ /* tx queue stats */<br>
+ q_num = (nic_dev->num_sq < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
+ nic_dev->num_sq : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
+ for (i = 0; i < q_num; i++) {<br>
+ txq = nic_dev->txqs[i];<br>
+ hinic_txq_get_stats(txq, &txq_stats);<br>
+ qstats->q_opackets[i] = txq_stats.packets;<br>
+ qstats->q_obytes[i] = txq_stats.bytes;<br>
+ stats->oerrors += (txq_stats.tx_busy + txq_stats.off_errs);<br>
+ }<br>
+ } else {<br>
+ /* Still aggregate error stats even without qstats */<br>
+ for (i = 0; i < nic_dev->num_rq; i++) {<br>
+ rxq = nic_dev->rxqs[i];<br>
+ hinic_rxq_get_stats(rxq, &rxq_stats);<br>
+ stats->ierrors += rxq_stats.errors;<br>
+ rx_discards_pmd += rxq_stats.rx_discards;<br>
+ dev->data->rx_mbuf_alloc_failed += rxq_stats.rx_nombuf;<br>
+ }<br>
+ for (i = 0; i < nic_dev->num_sq; i++) {<br>
+ txq = nic_dev->txqs[i];<br>
+ hinic_txq_get_stats(txq, &txq_stats);<br>
+ stats->oerrors += (txq_stats.tx_busy + txq_stats.off_errs);<br>
+ }<br>
}<br>
<br>
/* vport stats */<br>
diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c<br>
index 9a1e8935e5..c8d5070a5b 100644<br>
--- a/drivers/net/hns3/hns3_stats.c<br>
+++ b/drivers/net/hns3/hns3_stats.c<br>
@@ -3,6 +3,7 @@<br>
*/<br>
<br>
#include <rte_ethdev.h><br>
+#include <ethdev_driver.h><br>
#include <rte_io.h><br>
#include <rte_malloc.h><br>
<br>
@@ -609,7 +610,8 @@ hns3_rcb_tx_ring_stats_get(struct hns3_tx_queue *txq,<br>
* 0 on success.<br>
*/<br>
int<br>
-hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats)<br>
+hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct hns3_adapter *hns = eth_dev->data->dev_private;<br>
struct hns3_hw *hw = &hns->hw;<br>
diff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h<br>
index 74bc4173cc..511af430a3 100644<br>
--- a/drivers/net/hns3/hns3_stats.h<br>
+++ b/drivers/net/hns3/hns3_stats.h<br>
@@ -151,7 +151,8 @@ struct hns3_reset_stats;<br>
struct hns3_hw;<br>
<br>
int hns3_stats_get(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *rte_stats);<br>
+ struct rte_eth_stats *rte_stats,<br>
+ struct eth_queue_stats *qstats);<br>
int hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
unsigned int n);<br>
int hns3_dev_xstats_reset(struct rte_eth_dev *dev);<br>
diff --git a/drivers/net/intel/cpfl/cpfl_ethdev.c b/drivers/net/intel/cpfl/cpfl_ethdev.c<br>
index 6d7b23ad7a..ed6852f23d 100644<br>
--- a/drivers/net/intel/cpfl/cpfl_ethdev.c<br>
+++ b/drivers/net/intel/cpfl/cpfl_ethdev.c<br>
@@ -311,7 +311,8 @@ cpfl_get_mbuf_alloc_failed_stats(struct rte_eth_dev *dev)<br>
}<br>
<br>
static int<br>
-cpfl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+cpfl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct cpfl_vport *cpfl_vport = dev->data->dev_private;<br>
struct idpf_vport *vport = &cpfl_vport->base;<br>
diff --git a/drivers/net/intel/e1000/em_ethdev.c b/drivers/net/intel/e1000/em_ethdev.c<br>
index 39dddf3384..ec3924bf6b 100644<br>
--- a/drivers/net/intel/e1000/em_ethdev.c<br>
+++ b/drivers/net/intel/e1000/em_ethdev.c<br>
@@ -42,7 +42,7 @@ static int eth_em_allmulticast_disable(struct rte_eth_dev *dev);<br>
static int eth_em_link_update(struct rte_eth_dev *dev,<br>
int wait_to_complete);<br>
static int eth_em_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *rte_stats);<br>
+ struct rte_eth_stats *rte_stats, struct eth_queue_stats *qstats);<br>
static int eth_em_stats_reset(struct rte_eth_dev *dev);<br>
static int eth_em_infos_get(struct rte_eth_dev *dev,<br>
struct rte_eth_dev_info *dev_info);<br>
@@ -926,7 +926,8 @@ em_hardware_init(struct e1000_hw *hw)<br>
<br>
/* This function is based on em_update_stats_counters() in e1000/if_em.c */<br>
static int<br>
-eth_em_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+eth_em_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
struct e1000_hw_stats *stats =<br>
@@ -1049,7 +1050,7 @@ eth_em_stats_reset(struct rte_eth_dev *dev)<br>
E1000_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
<br>
/* HW registers are cleared on read */<br>
- eth_em_stats_get(dev, NULL);<br>
+ eth_em_stats_get(dev, NULL, NULL);<br>
<br>
/* Reset software totals */<br>
memset(hw_stats, 0, sizeof(*hw_stats));<br>
diff --git a/drivers/net/intel/e1000/igb_ethdev.c b/drivers/net/intel/e1000/igb_ethdev.c<br>
index 124cf75762..f4e2a6442e 100644<br>
--- a/drivers/net/intel/e1000/igb_ethdev.c<br>
+++ b/drivers/net/intel/e1000/igb_ethdev.c<br>
@@ -86,7 +86,7 @@ static int eth_igb_allmulticast_disable(struct rte_eth_dev *dev);<br>
static int eth_igb_link_update(struct rte_eth_dev *dev,<br>
int wait_to_complete);<br>
static int eth_igb_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *rte_stats);<br>
+ struct rte_eth_stats *rte_stats, struct eth_queue_stats *qstats);<br>
static int eth_igb_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *xstats, unsigned n);<br>
static int eth_igb_xstats_get_by_id(struct rte_eth_dev *dev,<br>
@@ -163,7 +163,7 @@ static int igbvf_allmulticast_enable(struct rte_eth_dev *dev);<br>
static int igbvf_allmulticast_disable(struct rte_eth_dev *dev);<br>
static int eth_igbvf_link_update(struct e1000_hw *hw);<br>
static int eth_igbvf_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *rte_stats);<br>
+ struct rte_eth_stats *rte_stats, struct eth_queue_stats *qstats);<br>
static int eth_igbvf_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *xstats, unsigned n);<br>
static int eth_igbvf_xstats_get_names(struct rte_eth_dev *dev,<br>
@@ -1943,7 +1943,8 @@ igb_read_stats_registers(struct e1000_hw *hw, struct e1000_hw_stats *stats)<br>
}<br>
<br>
static int<br>
-eth_igb_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+eth_igb_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
struct e1000_hw_stats *stats =<br>
@@ -1976,7 +1977,7 @@ eth_igb_stats_reset(struct rte_eth_dev *dev)<br>
E1000_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
<br>
/* HW registers are cleared on read */<br>
- eth_igb_stats_get(dev, NULL);<br>
+ eth_igb_stats_get(dev, NULL, NULL);<br>
<br>
/* Reset software totals */<br>
memset(hw_stats, 0, sizeof(*hw_stats));<br>
@@ -2212,7 +2213,8 @@ eth_igbvf_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
}<br>
<br>
static int<br>
-eth_igbvf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+eth_igbvf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
struct e1000_vf_stats *hw_stats = (struct e1000_vf_stats *)<br>
@@ -2237,7 +2239,7 @@ eth_igbvf_stats_reset(struct rte_eth_dev *dev)<br>
E1000_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
<br>
/* Sync HW register to the last stats */<br>
- eth_igbvf_stats_get(dev, NULL);<br>
+ eth_igbvf_stats_get(dev, NULL, NULL);<br>
<br>
/* reset HW current stats*/<br>
memset(&hw_stats->gprc, 0, sizeof(*hw_stats) -<br>
diff --git a/drivers/net/intel/e1000/igc_ethdev.c b/drivers/net/intel/e1000/igc_ethdev.c<br>
index 68444e4fba..b9c91d2446 100644<br>
--- a/drivers/net/intel/e1000/igc_ethdev.c<br>
+++ b/drivers/net/intel/e1000/igc_ethdev.c<br>
@@ -226,7 +226,7 @@ static int eth_igc_allmulticast_enable(struct rte_eth_dev *dev);<br>
static int eth_igc_allmulticast_disable(struct rte_eth_dev *dev);<br>
static int eth_igc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);<br>
static int eth_igc_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *rte_stats);<br>
+ struct rte_eth_stats *rte_stats, struct eth_queue_stats *qstats);<br>
static int eth_igc_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *xstats, unsigned int n);<br>
static int eth_igc_xstats_get_by_id(struct rte_eth_dev *dev,<br>
@@ -2029,7 +2029,8 @@ igc_read_queue_stats_register(struct rte_eth_dev *dev)<br>
}<br>
<br>
static int<br>
-eth_igc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+eth_igc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct igc_adapter *igc = IGC_DEV_PRIVATE(dev);<br>
struct e1000_hw *hw = IGC_DEV_PRIVATE_HW(dev);<br>
@@ -2068,19 +2069,21 @@ eth_igc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
rte_stats->obytes = stats->gotc;<br>
<br>
/* Get per-queue statuses */<br>
- for (i = 0; i < IGC_QUEUE_PAIRS_NUM; i++) {<br>
- /* GET TX queue statuses */<br>
- int map_id = igc->txq_stats_map[i];<br>
- if (map_id >= 0) {<br>
- rte_stats->q_opackets[map_id] += queue_stats->pqgptc[i];<br>
- rte_stats->q_obytes[map_id] += queue_stats->pqgotc[i];<br>
- }<br>
- /* Get RX queue statuses */<br>
- map_id = igc->rxq_stats_map[i];<br>
- if (map_id >= 0) {<br>
- rte_stats->q_ipackets[map_id] += queue_stats->pqgprc[i];<br>
- rte_stats->q_ibytes[map_id] += queue_stats->pqgorc[i];<br>
- rte_stats->q_errors[map_id] += queue_stats->rqdpc[i];<br>
+ if (qstats) {<br>
+ for (i = 0; i < IGC_QUEUE_PAIRS_NUM; i++) {<br>
+ /* GET TX queue statuses */<br>
+ int map_id = igc->txq_stats_map[i];<br>
+ if (map_id >= 0) {<br>
+ qstats->q_opackets[map_id] += queue_stats->pqgptc[i];<br>
+ qstats->q_obytes[map_id] += queue_stats->pqgotc[i];<br>
+ }<br>
+ /* Get RX queue statuses */<br>
+ map_id = igc->rxq_stats_map[i];<br>
+ if (map_id >= 0) {<br>
+ qstats->q_ipackets[map_id] += queue_stats->pqgprc[i];<br>
+ qstats->q_ibytes[map_id] += queue_stats->pqgorc[i];<br>
+ qstats->q_errors[map_id] += queue_stats->rqdpc[i];<br>
+ }<br>
}<br>
}<br>
<br>
diff --git a/drivers/net/intel/fm10k/fm10k_ethdev.c b/drivers/net/intel/fm10k/fm10k_ethdev.c<br>
index 75ce2e19cf..bb05aecd97 100644<br>
--- a/drivers/net/intel/fm10k/fm10k_ethdev.c<br>
+++ b/drivers/net/intel/fm10k/fm10k_ethdev.c<br>
@@ -1314,7 +1314,8 @@ fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
}<br>
<br>
static int<br>
-fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
uint64_t ipackets, opackets, ibytes, obytes, imissed;<br>
struct fm10k_hw *hw =<br>
@@ -1329,17 +1330,19 @@ fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
<br>
ipackets = opackets = ibytes = obytes = imissed = 0;<br>
for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&<br>
- (i < hw->mac.max_queues); ++i) {<br>
- stats->q_ipackets[i] = hw_stats->q[i].rx_packets.count;<br>
- stats->q_opackets[i] = hw_stats->q[i].tx_packets.count;<br>
- stats->q_ibytes[i] = hw_stats->q[i].rx_bytes.count;<br>
- stats->q_obytes[i] = hw_stats->q[i].tx_bytes.count;<br>
- stats->q_errors[i] = hw_stats->q[i].rx_drops.count;<br>
- ipackets += stats->q_ipackets[i];<br>
- opackets += stats->q_opackets[i];<br>
- ibytes += stats->q_ibytes[i];<br>
- obytes += stats->q_obytes[i];<br>
- imissed += stats->q_errors[i];<br>
+ (i < hw->mac.max_queues); ++i) {<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ipackets[i] = hw_stats->q[i].rx_packets.count;<br>
+ qstats->q_opackets[i] = hw_stats->q[i].tx_packets.count;<br>
+ qstats->q_ibytes[i] = hw_stats->q[i].rx_bytes.count;<br>
+ qstats->q_obytes[i] = hw_stats->q[i].tx_bytes.count;<br>
+ qstats->q_errors[i] = hw_stats->q[i].rx_drops.count;<br>
+ }<br>
+ ipackets += hw_stats->q[i].rx_packets.count;<br>
+ opackets += hw_stats->q[i].tx_packets.count;<br>
+ ibytes += hw_stats->q[i].rx_bytes.count;<br>
+ obytes += hw_stats->q[i].tx_bytes.count;<br>
+ imissed += hw_stats->q[i].rx_drops.count;<br>
}<br>
stats->ipackets = ipackets;<br>
stats->opackets = opackets;<br>
diff --git a/drivers/net/intel/i40e/i40e_ethdev.c b/drivers/net/intel/i40e/i40e_ethdev.c<br>
index 7a562a6e0b..b8ce79061b 100644<br>
--- a/drivers/net/intel/i40e/i40e_ethdev.c<br>
+++ b/drivers/net/intel/i40e/i40e_ethdev.c<br>
@@ -256,7 +256,7 @@ static int i40e_dev_allmulticast_disable(struct rte_eth_dev *dev);<br>
static int i40e_dev_set_link_up(struct rte_eth_dev *dev);<br>
static int i40e_dev_set_link_down(struct rte_eth_dev *dev);<br>
static int i40e_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
static int i40e_dev_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *xstats, unsigned n);<br>
static int i40e_dev_xstats_get_names(struct rte_eth_dev *dev,<br>
@@ -3474,7 +3474,8 @@ i40e_read_stats_registers(struct i40e_pf *pf, struct i40e_hw *hw)<br>
<br>
/* Get all statistics of a port */<br>
static int<br>
-i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);<br>
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
diff --git a/drivers/net/intel/i40e/i40e_vf_representor.c b/drivers/net/intel/i40e/i40e_vf_representor.c<br>
index c00ae832aa..e8f0bb62a0 100644<br>
--- a/drivers/net/intel/i40e/i40e_vf_representor.c<br>
+++ b/drivers/net/intel/i40e/i40e_vf_representor.c<br>
@@ -209,7 +209,7 @@ rte_pmd_i40e_get_vf_native_stats(uint16_t port,<br>
<br>
static int<br>
i40e_vf_representor_stats_get(struct rte_eth_dev *ethdev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct i40e_vf_representor *representor = ethdev->data->dev_private;<br>
struct i40e_eth_stats native_stats;<br>
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c<br>
index 08c814725d..56bc6480e5 100644<br>
--- a/drivers/net/intel/iavf/iavf_ethdev.c<br>
+++ b/drivers/net/intel/iavf/iavf_ethdev.c<br>
@@ -105,7 +105,7 @@ static int iavf_dev_info_get(struct rte_eth_dev *dev,<br>
static const uint32_t *iavf_dev_supported_ptypes_get(struct rte_eth_dev *dev,<br>
size_t *no_of_elements);<br>
static int iavf_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
static int iavf_dev_stats_reset(struct rte_eth_dev *dev);<br>
static int iavf_dev_xstats_reset(struct rte_eth_dev *dev);<br>
static int iavf_dev_xstats_get(struct rte_eth_dev *dev,<br>
@@ -1798,7 +1798,8 @@ iavf_update_stats(struct iavf_vsi *vsi, struct virtchnl_eth_stats *nes)<br>
}<br>
<br>
static int<br>
-iavf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+iavf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct iavf_adapter *adapter =<br>
IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);<br>
diff --git a/drivers/net/intel/ice/ice_dcf_ethdev.c b/drivers/net/intel/ice/ice_dcf_ethdev.c<br>
index 499062be40..81da5a4656 100644<br>
--- a/drivers/net/intel/ice/ice_dcf_ethdev.c<br>
+++ b/drivers/net/intel/ice/ice_dcf_ethdev.c<br>
@@ -1514,7 +1514,8 @@ ice_dcf_update_stats(struct virtchnl_eth_stats *oes,<br>
<br>
<br>
static int<br>
-ice_dcf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ice_dcf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct ice_dcf_adapter *ad = dev->data->dev_private;<br>
struct ice_dcf_hw *hw = &ad->real_hw;<br>
diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c<br>
index 31f1419897..cdc4943667 100644<br>
--- a/drivers/net/intel/ice/ice_ethdev.c<br>
+++ b/drivers/net/intel/ice/ice_ethdev.c<br>
@@ -161,7 +161,7 @@ static int ice_get_module_info(struct rte_eth_dev *dev,<br>
static int ice_get_module_eeprom(struct rte_eth_dev *dev,<br>
struct rte_dev_eeprom_info *info);<br>
static int ice_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
static int ice_stats_reset(struct rte_eth_dev *dev);<br>
static int ice_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *xstats, unsigned int n);<br>
@@ -6340,7 +6340,8 @@ ice_read_stats_registers(struct ice_pf *pf, struct ice_hw *hw)<br>
<br>
/* Get all statistics of a port */<br>
static int<br>
-ice_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ice_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);<br>
struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
diff --git a/drivers/net/intel/idpf/idpf_ethdev.c b/drivers/net/intel/idpf/idpf_ethdev.c<br>
index 90720909bf..3c505e882a 100644<br>
--- a/drivers/net/intel/idpf/idpf_ethdev.c<br>
+++ b/drivers/net/intel/idpf/idpf_ethdev.c<br>
@@ -268,7 +268,8 @@ idpf_get_mbuf_alloc_failed_stats(struct rte_eth_dev *dev)<br>
}<br>
<br>
static int<br>
-idpf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+idpf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct idpf_vport *vport =<br>
(struct idpf_vport *)dev->data->dev_private;<br>
diff --git a/drivers/net/intel/ipn3ke/ipn3ke_representor.c b/drivers/net/intel/ipn3ke/ipn3ke_representor.c<br>
index c5aca0ea8f..cd34d08055 100644<br>
--- a/drivers/net/intel/ipn3ke/ipn3ke_representor.c<br>
+++ b/drivers/net/intel/ipn3ke/ipn3ke_representor.c<br>
@@ -2119,7 +2119,8 @@ ipn3ke_rpst_stats_reset(struct rte_eth_dev *ethdev)<br>
<br>
static int<br>
ipn3ke_rpst_stats_get<br>
-(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats)<br>
+(struct rte_eth_dev *ethdev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
uint16_t port_id = 0;<br>
char *ch;<br>
diff --git a/drivers/net/intel/ixgbe/ixgbe_ethdev.c b/drivers/net/intel/ixgbe/ixgbe_ethdev.c<br>
index 4f0343245e..7e1278c026 100644<br>
--- a/drivers/net/intel/ixgbe/ixgbe_ethdev.c<br>
+++ b/drivers/net/intel/ixgbe/ixgbe_ethdev.c<br>
@@ -164,7 +164,7 @@ static int ixgbe_dev_allmulticast_disable(struct rte_eth_dev *dev);<br>
static int ixgbe_dev_link_update(struct rte_eth_dev *dev,<br>
int wait_to_complete);<br>
static int ixgbe_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
static int ixgbe_dev_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *xstats, unsigned n);<br>
static int ixgbevf_dev_xstats_get(struct rte_eth_dev *dev,<br>
@@ -265,7 +265,7 @@ static int ixgbevf_dev_reset(struct rte_eth_dev *dev);<br>
static void ixgbevf_intr_disable(struct rte_eth_dev *dev);<br>
static void ixgbevf_intr_enable(struct rte_eth_dev *dev);<br>
static int ixgbevf_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
static int ixgbevf_dev_stats_reset(struct rte_eth_dev *dev);<br>
static int ixgbevf_vlan_filter_set(struct rte_eth_dev *dev,<br>
uint16_t vlan_id, int on);<br>
@@ -3398,7 +3398,7 @@ ixgbe_read_stats_registers(struct ixgbe_hw *hw,<br>
* This function is based on ixgbe_update_stats_counters() in ixgbe/ixgbe.c<br>
*/<br>
static int<br>
-ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
{<br>
struct ixgbe_hw *hw =<br>
IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);<br>
@@ -3427,13 +3427,15 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->opackets = hw_stats->gptc;<br>
stats->obytes = hw_stats->gotc;<br>
<br>
- for (i = 0; i < RTE_MIN_T(IXGBE_QUEUE_STAT_COUNTERS,<br>
- RTE_ETHDEV_QUEUE_STAT_CNTRS, typeof(i)); i++) {<br>
- stats->q_ipackets[i] = hw_stats->qprc[i];<br>
- stats->q_opackets[i] = hw_stats->qptc[i];<br>
- stats->q_ibytes[i] = hw_stats->qbrc[i];<br>
- stats->q_obytes[i] = hw_stats->qbtc[i];<br>
- stats->q_errors[i] = hw_stats->qprdc[i];<br>
+ if (qstats != NULL) {<br>
+ for (i = 0; i < RTE_MIN_T(IXGBE_QUEUE_STAT_COUNTERS,<br>
+ RTE_ETHDEV_QUEUE_STAT_CNTRS, typeof(i)); i++) {<br>
+ qstats->q_ipackets[i] = hw_stats->qprc[i];<br>
+ qstats->q_opackets[i] = hw_stats->qptc[i];<br>
+ qstats->q_ibytes[i] = hw_stats->qbrc[i];<br>
+ qstats->q_obytes[i] = hw_stats->qbtc[i];<br>
+ qstats->q_errors[i] = hw_stats->qprdc[i];<br>
+ }<br>
}<br>
<br>
/* Rx Errors */<br>
@@ -3468,7 +3470,7 @@ ixgbe_dev_stats_reset(struct rte_eth_dev *dev)<br>
IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
<br>
/* HW registers are cleared on read */<br>
- ixgbe_dev_stats_get(dev, NULL);<br>
+ ixgbe_dev_stats_get(dev, NULL, NULL);<br>
<br>
/* Reset software totals */<br>
memset(stats, 0, sizeof(*stats));<br>
@@ -3887,7 +3889,8 @@ ixgbevf_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
}<br>
<br>
static int<br>
-ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct ixgbevf_hw_stats *hw_stats = (struct ixgbevf_hw_stats *)<br>
IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
@@ -3911,7 +3914,7 @@ ixgbevf_dev_stats_reset(struct rte_eth_dev *dev)<br>
IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private);<br>
<br>
/* Sync HW register to the last stats */<br>
- ixgbevf_dev_stats_get(dev, NULL);<br>
+ ixgbevf_dev_stats_get(dev, NULL, NULL);<br>
<br>
/* reset HW current stats*/<br>
hw_stats->vfgprc = 0;<br>
diff --git a/drivers/net/ionic/ionic_ethdev.c b/drivers/net/ionic/ionic_ethdev.c<br>
index aa22b6a70d..6e9cd5f7eb 100644<br>
--- a/drivers/net/ionic/ionic_ethdev.c<br>
+++ b/drivers/net/ionic/ionic_ethdev.c<br>
@@ -39,7 +39,7 @@ static int ionic_dev_rss_hash_conf_get(struct rte_eth_dev *eth_dev,<br>
static int ionic_dev_rss_hash_update(struct rte_eth_dev *eth_dev,<br>
struct rte_eth_rss_conf *rss_conf);<br>
static int ionic_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *queue_stats);<br>
static int ionic_dev_stats_reset(struct rte_eth_dev *eth_dev);<br>
static int ionic_dev_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *xstats, unsigned int n);<br>
@@ -722,11 +722,11 @@ ionic_dev_rss_hash_update(struct rte_eth_dev *eth_dev,<br>
<br>
static int<br>
ionic_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
{<br>
struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);<br>
<br>
- ionic_lif_get_stats(lif, stats);<br>
+ ionic_lif_get_stats(lif, stats, qstats);<br>
<br>
return 0;<br>
}<br>
diff --git a/drivers/net/ionic/ionic_lif.c b/drivers/net/ionic/ionic_lif.c<br>
index b4dc118fef..b52c8cad88 100644<br>
--- a/drivers/net/ionic/ionic_lif.c<br>
+++ b/drivers/net/ionic/ionic_lif.c<br>
@@ -100,7 +100,8 @@ ionic_lif_reset(struct ionic_lif *lif)<br>
}<br>
<br>
static void<br>
-ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats)<br>
+ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct ionic_lif_stats *ls = &lif->info->stats;<br>
uint32_t i;<br>
@@ -144,13 +145,15 @@ ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats<br>
ls->rx_desc_fetch_error +<br>
ls->rx_desc_data_error;<br>
<br>
- for (i = 0; i < num_rx_q_counters; i++) {<br>
- struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats;<br>
- stats->q_ipackets[i] = rx_stats->packets;<br>
- stats->q_ibytes[i] = rx_stats->bytes;<br>
- stats->q_errors[i] =<br>
- rx_stats->bad_cq_status +<br>
- rx_stats->bad_len;<br>
+ if (qstats != NULL) {<br>
+ for (i = 0; i < num_rx_q_counters; i++) {<br>
+ struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats;<br>
+ qstats->q_ipackets[i] = rx_stats->packets;<br>
+ qstats->q_ibytes[i] = rx_stats->bytes;<br>
+ qstats->q_errors[i] =<br>
+ rx_stats->bad_cq_status +<br>
+ rx_stats->bad_len;<br>
+ }<br>
}<br>
<br>
/* TX */<br>
@@ -179,18 +182,20 @@ ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats<br>
ls->tx_desc_fetch_error +<br>
ls->tx_desc_data_error;<br>
<br>
- for (i = 0; i < num_tx_q_counters; i++) {<br>
- struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats;<br>
- stats->q_opackets[i] = tx_stats->packets;<br>
- stats->q_obytes[i] = tx_stats->bytes;<br>
+ if (qstats != NULL) {<br>
+ for (i = 0; i < num_tx_q_counters; i++) {<br>
+ struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats;<br>
+ qstats->q_opackets[i] = tx_stats->packets;<br>
+ qstats->q_obytes[i] = tx_stats->bytes;<br>
+ }<br>
}<br>
}<br>
<br>
void<br>
ionic_lif_get_stats(const struct ionic_lif *lif,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
{<br>
- ionic_lif_get_abs_stats(lif, stats);<br>
+ ionic_lif_get_abs_stats(lif, stats, qstats);<br>
<br>
stats->ipackets -= lif->stats_base.ipackets;<br>
stats->opackets -= lif->stats_base.opackets;<br>
@@ -214,7 +219,7 @@ ionic_lif_reset_stats(struct ionic_lif *lif)<br>
sizeof(struct ionic_tx_stats));<br>
}<br>
<br>
- ionic_lif_get_abs_stats(lif, &lif->stats_base);<br>
+ ionic_lif_get_abs_stats(lif, &lif->stats_base, NULL);<br>
}<br>
<br>
void<br>
diff --git a/drivers/net/ionic/ionic_lif.h b/drivers/net/ionic/ionic_lif.h<br>
index f4a1b9937e..2d85ebbcae 100644<br>
--- a/drivers/net/ionic/ionic_lif.h<br>
+++ b/drivers/net/ionic/ionic_lif.h<br>
@@ -9,6 +9,7 @@<br>
<br>
#include <rte_ethdev.h><br>
#include <rte_ether.h><br>
+#include <ethdev_driver.h><br>
<br>
#include "ionic.h"<br>
#include "ionic_dev.h"<br>
@@ -244,7 +245,7 @@ int ionic_lif_rss_config(struct ionic_lif *lif, const uint16_t types,<br>
int ionic_lif_set_features(struct ionic_lif *lif);<br>
<br>
void ionic_lif_get_stats(const struct ionic_lif *lif,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats);<br>
void ionic_lif_reset_stats(struct ionic_lif *lif);<br>
<br>
void ionic_lif_get_hw_stats(struct ionic_lif *lif,<br>
diff --git a/drivers/net/mana/mana.c b/drivers/net/mana/mana.c<br>
index 48e44bfafc..b7ae01b152 100644<br>
--- a/drivers/net/mana/mana.c<br>
+++ b/drivers/net/mana/mana.c<br>
@@ -645,7 +645,8 @@ mana_dev_link_update(struct rte_eth_dev *dev,<br>
}<br>
<br>
static int<br>
-mana_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mana_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
unsigned int i;<br>
<br>
@@ -659,9 +660,9 @@ mana_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->obytes += txq->stats.bytes;<br>
stats->oerrors += txq->stats.errors;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_opackets[i] = txq->stats.packets;<br>
- stats->q_obytes[i] = txq->stats.bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] = txq->stats.packets;<br>
+ qstats->q_obytes[i] = txq->stats.bytes;<br>
}<br>
}<br>
<br>
@@ -678,9 +679,9 @@ mana_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
<br>
/* There is no good way to get stats->imissed, not setting it */<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_ipackets[i] = rxq->stats.packets;<br>
- stats->q_ibytes[i] = rxq->stats.bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = rxq->stats.packets;<br>
+ qstats->q_ibytes[i] = rxq->stats.bytes;<br>
}<br>
<br>
stats->rx_nombuf += rxq->stats.nombuf;<br>
diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c<br>
index f7b04c4f9e..9de6f97cd9 100644<br>
--- a/drivers/net/memif/rte_eth_memif.c<br>
+++ b/drivers/net/memif/rte_eth_memif.c<br>
@@ -1578,7 +1578,8 @@ memif_link_update(struct rte_eth_dev *dev,<br>
}<br>
<br>
static int<br>
-memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct pmd_internals *pmd = dev->data->dev_private;<br>
struct memif_queue *mq;<br>
@@ -1598,8 +1599,10 @@ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
/* RX stats */<br>
for (i = 0; i < nq; i++) {<br>
mq = dev->data->rx_queues[i];<br>
- stats->q_ipackets[i] = mq->n_pkts;<br>
- stats->q_ibytes[i] = mq->n_bytes;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ipackets[i] = mq->n_pkts;<br>
+ qstats->q_ibytes[i] = mq->n_bytes;<br>
+ }<br>
stats->ipackets += mq->n_pkts;<br>
stats->ibytes += mq->n_bytes;<br>
}<br>
@@ -1612,8 +1615,10 @@ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
/* TX stats */<br>
for (i = 0; i < nq; i++) {<br>
mq = dev->data->tx_queues[i];<br>
- stats->q_opackets[i] = mq->n_pkts;<br>
- stats->q_obytes[i] = mq->n_bytes;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_opackets[i] = mq->n_pkts;<br>
+ qstats->q_obytes[i] = mq->n_bytes;<br>
+ }<br>
stats->opackets += mq->n_pkts;<br>
stats->obytes += mq->n_bytes;<br>
}<br>
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h<br>
index c992a1c5ea..f68eeb991a 100644<br>
--- a/drivers/net/mlx4/mlx4.h<br>
+++ b/drivers/net/mlx4/mlx4.h<br>
@@ -219,7 +219,8 @@ int mlx4_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr);<br>
int mlx4_set_mc_addr_list(struct rte_eth_dev *dev, struct rte_ether_addr *list,<br>
uint32_t num);<br>
int mlx4_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on);<br>
-int mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
int mlx4_stats_reset(struct rte_eth_dev *dev);<br>
int mlx4_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size);<br>
int mlx4_dev_infos_get(struct rte_eth_dev *dev,<br>
diff --git a/drivers/net/mlx4/mlx4_ethdev.c b/drivers/net/mlx4/mlx4_ethdev.c<br>
index f11c6b4373..efc6ee4577 100644<br>
--- a/drivers/net/mlx4/mlx4_ethdev.c<br>
+++ b/drivers/net/mlx4/mlx4_ethdev.c<br>
@@ -702,7 +702,8 @@ int mlx4_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)<br>
* Stats structure output buffer.<br>
*/<br>
int<br>
-mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct rte_eth_stats tmp;<br>
unsigned int i;<br>
@@ -716,10 +717,10 @@ mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
if (rxq == NULL)<br>
continue;<br>
idx = rxq->stats.idx;<br>
- if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- tmp.q_ipackets[idx] += rxq->stats.ipackets;<br>
- tmp.q_ibytes[idx] += rxq->stats.ibytes;<br>
- tmp.q_errors[idx] += (rxq->stats.idropped +<br>
+ if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[idx] += rxq->stats.ipackets;<br>
+ qstats->q_ibytes[idx] += rxq->stats.ibytes;<br>
+ qstats->q_errors[idx] += (rxq->stats.idropped +<br>
rxq->stats.rx_nombuf);<br>
}<br>
tmp.ipackets += rxq->stats.ipackets;<br>
@@ -733,9 +734,9 @@ mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
if (txq == NULL)<br>
continue;<br>
idx = txq->stats.idx;<br>
- if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- tmp.q_opackets[idx] += txq->stats.opackets;<br>
- tmp.q_obytes[idx] += txq->stats.obytes;<br>
+ if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[idx] += txq->stats.opackets;<br>
+ qstats->q_obytes[idx] += txq->stats.obytes;<br>
}<br>
tmp.opackets += txq->stats.opackets;<br>
tmp.obytes += txq->stats.obytes;<br>
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h<br>
index 93e298d648..e7fd4066ba 100644<br>
--- a/drivers/net/mlx5/mlx5.h<br>
+++ b/drivers/net/mlx5/mlx5.h<br>
@@ -2418,7 +2418,8 @@ int mlx5_allmulticast_disable(struct rte_eth_dev *dev);<br>
<br>
/* mlx5_stats.c */<br>
<br>
-int mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
int mlx5_stats_reset(struct rte_eth_dev *dev);<br>
int mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,<br>
unsigned int n);<br>
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c<br>
index ebc6f9fb53..5cd3e303cc 100644<br>
--- a/drivers/net/mlx5/mlx5_stats.c<br>
+++ b/drivers/net/mlx5/mlx5_stats.c<br>
@@ -208,7 +208,8 @@ mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,<br>
* rte_errno is set.<br>
*/<br>
int<br>
-mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct mlx5_priv *priv = dev->data->dev_private;<br>
struct mlx5_stats_ctrl *stats_ctrl = &priv->stats_ctrl;<br>
@@ -226,14 +227,14 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
if (rxq == NULL)<br>
continue;<br>
idx = rxq->idx;<br>
- if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
#ifdef MLX5_PMD_SOFT_COUNTERS<br>
- tmp.q_ipackets[idx] += rxq->stats.ipackets -<br>
+ qstats->q_ipackets[idx] += rxq->stats.ipackets -<br>
rxq->stats_reset.ipackets;<br>
- tmp.q_ibytes[idx] += rxq->stats.ibytes -<br>
+ qstats->q_ibytes[idx] += rxq->stats.ibytes -<br>
rxq->stats_reset.ibytes;<br>
#endif<br>
- tmp.q_errors[idx] += (rxq->stats.idropped +<br>
+ qstats->q_errors[idx] += (rxq->stats.idropped +<br>
rxq->stats.rx_nombuf) -<br>
(rxq->stats_reset.idropped +<br>
rxq->stats_reset.rx_nombuf);<br>
@@ -252,11 +253,11 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
if (txq == NULL)<br>
continue;<br>
idx = txq->idx;<br>
- if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
#ifdef MLX5_PMD_SOFT_COUNTERS<br>
- tmp.q_opackets[idx] += txq->stats.opackets -<br>
+ qstats->q_opackets[idx] += txq->stats.opackets -<br>
txq->stats_reset.opackets;<br>
- tmp.q_obytes[idx] += txq->stats.obytes -<br>
+ qstats->q_obytes[idx] += txq->stats.obytes -<br>
txq->stats_reset.obytes;<br>
#endif<br>
}<br>
diff --git a/drivers/net/mvneta/mvneta_ethdev.c b/drivers/net/mvneta/mvneta_ethdev.c<br>
index f99f9e6289..eef9758224 100644<br>
--- a/drivers/net/mvneta/mvneta_ethdev.c<br>
+++ b/drivers/net/mvneta/mvneta_ethdev.c<br>
@@ -712,7 +712,8 @@ mvneta_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)<br>
* 0 on success, negative error value otherwise.<br>
*/<br>
static int<br>
-mvneta_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mvneta_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct mvneta_priv *priv = dev->data->dev_private;<br>
struct neta_ppio_statistics ppio_stats;<br>
@@ -765,7 +766,7 @@ mvneta_stats_reset(struct rte_eth_dev *dev)<br>
if (!priv->ppio)<br>
return 0;<br>
<br>
- ret = mvneta_stats_get(dev, &priv->prev_stats);<br>
+ ret = mvneta_stats_get(dev, &priv->prev_stats, NULL);<br>
if (unlikely(ret))<br>
MVNETA_LOG(ERR, "Failed to reset port statistics");<br>
<br>
diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c<br>
index 4200c11d46..845819e4d8 100644<br>
--- a/drivers/net/mvpp2/mrvl_ethdev.c<br>
+++ b/drivers/net/mvpp2/mrvl_ethdev.c<br>
@@ -1486,7 +1486,8 @@ mrvl_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)<br>
* 0 on success, negative error value otherwise.<br>
*/<br>
static int<br>
-mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct mrvl_priv *priv = dev->data->dev_private;<br>
struct pp2_ppio_statistics ppio_stats;<br>
@@ -1521,12 +1522,14 @@ mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
break;<br>
}<br>
<br>
- stats->q_ibytes[idx] = rxq->bytes_recv;<br>
- stats->q_ipackets[idx] = rx_stats.enq_desc - rxq->drop_mac;<br>
- stats->q_errors[idx] = rx_stats.drop_early +<br>
- rx_stats.drop_fullq +<br>
- rx_stats.drop_bm +<br>
- rxq->drop_mac;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ibytes[idx] = rxq->bytes_recv;<br>
+ qstats->q_ipackets[idx] = rx_stats.enq_desc - rxq->drop_mac;<br>
+ qstats->q_errors[idx] = rx_stats.drop_early +<br>
+ rx_stats.drop_fullq +<br>
+ rx_stats.drop_bm +<br>
+ rxq->drop_mac;<br>
+ }<br>
stats->ibytes += rxq->bytes_recv;<br>
drop_mac += rxq->drop_mac;<br>
}<br>
@@ -1553,8 +1556,10 @@ mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
break;<br>
}<br>
<br>
- stats->q_opackets[idx] = tx_stats.deq_desc;<br>
- stats->q_obytes[idx] = txq->bytes_sent;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_opackets[idx] = tx_stats.deq_desc;<br>
+ qstats->q_obytes[idx] = txq->bytes_sent;<br>
+ }<br>
stats->obytes += txq->bytes_sent;<br>
}<br>
<br>
diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c<br>
index 1d788f3fb7..a31aac1a8a 100644<br>
--- a/drivers/net/netvsc/hn_ethdev.c<br>
+++ b/drivers/net/netvsc/hn_ethdev.c<br>
@@ -817,11 +817,12 @@ static int hn_dev_configure(struct rte_eth_dev *dev)<br>
}<br>
<br>
static int hn_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
unsigned int i;<br>
<br>
- hn_vf_stats_get(dev, stats);<br>
+ hn_vf_stats_get(dev, stats, qstats);<br>
<br>
for (i = 0; i < dev->data->nb_tx_queues; i++) {<br>
const struct hn_tx_queue *txq = dev->data->tx_queues[i];<br>
@@ -833,9 +834,9 @@ static int hn_dev_stats_get(struct rte_eth_dev *dev,<br>
stats->obytes += txq->stats.bytes;<br>
stats->oerrors += txq->stats.errors;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_opackets[i] += txq->stats.packets;<br>
- stats->q_obytes[i] += txq->stats.bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] += txq->stats.packets;<br>
+ qstats->q_obytes[i] += txq->stats.bytes;<br>
}<br>
}<br>
<br>
@@ -850,9 +851,9 @@ static int hn_dev_stats_get(struct rte_eth_dev *dev,<br>
stats->ierrors += rxq->stats.errors;<br>
stats->imissed += rxq->stats.ring_full;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_ipackets[i] += rxq->stats.packets;<br>
- stats->q_ibytes[i] += rxq->stats.bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] += rxq->stats.packets;<br>
+ qstats->q_ibytes[i] += rxq->stats.bytes;<br>
}<br>
}<br>
<br>
diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h<br>
index ccbd6b6a33..17c1d5d07b 100644<br>
--- a/drivers/net/netvsc/hn_var.h<br>
+++ b/drivers/net/netvsc/hn_var.h<br>
@@ -269,7 +269,8 @@ int hn_vf_rx_queue_setup(struct rte_eth_dev *dev,<br>
struct rte_mempool *mp);<br>
void hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id);<br>
<br>
-int hn_vf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int hn_vf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
int hn_vf_stats_reset(struct rte_eth_dev *dev);<br>
int hn_vf_xstats_get_names(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat_name *xstats_names,<br>
diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c<br>
index d922e685f4..0ecfaf54ea 100644<br>
--- a/drivers/net/netvsc/hn_vf.c<br>
+++ b/drivers/net/netvsc/hn_vf.c<br>
@@ -677,7 +677,8 @@ void hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id)<br>
}<br>
<br>
int hn_vf_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct hn_data *hv = dev->data->dev_private;<br>
struct rte_eth_dev *vf_dev;<br>
diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c<br>
index 804ad494d5..4eeb9aee3b 100644<br>
--- a/drivers/net/nfp/flower/nfp_flower.c<br>
+++ b/drivers/net/nfp/flower/nfp_flower.c<br>
@@ -238,8 +238,8 @@ nfp_flower_multiple_pf_recv_pkts(void *rx_queue,<br>
for (i = 0; i < recv; i++)<br>
data_len += rx_pkts[i]->data_len;<br>
<br>
- repr->repr_stats.q_ipackets[rxq->qidx] += recv;<br>
- repr->repr_stats.q_ibytes[rxq->qidx] += data_len;<br>
+ repr->repr_qstats.q_ipackets[rxq->qidx] += recv;<br>
+ repr->repr_qstats.q_ibytes[rxq->qidx] += data_len;<br>
}<br>
<br>
return recv;<br>
@@ -276,8 +276,8 @@ nfp_flower_multiple_pf_xmit_pkts(void *tx_queue,<br>
for (i = 0; i < sent; i++)<br>
data_len += tx_pkts[i]->data_len;<br>
<br>
- repr->repr_stats.q_opackets[txq->qidx] += sent;<br>
- repr->repr_stats.q_obytes[txq->qidx] += data_len;<br>
+ repr->repr_qstats.q_opackets[txq->qidx] += sent;<br>
+ repr->repr_qstats.q_obytes[txq->qidx] += data_len;<br>
}<br>
<br>
return sent;<br>
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c<br>
index 6c3a30c694..9b984dbc8d 100644<br>
--- a/drivers/net/nfp/flower/nfp_flower_representor.c<br>
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c<br>
@@ -314,7 +314,7 @@ nfp_flower_repr_tx_queue_setup(struct rte_eth_dev *dev,<br>
<br>
static int<br>
nfp_flower_repr_stats_get(struct rte_eth_dev *ethdev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
uint16_t i;<br>
struct nfp_flower_representor *repr;<br>
@@ -324,15 +324,15 @@ nfp_flower_repr_stats_get(struct rte_eth_dev *ethdev,<br>
repr->repr_stats.ipackets = 0;<br>
repr->repr_stats.ibytes = 0;<br>
for (i = 0; i < ethdev->data->nb_rx_queues; i++) {<br>
- repr->repr_stats.ipackets += repr->repr_stats.q_ipackets[i];<br>
- repr->repr_stats.ibytes += repr->repr_stats.q_ibytes[i];<br>
+ repr->repr_stats.ipackets += repr->repr_qstats.q_ipackets[i];<br>
+ repr->repr_stats.ibytes += repr->repr_qstats.q_ibytes[i];<br>
}<br>
<br>
repr->repr_stats.opackets = 0;<br>
repr->repr_stats.obytes = 0;<br>
for (i = 0; i < ethdev->data->nb_tx_queues; i++) {<br>
- repr->repr_stats.opackets += repr->repr_stats.q_opackets[i];<br>
- repr->repr_stats.obytes += repr->repr_stats.q_obytes[i];<br>
+ repr->repr_stats.opackets += repr->repr_qstats.q_opackets[i];<br>
+ repr->repr_stats.obytes += repr->repr_qstats.q_obytes[i];<br>
}<br>
<br>
*stats = repr->repr_stats;<br>
@@ -347,6 +347,7 @@ nfp_flower_repr_stats_reset(struct rte_eth_dev *ethdev)<br>
<br>
repr = ethdev->data->dev_private;<br>
memset(&repr->repr_stats, 0, sizeof(struct rte_eth_stats));<br>
+ memset(&repr->repr_qstats, 0, sizeof(struct eth_queue_stats));<br>
<br>
return 0;<br>
}<br>
@@ -402,8 +403,8 @@ nfp_flower_repr_rx_burst(void *rx_queue,<br>
for (i = 0; i < total_dequeue; i++)<br>
data_len += rx_pkts[i]->data_len;<br>
<br>
- repr->repr_stats.q_ipackets[rxq->qidx] += total_dequeue;<br>
- repr->repr_stats.q_ibytes[rxq->qidx] += data_len;<br>
+ repr->repr_qstats.q_ipackets[rxq->qidx] += total_dequeue;<br>
+ repr->repr_qstats.q_ibytes[rxq->qidx] += data_len;<br>
}<br>
<br>
return total_dequeue;<br>
@@ -450,8 +451,8 @@ nfp_flower_repr_tx_burst(void *tx_queue,<br>
for (i = 0; i < sent; i++)<br>
data_len += tx_pkts[i]->data_len;<br>
<br>
- repr->repr_stats.q_opackets[txq->qidx] += sent;<br>
- repr->repr_stats.q_obytes[txq->qidx] += data_len;<br>
+ repr->repr_qstats.q_opackets[txq->qidx] += sent;<br>
+ repr->repr_qstats.q_obytes[txq->qidx] += data_len;<br>
}<br>
<br>
return sent;<br>
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.h b/drivers/net/nfp/flower/nfp_flower_representor.h<br>
index a7416eccab..66714d9a51 100644<br>
--- a/drivers/net/nfp/flower/nfp_flower_representor.h<br>
+++ b/drivers/net/nfp/flower/nfp_flower_representor.h<br>
@@ -6,6 +6,8 @@<br>
#ifndef __NFP_FLOWER_REPRESENTOR_H__<br>
#define __NFP_FLOWER_REPRESENTOR_H__<br>
<br>
+#include <ethdev_driver.h><br>
+<br>
#include "nfp_flower.h"<br>
<br>
struct nfp_flower_representor {<br>
@@ -20,6 +22,7 @@ struct nfp_flower_representor {<br>
struct rte_ring **ring;<br>
struct rte_eth_link link;<br>
struct rte_eth_stats repr_stats;<br>
+ struct eth_queue_stats repr_qstats;<br>
<br>
struct rte_eth_xstat *repr_xstats_base;<br>
uint8_t *mac_stats;<br>
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c<br>
index 730372e279..d35eee970a 100644<br>
--- a/drivers/net/nfp/nfp_net_common.c<br>
+++ b/drivers/net/nfp/nfp_net_common.c<br>
@@ -904,7 +904,7 @@ nfp_net_link_update(struct rte_eth_dev *dev,<br>
<br>
int<br>
nfp_net_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats, struct eth_queue_stats *qstats)<br>
{<br>
uint16_t i;<br>
struct nfp_net_hw *hw;<br>
@@ -922,15 +922,16 @@ nfp_net_stats_get(struct rte_eth_dev *dev,<br>
if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)<br>
break;<br>
<br>
- nfp_dev_stats.q_ipackets[i] =<br>
- nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i));<br>
- nfp_dev_stats.q_ipackets[i] -=<br>
- hw->eth_stats_base.q_ipackets[i];<br>
+ uint64_t q_ipackets = nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i));<br>
+ q_ipackets -= hw->eth_qstats_base.q_ipackets[i];<br>
<br>
- nfp_dev_stats.q_ibytes[i] =<br>
- nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i) + 0x8);<br>
- nfp_dev_stats.q_ibytes[i] -=<br>
- hw->eth_stats_base.q_ibytes[i];<br>
+ uint64_t q_ibytes = nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i) + 0x8);<br>
+ q_ibytes -= hw->eth_qstats_base.q_ibytes[i];<br>
+<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ipackets[i] = q_ipackets;<br>
+ qstats->q_ibytes[i] = q_ibytes;<br>
+ }<br>
}<br>
<br>
/* Reading per TX ring stats */<br>
@@ -938,13 +939,16 @@ nfp_net_stats_get(struct rte_eth_dev *dev,<br>
if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)<br>
break;<br>
<br>
- nfp_dev_stats.q_opackets[i] =<br>
- nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i));<br>
- nfp_dev_stats.q_opackets[i] -= hw->eth_stats_base.q_opackets[i];<br>
+ uint64_t q_opackets = nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i));<br>
+ q_opackets -= hw->eth_qstats_base.q_opackets[i];<br>
<br>
- nfp_dev_stats.q_obytes[i] =<br>
- nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i) + 0x8);<br>
- nfp_dev_stats.q_obytes[i] -= hw->eth_stats_base.q_obytes[i];<br>
+ uint64_t q_obytes = nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i) + 0x8);<br>
+ q_obytes -= hw->eth_qstats_base.q_obytes[i];<br>
+<br>
+ if (qstats != NULL) {<br>
+ qstats->q_opackets[i] = q_opackets;<br>
+ qstats->q_obytes[i] = q_obytes;<br>
+ }<br>
}<br>
<br>
nfp_dev_stats.ipackets = nn_cfg_readq(&hw->super, NFP_NET_CFG_STATS_RX_FRAMES);<br>
@@ -982,8 +986,8 @@ nfp_net_stats_get(struct rte_eth_dev *dev,<br>
}<br>
<br>
/*<br>
- * hw->eth_stats_base records the per counter starting point.<br>
- * Lets update it now.<br>
+ * hw->eth_stats_base and hw->eth_qstats_base record the per counter starting point.<br>
+ * Let's update them now.<br>
*/<br>
int<br>
nfp_net_stats_reset(struct rte_eth_dev *dev)<br>
@@ -998,10 +1002,10 @@ nfp_net_stats_reset(struct rte_eth_dev *dev)<br>
if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)<br>
break;<br>
<br>
- hw->eth_stats_base.q_ipackets[i] =<br>
+ hw->eth_qstats_base.q_ipackets[i] =<br>
nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i));<br>
<br>
- hw->eth_stats_base.q_ibytes[i] =<br>
+ hw->eth_qstats_base.q_ibytes[i] =<br>
nn_cfg_readq(&hw->super, NFP_NET_CFG_RXR_STATS(i) + 0x8);<br>
}<br>
<br>
@@ -1010,10 +1014,10 @@ nfp_net_stats_reset(struct rte_eth_dev *dev)<br>
if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)<br>
break;<br>
<br>
- hw->eth_stats_base.q_opackets[i] =<br>
+ hw->eth_qstats_base.q_opackets[i] =<br>
nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i));<br>
<br>
- hw->eth_stats_base.q_obytes[i] =<br>
+ hw->eth_qstats_base.q_obytes[i] =<br>
nn_cfg_readq(&hw->super, NFP_NET_CFG_TXR_STATS(i) + 0x8);<br>
}<br>
<br>
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h<br>
index a6addf8610..2bd2d54028 100644<br>
--- a/drivers/net/nfp/nfp_net_common.h<br>
+++ b/drivers/net/nfp/nfp_net_common.h<br>
@@ -250,6 +250,7 @@ struct nfp_net_hw {<br>
<br>
/** Records starting point for counters */<br>
struct rte_eth_stats eth_stats_base;<br>
+ struct eth_queue_stats eth_qstats_base;<br>
struct rte_eth_xstat *eth_xstats_base;<br>
<br>
struct nfp_cpp_area *ctrl_area;<br>
@@ -301,7 +302,8 @@ int nfp_net_link_update_common(struct rte_eth_dev *dev,<br>
uint32_t link_status);<br>
int nfp_net_link_update(struct rte_eth_dev *dev,<br>
__rte_unused int wait_to_complete);<br>
-int nfp_net_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int nfp_net_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
int nfp_net_stats_reset(struct rte_eth_dev *dev);<br>
uint32_t nfp_net_xstats_size(const struct rte_eth_dev *dev);<br>
int nfp_net_xstats_get_names(struct rte_eth_dev *dev,<br>
diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c<br>
index d3ac40299f..adb7785498 100644<br>
--- a/drivers/net/ngbe/ngbe_ethdev.c<br>
+++ b/drivers/net/ngbe/ngbe_ethdev.c<br>
@@ -1498,7 +1498,8 @@ ngbe_read_stats_registers(struct ngbe_hw *hw,<br>
}<br>
<br>
static int<br>
-ngbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ngbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct ngbe_hw *hw = ngbe_dev_hw(dev);<br>
struct ngbe_hw_stats *hw_stats = NGBE_DEV_STATS(dev);<br>
@@ -1518,29 +1519,31 @@ ngbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->opackets = hw_stats->tx_packets;<br>
stats->obytes = hw_stats->tx_bytes;<br>
<br>
- memset(&stats->q_ipackets, 0, sizeof(stats->q_ipackets));<br>
- memset(&stats->q_opackets, 0, sizeof(stats->q_opackets));<br>
- memset(&stats->q_ibytes, 0, sizeof(stats->q_ibytes));<br>
- memset(&stats->q_obytes, 0, sizeof(stats->q_obytes));<br>
- memset(&stats->q_errors, 0, sizeof(stats->q_errors));<br>
- for (i = 0; i < NGBE_MAX_QP; i++) {<br>
- uint32_t n = i / NB_QMAP_FIELDS_PER_QSM_REG;<br>
- uint32_t offset = (i % NB_QMAP_FIELDS_PER_QSM_REG) * 8;<br>
- uint32_t q_map;<br>
-<br>
- q_map = (stat_mappings->rqsm[n] >> offset)<br>
- & QMAP_FIELD_RESERVED_BITS_MASK;<br>
- j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
- ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
- stats->q_ipackets[j] += hw_stats->qp[i].rx_qp_packets;<br>
- stats->q_ibytes[j] += hw_stats->qp[i].rx_qp_bytes;<br>
-<br>
- q_map = (stat_mappings->tqsm[n] >> offset)<br>
- & QMAP_FIELD_RESERVED_BITS_MASK;<br>
- j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
- ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
- stats->q_opackets[j] += hw_stats->qp[i].tx_qp_packets;<br>
- stats->q_obytes[j] += hw_stats->qp[i].tx_qp_bytes;<br>
+ if (qstats != NULL) {<br>
+ memset(&qstats->q_ipackets, 0, sizeof(qstats->q_ipackets));<br>
+ memset(&qstats->q_opackets, 0, sizeof(qstats->q_opackets));<br>
+ memset(&qstats->q_ibytes, 0, sizeof(qstats->q_ibytes));<br>
+ memset(&qstats->q_obytes, 0, sizeof(qstats->q_obytes));<br>
+ memset(&qstats->q_errors, 0, sizeof(qstats->q_errors));<br>
+ for (i = 0; i < NGBE_MAX_QP; i++) {<br>
+ uint32_t n = i / NB_QMAP_FIELDS_PER_QSM_REG;<br>
+ uint32_t offset = (i % NB_QMAP_FIELDS_PER_QSM_REG) * 8;<br>
+ uint32_t q_map;<br>
+<br>
+ q_map = (stat_mappings->rqsm[n] >> offset)<br>
+ & QMAP_FIELD_RESERVED_BITS_MASK;<br>
+ j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
+ ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+ qstats->q_ipackets[j] += hw_stats->qp[i].rx_qp_packets;<br>
+ qstats->q_ibytes[j] += hw_stats->qp[i].rx_qp_bytes;<br>
+<br>
+ q_map = (stat_mappings->tqsm[n] >> offset)<br>
+ & QMAP_FIELD_RESERVED_BITS_MASK;<br>
+ j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
+ ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+ qstats->q_opackets[j] += hw_stats->qp[i].tx_qp_packets;<br>
+ qstats->q_obytes[j] += hw_stats->qp[i].tx_qp_bytes;<br>
+ }<br>
}<br>
<br>
/* Rx Errors */<br>
@@ -1580,7 +1583,7 @@ ngbe_dev_stats_reset(struct rte_eth_dev *dev)<br>
<br>
/* HW registers are cleared on read */<br>
hw->offset_loaded = 0;<br>
- ngbe_dev_stats_get(dev, NULL);<br>
+ ngbe_dev_stats_get(dev, NULL, NULL);<br>
hw->offset_loaded = 1;<br>
<br>
/* Reset software totals */<br>
diff --git a/drivers/net/ngbe/ngbe_ethdev_vf.c b/drivers/net/ngbe/ngbe_ethdev_vf.c<br>
index 846bc981f6..e575c47049 100644<br>
--- a/drivers/net/ngbe/ngbe_ethdev_vf.c<br>
+++ b/drivers/net/ngbe/ngbe_ethdev_vf.c<br>
@@ -425,7 +425,8 @@ ngbevf_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
}<br>
<br>
static int<br>
-ngbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+ngbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct ngbevf_hw_stats *hw_stats = (struct ngbevf_hw_stats *)<br>
NGBE_DEV_STATS(dev);<br>
@@ -449,7 +450,7 @@ ngbevf_dev_stats_reset(struct rte_eth_dev *dev)<br>
NGBE_DEV_STATS(dev);<br>
<br>
/* Sync HW register to the last stats */<br>
- ngbevf_dev_stats_get(dev, NULL);<br>
+ ngbevf_dev_stats_get(dev, NULL, NULL);<br>
<br>
/* reset HW current stats*/<br>
hw_stats->vfgprc = 0;<br>
diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c<br>
index 79ef9e7e7c..4c090aa521 100644<br>
--- a/drivers/net/ntnic/ntnic_ethdev.c<br>
+++ b/drivers/net/ntnic/ntnic_ethdev.c<br>
@@ -167,7 +167,8 @@ get_pdrv_from_pci(struct rte_pci_addr addr)<br>
return p_drv;<br>
}<br>
<br>
-static int dpdk_stats_collect(struct pmd_internals *internals, struct rte_eth_stats *stats)<br>
+static int dpdk_stats_collect(struct pmd_internals *internals, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
const struct ntnic_filter_ops *ntnic_filter_ops = get_ntnic_filter_ops();<br>
<br>
@@ -201,19 +202,19 @@ static int dpdk_stats_collect(struct pmd_internals *internals, struct rte_eth_st<br>
ntnic_filter_ops->poll_statistics(internals);<br>
<br>
for (i = 0; i < internals->nb_rx_queues; i++) {<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_ipackets[i] = internals->rxq_scg[i].rx_pkts;<br>
- stats->q_ibytes[i] = internals->rxq_scg[i].rx_bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = internals->rxq_scg[i].rx_pkts;<br>
+ qstats->q_ibytes[i] = internals->rxq_scg[i].rx_bytes;<br>
}<br>
rx_total += internals->rxq_scg[i].rx_pkts;<br>
rx_total_b += internals->rxq_scg[i].rx_bytes;<br>
}<br>
<br>
for (i = 0; i < internals->nb_tx_queues; i++) {<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_opackets[i] = internals->txq_scg[i].tx_pkts;<br>
- stats->q_obytes[i] = internals->txq_scg[i].tx_bytes;<br>
- stats->q_errors[i] = internals->txq_scg[i].err_pkts;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] = internals->txq_scg[i].tx_pkts;<br>
+ qstats->q_obytes[i] = internals->txq_scg[i].tx_bytes;<br>
+ qstats->q_errors[i] = internals->txq_scg[i].err_pkts;<br>
}<br>
tx_total += internals->txq_scg[i].tx_pkts;<br>
tx_total_b += internals->txq_scg[i].tx_bytes;<br>
@@ -303,10 +304,11 @@ eth_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete __rte_unused)<br>
return 0;<br>
}<br>
<br>
-static int eth_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)<br>
+static int eth_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct pmd_internals *internals = eth_dev->data->dev_private;<br>
- dpdk_stats_collect(internals, stats);<br>
+ dpdk_stats_collect(internals, stats, qstats);<br>
return 0;<br>
}<br>
<br>
diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c<br>
index 4f273319f2..14bc65c8ad 100644<br>
--- a/drivers/net/null/rte_eth_null.c<br>
+++ b/drivers/net/null/rte_eth_null.c<br>
@@ -426,7 +426,8 @@ eth_dev_info(struct rte_eth_dev *dev,<br>
}<br>
<br>
static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
const struct pmd_internals *internal = dev->data->dev_private;<br>
unsigned int i;<br>
@@ -438,9 +439,9 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->ipackets += pkts;<br>
stats->ibytes += bytes;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_ipackets[i] = pkts;<br>
- stats->q_ibytes[i] = bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = pkts;<br>
+ qstats->q_ibytes[i] = bytes;<br>
}<br>
}<br>
<br>
@@ -454,9 +455,9 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->opackets = pkts;<br>
stats->obytes = bytes;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_opackets[i] = pkts;<br>
- stats->q_obytes[i] = bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] = pkts;<br>
+ qstats->q_obytes[i] = bytes;<br>
}<br>
}<br>
<br>
diff --git a/drivers/net/octeon_ep/otx_ep_ethdev.c b/drivers/net/octeon_ep/otx_ep_ethdev.c<br>
index 10f2f8a2e0..79dc02ee0b 100644<br>
--- a/drivers/net/octeon_ep/otx_ep_ethdev.c<br>
+++ b/drivers/net/octeon_ep/otx_ep_ethdev.c<br>
@@ -608,7 +608,8 @@ otx_ep_dev_stats_reset(struct rte_eth_dev *dev)<br>
<br>
static int<br>
otx_ep_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct otx_ep_device *otx_epvf = OTX_EP_DEV(eth_dev);<br>
struct otx_ep_iq_stats *ostats;<br>
@@ -619,17 +620,21 @@ otx_ep_dev_stats_get(struct rte_eth_dev *eth_dev,<br>
<br>
for (i = 0; i < otx_epvf->nb_tx_queues; i++) {<br>
ostats = &otx_epvf->instr_queue[i]->stats;<br>
- stats->q_opackets[i] = ostats->tx_pkts;<br>
- stats->q_obytes[i] = ostats->tx_bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] = ostats->tx_pkts;<br>
+ qstats->q_obytes[i] = ostats->tx_bytes;<br>
+ }<br>
stats->opackets += ostats->tx_pkts;<br>
stats->obytes += ostats->tx_bytes;<br>
stats->oerrors += ostats->instr_dropped;<br>
}<br>
for (i = 0; i < otx_epvf->nb_rx_queues; i++) {<br>
istats = &otx_epvf->droq[i]->stats;<br>
- stats->q_ipackets[i] = istats->pkts_received;<br>
- stats->q_ibytes[i] = istats->bytes_received;<br>
- stats->q_errors[i] = istats->rx_err;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = istats->pkts_received;<br>
+ qstats->q_ibytes[i] = istats->bytes_received;<br>
+ qstats->q_errors[i] = istats->rx_err;<br>
+ }<br>
stats->ipackets += istats->pkts_received;<br>
stats->ibytes += istats->bytes_received;<br>
stats->imissed += istats->rx_alloc_failure;<br>
diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c<br>
index 9451431144..21e3e56901 100644<br>
--- a/drivers/net/octeontx/octeontx_ethdev.c<br>
+++ b/drivers/net/octeontx/octeontx_ethdev.c<br>
@@ -1022,7 +1022,8 @@ octeontx_dev_xstats_get(struct rte_eth_dev *dev,<br>
}<br>
<br>
static int<br>
-octeontx_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+octeontx_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct octeontx_nic *nic = octeontx_pmd_priv(dev);<br>
<br>
diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c<br>
index 728ef85d53..f323c0b0df 100644<br>
--- a/drivers/net/pcap/pcap_ethdev.c<br>
+++ b/drivers/net/pcap/pcap_ethdev.c<br>
@@ -750,7 +750,8 @@ eth_dev_info(struct rte_eth_dev *dev,<br>
}<br>
<br>
static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
unsigned int i;<br>
unsigned long rx_packets_total = 0, rx_bytes_total = 0;<br>
@@ -762,21 +763,25 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
<br>
for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
i < dev->data->nb_rx_queues; i++) {<br>
- stats->q_ipackets[i] = internal->rx_queue[i].rx_stat.pkts;<br>
- stats->q_ibytes[i] = internal->rx_queue[i].rx_stat.bytes;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ipackets[i] = internal->rx_queue[i].rx_stat.pkts;<br>
+ qstats->q_ibytes[i] = internal->rx_queue[i].rx_stat.bytes;<br>
+ }<br>
rx_nombuf_total += internal->rx_queue[i].rx_stat.rx_nombuf;<br>
rx_err_total += internal->rx_queue[i].rx_stat.err_pkts;<br>
- rx_packets_total += stats->q_ipackets[i];<br>
- rx_bytes_total += stats->q_ibytes[i];<br>
+ rx_packets_total += internal->rx_queue[i].rx_stat.pkts;<br>
+ rx_bytes_total += internal->rx_queue[i].rx_stat.bytes;<br>
rx_missed_total += queue_missed_stat_get(dev, i);<br>
}<br>
<br>
for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
i < dev->data->nb_tx_queues; i++) {<br>
- stats->q_opackets[i] = internal->tx_queue[i].tx_stat.pkts;<br>
- stats->q_obytes[i] = internal->tx_queue[i].tx_stat.bytes;<br>
- tx_packets_total += stats->q_opackets[i];<br>
- tx_bytes_total += stats->q_obytes[i];<br>
+ if (qstats != NULL) {<br>
+ qstats->q_opackets[i] = internal->tx_queue[i].tx_stat.pkts;<br>
+ qstats->q_obytes[i] = internal->tx_queue[i].tx_stat.bytes;<br>
+ }<br>
+ tx_packets_total += internal->tx_queue[i].tx_stat.pkts;<br>
+ tx_bytes_total += internal->tx_queue[i].tx_stat.bytes;<br>
tx_packets_err_total += internal->tx_queue[i].tx_stat.err_pkts;<br>
}<br>
<br>
diff --git a/drivers/net/pfe/pfe_ethdev.c b/drivers/net/pfe/pfe_ethdev.c<br>
index 725ffcb2bc..1efa17539e 100644<br>
--- a/drivers/net/pfe/pfe_ethdev.c<br>
+++ b/drivers/net/pfe/pfe_ethdev.c<br>
@@ -713,7 +713,8 @@ pfe_dev_set_mac_addr(struct rte_eth_dev *dev,<br>
<br>
static int<br>
pfe_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct pfe_eth_priv_s *priv = dev->data->dev_private;<br>
struct rte_eth_stats *eth_stats = &priv->stats;<br>
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c<br>
index bee9fa4f60..e1c28a0ac2 100644<br>
--- a/drivers/net/qede/qede_ethdev.c<br>
+++ b/drivers/net/qede/qede_ethdev.c<br>
@@ -1592,7 +1592,8 @@ static int qede_dev_close(struct rte_eth_dev *eth_dev)<br>
}<br>
<br>
static int<br>
-qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)<br>
+qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct qede_dev *qdev = eth_dev->data->dev_private;<br>
struct ecore_dev *edev = &qdev->edev;<br>
@@ -1645,18 +1646,18 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)<br>
" appropriately and retry.\n");<br>
<br>
for (qid = 0; qid < eth_dev->data->nb_rx_queues; qid++) {<br>
- eth_stats->q_ipackets[i] = 0;<br>
- eth_stats->q_errors[i] = 0;<br>
+ uint64_t q_ipackets = 0;<br>
+ uint64_t q_errors = 0;<br>
<br>
for_each_hwfn(edev, hw_fn) {<br>
idx = qid * edev->num_hwfns + hw_fn;<br>
<br>
- eth_stats->q_ipackets[i] +=<br>
+ q_ipackets +=<br>
*(uint64_t *)<br>
(((char *)(qdev->fp_array[idx].rxq)) +<br>
offsetof(struct qede_rx_queue,<br>
rcv_pkts));<br>
- eth_stats->q_errors[i] +=<br>
+ q_errors +=<br>
*(uint64_t *)<br>
(((char *)(qdev->fp_array[idx].rxq)) +<br>
offsetof(struct qede_rx_queue,<br>
@@ -1667,25 +1668,33 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)<br>
rx_alloc_errors));<br>
}<br>
<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ipackets[i] = q_ipackets;<br>
+ qstats->q_errors[i] = q_errors;<br>
+ }<br>
+<br>
i++;<br>
if (i == rxq_stat_cntrs)<br>
break;<br>
}<br>
<br>
for (qid = 0; qid < eth_dev->data->nb_tx_queues; qid++) {<br>
- eth_stats->q_opackets[j] = 0;<br>
+ uint64_t q_opackets = 0;<br>
<br>
for_each_hwfn(edev, hw_fn) {<br>
idx = qid * edev->num_hwfns + hw_fn;<br>
<br>
txq = qdev->fp_array[idx].txq;<br>
- eth_stats->q_opackets[j] +=<br>
+ q_opackets +=<br>
*((uint64_t *)(uintptr_t)<br>
(((uint64_t)(uintptr_t)(txq)) +<br>
offsetof(struct qede_tx_queue,<br>
xmit_pkts)));<br>
}<br>
<br>
+ if (qstats != NULL)<br>
+ qstats->q_opackets[j] = q_opackets;<br>
+<br>
j++;<br>
if (j == txq_stat_cntrs)<br>
break;<br>
diff --git a/drivers/net/r8169/r8169_ethdev.c b/drivers/net/r8169/r8169_ethdev.c<br>
index 8071e14412..69512ced8b 100644<br>
--- a/drivers/net/r8169/r8169_ethdev.c<br>
+++ b/drivers/net/r8169/r8169_ethdev.c<br>
@@ -37,7 +37,8 @@ static int rtl_dev_set_link_down(struct rte_eth_dev *dev);<br>
static int rtl_dev_infos_get(struct rte_eth_dev *dev,<br>
struct rte_eth_dev_info *dev_info);<br>
static int rtl_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *rte_stats);<br>
+ struct rte_eth_stats *rte_stats,<br>
+ struct eth_queue_stats *qstats);<br>
static int rtl_dev_stats_reset(struct rte_eth_dev *dev);<br>
static int rtl_promiscuous_enable(struct rte_eth_dev *dev);<br>
static int rtl_promiscuous_disable(struct rte_eth_dev *dev);<br>
@@ -533,7 +534,8 @@ rtl_sw_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
}<br>
<br>
static int<br>
-rtl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)<br>
+rtl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct rtl_adapter *adapter = RTL_DEV_PRIVATE(dev);<br>
struct rtl_hw *hw = &adapter->hw;<br>
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c<br>
index b1085bf390..b639544eab 100644<br>
--- a/drivers/net/ring/rte_eth_ring.c<br>
+++ b/drivers/net/ring/rte_eth_ring.c<br>
@@ -196,7 +196,8 @@ eth_dev_info(struct rte_eth_dev *dev,<br>
}<br>
<br>
static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
unsigned int i;<br>
unsigned long rx_total = 0, tx_total = 0;<br>
@@ -204,14 +205,16 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
<br>
for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
i < dev->data->nb_rx_queues; i++) {<br>
- stats->q_ipackets[i] = internal->rx_ring_queues[i].rx_pkts;<br>
- rx_total += stats->q_ipackets[i];<br>
+ if (qstats != NULL)<br>
+ qstats->q_ipackets[i] = internal->rx_ring_queues[i].rx_pkts;<br>
+ rx_total += internal->rx_ring_queues[i].rx_pkts;<br>
}<br>
<br>
for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
i < dev->data->nb_tx_queues; i++) {<br>
- stats->q_opackets[i] = internal->tx_ring_queues[i].tx_pkts;<br>
- tx_total += stats->q_opackets[i];<br>
+ if (qstats != NULL)<br>
+ qstats->q_opackets[i] = internal->tx_ring_queues[i].tx_pkts;<br>
+ tx_total += internal->tx_ring_queues[i].tx_pkts;<br>
}<br>
<br>
stats->ipackets = rx_total;<br>
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c<br>
index de1c077f61..f5babb797d 100644<br>
--- a/drivers/net/rnp/rnp_ethdev.c<br>
+++ b/drivers/net/rnp/rnp_ethdev.c<br>
@@ -1233,7 +1233,8 @@ static void rnp_get_hw_stats(struct rte_eth_dev *dev)<br>
<br>
static int<br>
rnp_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats)<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);<br>
struct rnp_hw_eth_stats *eth_stats = &port->eth_stats;<br>
@@ -1251,9 +1252,9 @@ rnp_dev_stats_get(struct rte_eth_dev *dev,<br>
continue;<br>
stats->ipackets += rxq->stats.ipackets;<br>
stats->ibytes += rxq->stats.ibytes;<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_ipackets[i] = rxq->stats.ipackets;<br>
- stats->q_ibytes[i] = rxq->stats.ibytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = rxq->stats.ipackets;<br>
+ qstats->q_ibytes[i] = rxq->stats.ibytes;<br>
}<br>
}<br>
<br>
@@ -1265,9 +1266,9 @@ rnp_dev_stats_get(struct rte_eth_dev *dev,<br>
stats->opackets += txq->stats.opackets;<br>
stats->obytes += txq->stats.obytes;<br>
stats->oerrors += txq->stats.errors;<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_opackets[i] = txq->stats.opackets;<br>
- stats->q_obytes[i] = txq->stats.obytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] = txq->stats.opackets;<br>
+ qstats->q_obytes[i] = txq->stats.obytes;<br>
}<br>
}<br>
stats->imissed = eth_stats->rx_trans_drop + eth_stats->rx_trunc_drop;<br>
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c<br>
index 8b0bf4eeee..99141bdda5 100644<br>
--- a/drivers/net/sfc/sfc_ethdev.c<br>
+++ b/drivers/net/sfc/sfc_ethdev.c<br>
@@ -823,7 +823,8 @@ sfc_update_diff_stat(uint64_t *stat, uint64_t newval)<br>
}<br>
<br>
static int<br>
-sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);<br>
bool have_dp_rx_stats = sap->dp_rx->features & SFC_DP_RX_FEAT_STATS;<br>
diff --git a/drivers/net/sfc/sfc_repr.c b/drivers/net/sfc/sfc_repr.c<br>
index 18e76fa7da..93da97387c 100644<br>
--- a/drivers/net/sfc/sfc_repr.c<br>
+++ b/drivers/net/sfc/sfc_repr.c<br>
@@ -846,7 +846,8 @@ sfc_repr_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)<br>
}<br>
<br>
static int<br>
-sfc_repr_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+sfc_repr_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
union sfc_pkts_bytes queue_stats;<br>
uint16_t i;<br>
diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c<br>
index 650ddbd706..3c9ba829d6 100644<br>
--- a/drivers/net/tap/rte_eth_tap.c<br>
+++ b/drivers/net/tap/rte_eth_tap.c<br>
@@ -1030,7 +1030,8 @@ tap_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)<br>
}<br>
<br>
static int<br>
-tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats)<br>
+tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
unsigned int i, imax;<br>
unsigned long rx_total = 0, tx_total = 0, tx_err_total = 0;<br>
@@ -1042,10 +1043,12 @@ tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats)<br>
imax = (dev->data->nb_rx_queues < RTE_ETHDEV_QUEUE_STAT_CNTRS) ?<br>
dev->data->nb_rx_queues : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
for (i = 0; i < imax; i++) {<br>
- tap_stats->q_ipackets[i] = pmd->rxq[i].stats.ipackets;<br>
- tap_stats->q_ibytes[i] = pmd->rxq[i].stats.ibytes;<br>
- rx_total += tap_stats->q_ipackets[i];<br>
- rx_bytes_total += tap_stats->q_ibytes[i];<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ipackets[i] = pmd->rxq[i].stats.ipackets;<br>
+ qstats->q_ibytes[i] = pmd->rxq[i].stats.ibytes;<br>
+ }<br>
+ rx_total += pmd->rxq[i].stats.ipackets;<br>
+ rx_bytes_total += pmd->rxq[i].stats.ibytes;<br>
rx_nombuf += pmd->rxq[i].stats.rx_nombuf;<br>
ierrors += pmd->rxq[i].stats.ierrors;<br>
}<br>
@@ -1055,11 +1058,13 @@ tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats)<br>
dev->data->nb_tx_queues : RTE_ETHDEV_QUEUE_STAT_CNTRS;<br>
<br>
for (i = 0; i < imax; i++) {<br>
- tap_stats->q_opackets[i] = pmd->txq[i].stats.opackets;<br>
- tap_stats->q_obytes[i] = pmd->txq[i].stats.obytes;<br>
- tx_total += tap_stats->q_opackets[i];<br>
+ if (qstats != NULL) {<br>
+ qstats->q_opackets[i] = pmd->txq[i].stats.opackets;<br>
+ qstats->q_obytes[i] = pmd->txq[i].stats.obytes;<br>
+ }<br>
+ tx_total += pmd->txq[i].stats.opackets;<br>
+ tx_bytes_total += pmd->txq[i].stats.obytes;<br>
tx_err_total += pmd->txq[i].stats.errs;<br>
- tx_bytes_total += tap_stats->q_obytes[i];<br>
}<br>
<br>
tap_stats->ipackets = rx_total;<br>
diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c<br>
index 4441a90bdf..76ed76a045 100644<br>
--- a/drivers/net/thunderx/nicvf_ethdev.c<br>
+++ b/drivers/net/thunderx/nicvf_ethdev.c<br>
@@ -289,7 +289,8 @@ nicvf_dev_get_regs(struct rte_eth_dev *dev, struct rte_dev_reg_info *regs)<br>
}<br>
<br>
static int<br>
-nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
uint16_t qidx;<br>
struct nicvf_hw_rx_qstats rx_qstats;<br>
@@ -309,8 +310,10 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
break;<br>
<br>
nicvf_hw_get_rx_qstats(nic, &rx_qstats, qidx);<br>
- stats->q_ibytes[qidx] = rx_qstats.q_rx_bytes;<br>
- stats->q_ipackets[qidx] = rx_qstats.q_rx_packets;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ibytes[qidx] = rx_qstats.q_rx_bytes;<br>
+ qstats->q_ipackets[qidx] = rx_qstats.q_rx_packets;<br>
+ }<br>
}<br>
<br>
/* TX queue indices for the first VF */<br>
@@ -322,8 +325,10 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
break;<br>
<br>
nicvf_hw_get_tx_qstats(nic, &tx_qstats, qidx);<br>
- stats->q_obytes[qidx] = tx_qstats.q_tx_bytes;<br>
- stats->q_opackets[qidx] = tx_qstats.q_tx_packets;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_obytes[qidx] = tx_qstats.q_tx_bytes;<br>
+ qstats->q_opackets[qidx] = tx_qstats.q_tx_packets;<br>
+ }<br>
}<br>
<br>
for (i = 0; i < nic->sqs_count; i++) {<br>
@@ -342,8 +347,10 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
<br>
nicvf_hw_get_rx_qstats(snic, &rx_qstats,<br>
qidx % MAX_RCV_QUEUES_PER_QS);<br>
- stats->q_ibytes[qidx] = rx_qstats.q_rx_bytes;<br>
- stats->q_ipackets[qidx] = rx_qstats.q_rx_packets;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ibytes[qidx] = rx_qstats.q_rx_bytes;<br>
+ qstats->q_ipackets[qidx] = rx_qstats.q_rx_packets;<br>
+ }<br>
}<br>
<br>
/* TX queue indices for a secondary VF */<br>
@@ -355,8 +362,10 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
<br>
nicvf_hw_get_tx_qstats(snic, &tx_qstats,<br>
qidx % MAX_SND_QUEUES_PER_QS);<br>
- stats->q_obytes[qidx] = tx_qstats.q_tx_bytes;<br>
- stats->q_opackets[qidx] = tx_qstats.q_tx_packets;<br>
+ if (qstats != NULL) {<br>
+ qstats->q_obytes[qidx] = tx_qstats.q_tx_bytes;<br>
+ qstats->q_opackets[qidx] = tx_qstats.q_tx_packets;<br>
+ }<br>
}<br>
}<br>
<br>
diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c<br>
index 580579094b..33d1d59ead 100644<br>
--- a/drivers/net/txgbe/txgbe_ethdev.c<br>
+++ b/drivers/net/txgbe/txgbe_ethdev.c<br>
@@ -2342,7 +2342,8 @@ txgbe_read_stats_registers(struct txgbe_hw *hw,<br>
}<br>
<br>
static int<br>
-txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct txgbe_hw *hw = TXGBE_DEV_HW(dev);<br>
struct txgbe_hw_stats *hw_stats = TXGBE_DEV_STATS(dev);<br>
@@ -2362,29 +2363,31 @@ txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->opackets = hw_stats->tx_packets;<br>
stats->obytes = hw_stats->tx_bytes;<br>
<br>
- memset(&stats->q_ipackets, 0, sizeof(stats->q_ipackets));<br>
- memset(&stats->q_opackets, 0, sizeof(stats->q_opackets));<br>
- memset(&stats->q_ibytes, 0, sizeof(stats->q_ibytes));<br>
- memset(&stats->q_obytes, 0, sizeof(stats->q_obytes));<br>
- memset(&stats->q_errors, 0, sizeof(stats->q_errors));<br>
- for (i = 0; i < TXGBE_MAX_QP; i++) {<br>
- uint32_t n = i / NB_QMAP_FIELDS_PER_QSM_REG;<br>
- uint32_t offset = (i % NB_QMAP_FIELDS_PER_QSM_REG) * 8;<br>
- uint32_t q_map;<br>
-<br>
- q_map = (stat_mappings->rqsm[n] >> offset)<br>
- & QMAP_FIELD_RESERVED_BITS_MASK;<br>
- j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
- ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
- stats->q_ipackets[j] += hw_stats->qp[i].rx_qp_packets;<br>
- stats->q_ibytes[j] += hw_stats->qp[i].rx_qp_bytes;<br>
-<br>
- q_map = (stat_mappings->tqsm[n] >> offset)<br>
- & QMAP_FIELD_RESERVED_BITS_MASK;<br>
- j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
- ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
- stats->q_opackets[j] += hw_stats->qp[i].tx_qp_packets;<br>
- stats->q_obytes[j] += hw_stats->qp[i].tx_qp_bytes;<br>
+ if (qstats != NULL) {<br>
+ memset(&qstats->q_ipackets, 0, sizeof(qstats->q_ipackets));<br>
+ memset(&qstats->q_opackets, 0, sizeof(qstats->q_opackets));<br>
+ memset(&qstats->q_ibytes, 0, sizeof(qstats->q_ibytes));<br>
+ memset(&qstats->q_obytes, 0, sizeof(qstats->q_obytes));<br>
+ memset(&qstats->q_errors, 0, sizeof(qstats->q_errors));<br>
+ for (i = 0; i < TXGBE_MAX_QP; i++) {<br>
+ uint32_t n = i / NB_QMAP_FIELDS_PER_QSM_REG;<br>
+ uint32_t offset = (i % NB_QMAP_FIELDS_PER_QSM_REG) * 8;<br>
+ uint32_t q_map;<br>
+<br>
+ q_map = (stat_mappings->rqsm[n] >> offset)<br>
+ & QMAP_FIELD_RESERVED_BITS_MASK;<br>
+ j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
+ ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+ qstats->q_ipackets[j] += hw_stats->qp[i].rx_qp_packets;<br>
+ qstats->q_ibytes[j] += hw_stats->qp[i].rx_qp_bytes;<br>
+<br>
+ q_map = (stat_mappings->tqsm[n] >> offset)<br>
+ & QMAP_FIELD_RESERVED_BITS_MASK;<br>
+ j = (q_map < RTE_ETHDEV_QUEUE_STAT_CNTRS<br>
+ ? q_map : q_map % RTE_ETHDEV_QUEUE_STAT_CNTRS);<br>
+ qstats->q_opackets[j] += hw_stats->qp[i].tx_qp_packets;<br>
+ qstats->q_obytes[j] += hw_stats->qp[i].tx_qp_bytes;<br>
+ }<br>
}<br>
<br>
/* Rx Errors */<br>
@@ -2426,7 +2429,7 @@ txgbe_dev_stats_reset(struct rte_eth_dev *dev)<br>
<br>
/* HW registers are cleared on read */<br>
hw->offset_loaded = 0;<br>
- txgbe_dev_stats_get(dev, NULL);<br>
+ txgbe_dev_stats_get(dev, NULL, NULL);<br>
hw->offset_loaded = 1;<br>
<br>
/* Reset software totals */<br>
diff --git a/drivers/net/txgbe/txgbe_ethdev_vf.c b/drivers/net/txgbe/txgbe_ethdev_vf.c<br>
index 847febf8c3..b369070da8 100644<br>
--- a/drivers/net/txgbe/txgbe_ethdev_vf.c<br>
+++ b/drivers/net/txgbe/txgbe_ethdev_vf.c<br>
@@ -494,7 +494,8 @@ txgbevf_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
}<br>
<br>
static int<br>
-txgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+txgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats __rte_unused)<br>
{<br>
struct txgbevf_hw_stats *hw_stats = (struct txgbevf_hw_stats *)<br>
TXGBE_DEV_STATS(dev);<br>
@@ -528,7 +529,7 @@ txgbevf_dev_stats_reset(struct rte_eth_dev *dev)<br>
uint32_t i;<br>
<br>
/* Sync HW register to the last stats */<br>
- txgbevf_dev_stats_get(dev, NULL);<br>
+ txgbevf_dev_stats_get(dev, NULL, NULL);<br>
<br>
/* reset HW current stats*/<br>
for (i = 0; i < 8; i++) {<br>
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c<br>
index 87c91e2f96..05940f2461 100644<br>
--- a/drivers/net/vhost/rte_eth_vhost.c<br>
+++ b/drivers/net/vhost/rte_eth_vhost.c<br>
@@ -1310,7 +1310,8 @@ eth_dev_info(struct rte_eth_dev *dev,<br>
}<br>
<br>
static int<br>
-eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
unsigned i;<br>
unsigned long rx_total = 0, tx_total = 0;<br>
@@ -1323,11 +1324,12 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
if (dev->data->rx_queues[i] == NULL)<br>
continue;<br>
vq = dev->data->rx_queues[i];<br>
- stats->q_ipackets[i] = vq->stats.pkts;<br>
- rx_total += stats->q_ipackets[i];<br>
-<br>
- stats->q_ibytes[i] = vq->stats.bytes;<br>
- rx_total_bytes += stats->q_ibytes[i];<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ipackets[i] = vq->stats.pkts;<br>
+ qstats->q_ibytes[i] = vq->stats.bytes;<br>
+ }<br>
+ rx_total += vq->stats.pkts;<br>
+ rx_total_bytes += vq->stats.bytes;<br>
}<br>
<br>
for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&<br>
@@ -1335,12 +1337,12 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
if (dev->data->tx_queues[i] == NULL)<br>
continue;<br>
vq = dev->data->tx_queues[i];<br>
- stats->q_opackets[i] = vq->stats.pkts;<br>
- tx_total += stats->q_opackets[i];<br>
-<br>
- stats->q_obytes[i] = vq->stats.bytes;<br>
- tx_total_bytes += stats->q_obytes[i];<br>
-<br>
+ if (qstats != NULL) {<br>
+ qstats->q_opackets[i] = vq->stats.pkts;<br>
+ qstats->q_obytes[i] = vq->stats.bytes;<br>
+ }<br>
+ tx_total += vq->stats.pkts;<br>
+ tx_total_bytes += vq->stats.bytes;<br>
tx_total_errors += vq->stats.missed_pkts;<br>
}<br>
<br>
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c<br>
index eebc3ea817..e45dbd8ee9 100644<br>
--- a/drivers/net/virtio/virtio_ethdev.c<br>
+++ b/drivers/net/virtio/virtio_ethdev.c<br>
@@ -68,7 +68,8 @@ static void virtio_set_hwaddr(struct virtio_hw *hw);<br>
static void virtio_get_hwaddr(struct virtio_hw *hw);<br>
<br>
static int virtio_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
static int virtio_dev_xstats_get(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat *xstats, unsigned n);<br>
static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev,<br>
@@ -673,7 +674,8 @@ const struct eth_dev_ops virtio_user_secondary_eth_dev_ops = {<br>
};<br>
<br>
static void<br>
-virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
unsigned i;<br>
<br>
@@ -685,9 +687,9 @@ virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->opackets += txvq->stats.packets;<br>
stats->obytes += txvq->stats.bytes;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_opackets[i] = txvq->stats.packets;<br>
- stats->q_obytes[i] = txvq->stats.bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] = txvq->stats.packets;<br>
+ qstats->q_obytes[i] = txvq->stats.bytes;<br>
}<br>
}<br>
<br>
@@ -700,9 +702,9 @@ virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->ibytes += rxvq->stats.bytes;<br>
stats->ierrors += rxvq->stats.errors;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_ipackets[i] = rxvq->stats.packets;<br>
- stats->q_ibytes[i] = rxvq->stats.bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = rxvq->stats.packets;<br>
+ qstats->q_ibytes[i] = rxvq->stats.bytes;<br>
}<br>
}<br>
<br>
@@ -802,9 +804,10 @@ virtio_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
}<br>
<br>
static int<br>
-virtio_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+virtio_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
- virtio_update_stats(dev, stats);<br>
+ virtio_update_stats(dev, stats, qstats);<br>
<br>
return 0;<br>
}<br>
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c<br>
index e19aa43888..b0c19c5c7c 100644<br>
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c<br>
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c<br>
@@ -77,7 +77,8 @@ static int vmxnet3_dev_link_update(struct rte_eth_dev *dev,<br>
int wait_to_complete);<br>
static void vmxnet3_hw_stats_save(struct vmxnet3_hw *hw);<br>
static int vmxnet3_dev_stats_get(struct rte_eth_dev *dev,<br>
- struct rte_eth_stats *stats);<br>
+ struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
static int vmxnet3_dev_stats_reset(struct rte_eth_dev *dev);<br>
static int vmxnet3_dev_xstats_get_names(struct rte_eth_dev *dev,<br>
struct rte_eth_xstat_name *xstats,<br>
@@ -1470,7 +1471,8 @@ vmxnet3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,<br>
}<br>
<br>
static int<br>
-vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
unsigned int i;<br>
struct vmxnet3_hw *hw = dev->data->dev_private;<br>
@@ -1495,9 +1497,9 @@ vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->obytes += bytes;<br>
stats->oerrors += txStats.pktsTxError + txStats.pktsTxDiscard;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_opackets[i] = packets;<br>
- stats->q_obytes[i] = bytes;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[i] = packets;<br>
+ qstats->q_obytes[i] = bytes;<br>
}<br>
}<br>
<br>
@@ -1517,10 +1519,10 @@ vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
stats->ierrors += rxStats.pktsRxError;<br>
stats->imissed += rxStats.pktsRxOutOfBuf;<br>
<br>
- if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_ipackets[i] = packets;<br>
- stats->q_ibytes[i] = bytes;<br>
- stats->q_errors[i] = rxStats.pktsRxError;<br>
+ if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[i] = packets;<br>
+ qstats->q_ibytes[i] = bytes;<br>
+ qstats->q_errors[i] = rxStats.pktsRxError;<br>
}<br>
}<br>
<br>
diff --git a/drivers/net/xsc/xsc_ethdev.c b/drivers/net/xsc/xsc_ethdev.c<br>
index 988d734b5b..07fc52ac7b 100644<br>
--- a/drivers/net/xsc/xsc_ethdev.c<br>
+++ b/drivers/net/xsc/xsc_ethdev.c<br>
@@ -577,7 +577,8 @@ xsc_ethdev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)<br>
}<br>
<br>
static int<br>
-xsc_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+xsc_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct xsc_ethdev_priv *priv = TO_XSC_ETHDEV_PRIV(dev);<br>
uint32_t rxqs_n = priv->num_rq;<br>
@@ -592,10 +593,10 @@ xsc_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
continue;<br>
<br>
idx = rxq->idx;<br>
- if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_ipackets[idx] += rxq->stats.rx_pkts;<br>
- stats->q_ibytes[idx] += rxq->stats.rx_bytes;<br>
- stats->q_errors[idx] += rxq->stats.rx_errors +<br>
+ if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_ipackets[idx] += rxq->stats.rx_pkts;<br>
+ qstats->q_ibytes[idx] += rxq->stats.rx_bytes;<br>
+ qstats->q_errors[idx] += rxq->stats.rx_errors +<br>
rxq->stats.rx_nombuf;<br>
}<br>
stats->ipackets += rxq->stats.rx_pkts;<br>
@@ -610,10 +611,10 @@ xsc_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
continue;<br>
<br>
idx = txq->idx;<br>
- if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
- stats->q_opackets[idx] += txq->stats.tx_pkts;<br>
- stats->q_obytes[idx] += txq->stats.tx_bytes;<br>
- stats->q_errors[idx] += txq->stats.tx_errors;<br>
+ if (qstats != NULL && idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {<br>
+ qstats->q_opackets[idx] += txq->stats.tx_pkts;<br>
+ qstats->q_obytes[idx] += txq->stats.tx_bytes;<br>
+ qstats->q_errors[idx] += txq->stats.tx_errors;<br>
}<br>
stats->opackets += txq->stats.tx_pkts;<br>
stats->obytes += txq->stats.tx_bytes;<br>
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br>
index da32512b03..6d9f0af748 100644<br>
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br>
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br>
@@ -1698,7 +1698,8 @@ zxdh_hw_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)<br>
}<br>
<br>
int<br>
-zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
+zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats)<br>
{<br>
struct zxdh_hw *hw = dev->data->dev_private;<br>
struct zxdh_hw_vqm_stats vqm_stats = {0};<br>
@@ -1730,14 +1731,16 @@ zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
<br>
if (rxvq == NULL)<br>
continue;<br>
- stats->q_ipackets[i] = *(uint64_t *)(((char *)rxvq) +<br>
- zxdh_rxq_stat_strings[0].offset);<br>
- stats->q_ibytes[i] = *(uint64_t *)(((char *)rxvq) +<br>
- zxdh_rxq_stat_strings[1].offset);<br>
- stats->q_errors[i] = *(uint64_t *)(((char *)rxvq) +<br>
- zxdh_rxq_stat_strings[2].offset);<br>
- stats->q_errors[i] += *(uint64_t *)(((char *)rxvq) +<br>
- zxdh_rxq_stat_strings[5].offset);<br>
+ if (qstats != NULL) {<br>
+ qstats->q_ipackets[i] = *(uint64_t *)(((char *)rxvq) +<br>
+ zxdh_rxq_stat_strings[0].offset);<br>
+ qstats->q_ibytes[i] = *(uint64_t *)(((char *)rxvq) +<br>
+ zxdh_rxq_stat_strings[1].offset);<br>
+ qstats->q_errors[i] = *(uint64_t *)(((char *)rxvq) +<br>
+ zxdh_rxq_stat_strings[2].offset);<br>
+ qstats->q_errors[i] += *(uint64_t *)(((char *)rxvq) +<br>
+ zxdh_rxq_stat_strings[5].offset);<br>
+ }<br>
}<br>
<br>
for (i = 0; (i < dev->data->nb_tx_queues) && (i < RTE_ETHDEV_QUEUE_STAT_CNTRS); i++) {<br>
@@ -1745,14 +1748,16 @@ zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br>
<br>
if (txvq == NULL)<br>
continue;<br>
- stats->q_opackets[i] = *(uint64_t *)(((char *)txvq) +<br>
- zxdh_txq_stat_strings[0].offset);<br>
- stats->q_obytes[i] = *(uint64_t *)(((char *)txvq) +<br>
- zxdh_txq_stat_strings[1].offset);<br>
- stats->q_errors[i] += *(uint64_t *)(((char *)txvq) +<br>
- zxdh_txq_stat_strings[2].offset);<br>
- stats->q_errors[i] += *(uint64_t *)(((char *)txvq) +<br>
- zxdh_txq_stat_strings[5].offset);<br>
+ if (qstats != NULL) {<br>
+ qstats->q_opackets[i] = *(uint64_t *)(((char *)txvq) +<br>
+ zxdh_txq_stat_strings[0].offset);<br>
+ qstats->q_obytes[i] = *(uint64_t *)(((char *)txvq) +<br>
+ zxdh_txq_stat_strings[1].offset);<br>
+ qstats->q_errors[i] += *(uint64_t *)(((char *)txvq) +<br>
+ zxdh_txq_stat_strings[2].offset);<br>
+ qstats->q_errors[i] += *(uint64_t *)(((char *)txvq) +<br>
+ zxdh_txq_stat_strings[5].offset);<br>
+ }<br>
}<br>
return 0;<br>
}<br>
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h<br>
index 86db6efe40..85e926887b 100644<br>
--- a/drivers/net/zxdh/zxdh_ethdev_ops.h<br>
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.h<br>
@@ -130,7 +130,8 @@ int zxdh_dev_rss_reta_query(struct rte_eth_dev *dev,<br>
int zxdh_rss_hash_update(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf);<br>
int zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf);<br>
int zxdh_rss_configure(struct rte_eth_dev *dev);<br>
-int zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br>
+int zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br>
+ struct eth_queue_stats *qstats);<br>
int zxdh_dev_stats_reset(struct rte_eth_dev *dev);<br>
int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t new_mtu);<br>
int zxdh_hw_np_stats_pf_reset(struct rte_eth_dev *dev, uint32_t stats_id);<br>
--<br>
2.48.1<br>
<br>
</div>
<div style="font-family: "Segoe UI", "Segoe UI Web (West European)", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; font-size: 14.6667px; color: rgb(0, 0, 0);" class="elementToProof">
<span style="background-color: rgb(255, 255, 255);">Reviewed-by: Rosen Xu <rosen.xu@altera.com></span></div>
</body>
</html>