From: "Wei Hu (Xavier)" <xavier.huwei@huawei.com>
To: <dev@dpdk.org>
Cc: <ferruh.yigit@intel.com>, <linuxarm@huawei.com>,
<xavier_huwei@163.com>, <xavier.huwei@tom.com>,
<forest.zhouchang@huawei.com>
Subject: [dpdk-dev] [PATCH v2 1/4] net/hns3: fix the statistics problems about Tx/Rx functions
Date: Fri, 25 Oct 2019 20:37:02 +0800 [thread overview]
Message-ID: <1572007025-43391-2-git-send-email-xavier.huwei@huawei.com> (raw)
In-Reply-To: <1572007025-43391-1-git-send-email-xavier.huwei@huawei.com>
From: Hao Chen <chenhao164@huawei.com>
This patch fixes the statistics problems for sending and receiving
message as belows:
1.In receiving direction, for FCS error messages, drivers should not
record them in rte_eth_stats.ipackets statistics.
2.In sending direction, for messages of illegal length, too long or
equals 0, drivers should not notify the network card hardware to
send them, should not continue to send the remaining message in burst,
and record them in rte_eth_stats.opackets statistics.
Fixes: 8839c5e202f3 ("net/hns3: support device stats")
Signed-off-by: Hao Chen <chenhao164@huawei.com>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
---
drivers/net/hns3/hns3_rxtx.c | 10 ++----
drivers/net/hns3/hns3_rxtx.h | 3 --
drivers/net/hns3/hns3_stats.c | 84 ++++++++++---------------------------------
3 files changed, 21 insertions(+), 76 deletions(-)
diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c
index fdac55a..1e8283a 100644
--- a/drivers/net/hns3/hns3_rxtx.c
+++ b/drivers/net/hns3/hns3_rxtx.c
@@ -661,7 +661,6 @@ hns3_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc,
rxq->l4_csum_erros = 0;
rxq->ol3_csum_erros = 0;
rxq->ol4_csum_erros = 0;
- rxq->errors = 0;
rte_spinlock_lock(&hw->lock);
dev->data->rx_queues[idx] = rxq;
@@ -817,14 +816,12 @@ hns3_handle_bdinfo(struct hns3_rx_queue *rxq, struct rte_mbuf *rxm,
if (unlikely(l234_info & BIT(HNS3_RXD_L2E_B))) {
rxq->l2_errors++;
- rxq->errors++;
return -EINVAL;
}
if (unlikely(rxm->pkt_len == 0 ||
(l234_info & BIT(HNS3_RXD_TRUNCAT_B)))) {
rxq->pkt_len_errors++;
- rxq->errors++;
return -EINVAL;
}
@@ -1098,7 +1095,6 @@ hns3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc,
txq->next_to_clean = 0;
txq->tx_bd_ready = txq->nb_tx_desc;
txq->port_id = dev->data->port_id;
- txq->pkt_len_errors = 0;
txq->configured = true;
txq->io_base = (void *)((char *)hw->io_base + HNS3_TQP_REG_OFFSET +
idx * HNS3_TQP_REG_SIZE);
@@ -1605,10 +1601,8 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
* will be ignored.
*/
if (unlikely(tx_pkt->pkt_len > HNS3_MAX_FRAME_LEN ||
- tx_pkt->pkt_len == 0)) {
- txq->pkt_len_errors++;
- continue;
- }
+ tx_pkt->pkt_len == 0))
+ break;
m_seg = tx_pkt;
if (unlikely(nb_buf > HNS3_MAX_TX_BD_PER_PKT)) {
diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h
index 358f129..daf51f4 100644
--- a/drivers/net/hns3/hns3_rxtx.h
+++ b/drivers/net/hns3/hns3_rxtx.h
@@ -252,7 +252,6 @@ struct hns3_rx_queue {
uint64_t l4_csum_erros;
uint64_t ol3_csum_erros;
uint64_t ol4_csum_erros;
- uint64_t errors; /* num of error rx packets recorded by driver */
};
struct hns3_tx_queue {
@@ -272,8 +271,6 @@ struct hns3_tx_queue {
bool tx_deferred_start; /* don't start this queue in dev start */
bool configured; /* indicate if tx queue has been configured */
-
- uint64_t pkt_len_errors;
};
#define HNS3_TX_CKSUM_OFFLOAD_MASK ( \
diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c
index a0252ea..9948beb 100644
--- a/drivers/net/hns3/hns3_stats.c
+++ b/drivers/net/hns3/hns3_stats.c
@@ -235,12 +235,6 @@ static const struct hns3_xstats_name_offset hns3_rx_bd_error_strings[] = {
HNS3_RX_BD_ERROR_STATS_FIELD_OFFSET(ol4_csum_erros)}
};
-/* The statistic of errors in Tx */
-static const struct hns3_xstats_name_offset hns3_tx_error_strings[] = {
- {"TX_PKT_LEN_ERRORS",
- HNS3_TX_ERROR_STATS_FIELD_OFFSET(pkt_len_errors)}
-};
-
#define HNS3_NUM_MAC_STATS (sizeof(hns3_mac_strings) / \
sizeof(hns3_mac_strings[0]))
@@ -253,9 +247,6 @@ static const struct hns3_xstats_name_offset hns3_tx_error_strings[] = {
#define HNS3_NUM_RX_BD_ERROR_XSTATS (sizeof(hns3_rx_bd_error_strings) / \
sizeof(hns3_rx_bd_error_strings[0]))
-#define HNS3_NUM_TX_ERROR_XSTATS (sizeof(hns3_tx_error_strings) / \
- sizeof(hns3_tx_error_strings[0]))
-
#define HNS3_FIX_NUM_STATS (HNS3_NUM_MAC_STATS + HNS3_NUM_ERROR_INT_XSTATS + \
HNS3_NUM_RESET_XSTATS)
@@ -434,6 +425,7 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats)
struct hns3_hw *hw = &hns->hw;
struct hns3_tqp_stats *stats = &hw->tqp_stats;
struct hns3_rx_queue *rxq;
+ struct hns3_tx_queue *txq;
uint64_t cnt;
uint64_t num;
uint16_t i;
@@ -446,25 +438,32 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats)
return ret;
}
- rte_stats->ipackets = stats->rcb_rx_ring_pktnum_rcd;
- rte_stats->opackets = stats->rcb_tx_ring_pktnum_rcd;
- rte_stats->rx_nombuf = eth_dev->data->rx_mbuf_alloc_failed;
-
- num = RTE_MIN(RTE_ETHDEV_QUEUE_STAT_CNTRS, hw->tqps_num);
- for (i = 0; i < num; i++) {
- rte_stats->q_ipackets[i] = stats->rcb_rx_ring_pktnum[i];
- rte_stats->q_opackets[i] = stats->rcb_tx_ring_pktnum[i];
- }
-
+ /* Get the error stats of received packets */
num = RTE_MIN(RTE_ETHDEV_QUEUE_STAT_CNTRS, eth_dev->data->nb_rx_queues);
for (i = 0; i != num; ++i) {
rxq = eth_dev->data->rx_queues[i];
if (rxq) {
- cnt = rxq->errors;
+ cnt = rxq->l2_errors + rxq->pkt_len_errors;
rte_stats->q_errors[i] = cnt;
+ rte_stats->q_ipackets[i] =
+ stats->rcb_rx_ring_pktnum[i] - cnt;
rte_stats->ierrors += cnt;
}
}
+ /* Get the error stats of transmitted packets */
+ num = RTE_MIN(RTE_ETHDEV_QUEUE_STAT_CNTRS, eth_dev->data->nb_tx_queues);
+ for (i = 0; i < num; i++) {
+ txq = eth_dev->data->tx_queues[i];
+ if (txq)
+ rte_stats->q_opackets[i] = stats->rcb_tx_ring_pktnum[i];
+ }
+
+ rte_stats->oerrors = 0;
+ rte_stats->ipackets = stats->rcb_rx_ring_pktnum_rcd -
+ rte_stats->ierrors;
+ rte_stats->opackets = stats->rcb_tx_ring_pktnum_rcd -
+ rte_stats->oerrors;
+ rte_stats->rx_nombuf = eth_dev->data->rx_mbuf_alloc_failed;
return 0;
}
@@ -477,7 +476,6 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
struct hns3_tqp_stats *stats = &hw->tqp_stats;
struct hns3_cmd_desc desc_reset;
struct hns3_rx_queue *rxq;
- struct hns3_tx_queue *txq;
uint16_t i;
int ret;
@@ -518,12 +516,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
rxq->l4_csum_erros = 0;
rxq->ol3_csum_erros = 0;
rxq->ol4_csum_erros = 0;
- rxq->errors = 0;
}
-
- txq = eth_dev->data->tx_queues[i];
- if (txq)
- txq->pkt_len_errors = 0;
}
memset(stats, 0, sizeof(struct hns3_tqp_stats));
@@ -554,11 +547,9 @@ hns3_xstats_calc_num(struct rte_eth_dev *dev)
if (hns->is_vf)
return dev->data->nb_rx_queues * HNS3_NUM_RX_BD_ERROR_XSTATS +
- dev->data->nb_tx_queues * HNS3_NUM_TX_ERROR_XSTATS +
HNS3_NUM_RESET_XSTATS;
else
return dev->data->nb_rx_queues * HNS3_NUM_RX_BD_ERROR_XSTATS +
- dev->data->nb_tx_queues * HNS3_NUM_TX_ERROR_XSTATS +
HNS3_FIX_NUM_STATS;
}
@@ -585,7 +576,6 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
struct hns3_mac_stats *mac_stats = &hw->mac_stats;
struct hns3_reset_stats *reset_stats = &hw->reset.stats;
struct hns3_rx_queue *rxq;
- struct hns3_tx_queue *txq;
uint16_t i, j;
char *addr;
int count;
@@ -644,16 +634,6 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
}
}
- /* Get the Tx errors stats */
- for (j = 0; j != dev->data->nb_tx_queues; ++j) {
- for (i = 0; i < HNS3_NUM_TX_ERROR_XSTATS; i++) {
- txq = dev->data->tx_queues[j];
- addr = (char *)txq + hns3_tx_error_strings[i].offset;
- xstats[count].value = *(uint64_t *)addr;
- xstats[count].id = count;
- count++;
- }
- }
return count;
}
@@ -727,14 +707,6 @@ hns3_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
count++;
}
}
- for (j = 0; j < dev->data->nb_tx_queues; j++) {
- for (i = 0; i < HNS3_NUM_TX_ERROR_XSTATS; i++) {
- snprintf(xstats_names[count].name,
- sizeof(xstats_names[count].name),
- "tx_q%u%s", j, hns3_tx_error_strings[i].name);
- count++;
- }
- }
return count;
}
@@ -772,7 +744,6 @@ hns3_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
struct hns3_mac_stats *mac_stats = &hw->mac_stats;
struct hns3_reset_stats *reset_stats = &hw->reset.stats;
struct hns3_rx_queue *rxq;
- struct hns3_tx_queue *txq;
const uint32_t cnt_stats = hns3_xstats_calc_num(dev);
uint64_t *values_copy;
uint64_t len;
@@ -831,15 +802,6 @@ hns3_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
}
}
- for (j = 0; j != dev->data->nb_tx_queues; ++j) {
- for (i = 0; i < HNS3_NUM_TX_ERROR_XSTATS; i++) {
- txq = dev->data->tx_queues[j];
- addr = (char *)txq + hns3_tx_error_strings[i].offset;
- values_copy[count] = *(uint64_t *)addr;
- count++;
- }
- }
-
for (i = 0; i < size; i++) {
if (ids[i] >= cnt_stats) {
hns3_err(hw, "ids[%d] (%" PRIx64 ") is invalid, "
@@ -928,14 +890,6 @@ hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,
count_name++;
}
}
- for (j = 0; j != dev->data->nb_rx_queues; ++j) {
- for (i = 0; i < HNS3_NUM_TX_ERROR_XSTATS; i++) {
- snprintf(xstats_names_copy[count_name].name,
- sizeof(xstats_names_copy[count_name].name),
- "tx_q%u%s", j, hns3_tx_error_strings[i].name);
- count_name++;
- }
- }
for (i = 0; i < size; i++) {
if (ids[i] >= cnt_stats) {
--
2.7.4
next prev parent reply other threads:[~2019-10-25 12:36 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-25 12:37 [dpdk-dev] [PATCH v2 0/4] some fixes for hns3 PMD driver Wei Hu (Xavier)
2019-10-25 12:37 ` Wei Hu (Xavier) [this message]
2019-10-25 12:37 ` [dpdk-dev] [PATCH v2 2/4] net/hns3: fix lack of Rx RSS hash in ol flags Wei Hu (Xavier)
2019-10-25 12:37 ` [dpdk-dev] [PATCH v2 3/4] net/hns3: fix the return value when firmware timeout Wei Hu (Xavier)
2019-10-25 12:37 ` [dpdk-dev] [PATCH v2 4/4] net/hns3: fix FLR reset failure Wei Hu (Xavier)
2019-10-25 15:07 ` [dpdk-dev] [PATCH v2 0/4] some fixes for hns3 PMD driver Ferruh Yigit
2019-10-26 1:03 ` Wei Hu (Xavier)
2019-10-26 1:56 ` Wei Hu (Xavier)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1572007025-43391-2-git-send-email-xavier.huwei@huawei.com \
--to=xavier.huwei@huawei.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@intel.com \
--cc=forest.zhouchang@huawei.com \
--cc=linuxarm@huawei.com \
--cc=xavier.huwei@tom.com \
--cc=xavier_huwei@163.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).