From 5cf7a75b2c3b33c4c3579eba6716a4c7ca02ec5b Mon Sep 17 00:00:00 2001 From: "Wei Hu (Xavier)" Date: Thu, 9 Jan 2020 11:15:52 +0800 Subject: [PATCH] net/hns3: remove one IO barrier in Rx When receiving a packet, hns3 hardware network engine firstly writes the packet content to the memory pointed by the 'addr' field of the Rx Buffer Descriptor, secondly fills the result of parsing the packet include the valid field into the Rx Buffer Descriptor in one write operation, and thirdly writes the number of the Buffer Descriptor not processed by the driver to the HNS3_RING_RX_FBDNUM_REG register. This patch optimizes the Rx performance by removing one rte_io_rmb call in the '.rx_pkt_burst' ops implementation function named hns3_recv_pkts. The change as follows: 1. Driver no longer read HNS3_RING_RX_FBDNUM_REG register, so remove one rte_io_rmb call, and directly read the valid flag of Rx Buffer Descriptor to check whether the BD is ready. 2. Delete the non_vld_descs field from the statistic information of the hns3 driver because now it has become a common case that the valid flag of Rx Buffer Descriptor read by the driver is invalid. Signed-off-by: Chengwen Feng Signed-off-by: Wei Hu (Xavier) --- drivers/net/hns3/hns3_rxtx.c | 12 +++--------- drivers/net/hns3/hns3_rxtx.h | 1 - drivers/net/hns3/hns3_stats.c | 3 --- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c index 34919cd2cb..a1655e246b 100644 --- a/drivers/net/hns3/hns3_rxtx.c +++ b/drivers/net/hns3/hns3_rxtx.c @@ -1174,7 +1174,6 @@ hns3_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc, rxq->io_base = (void *)((char *)hw->io_base + HNS3_TQP_REG_OFFSET + idx * HNS3_TQP_REG_SIZE); rxq->rx_buf_len = hw->rx_buf_len; - rxq->non_vld_descs = 0; rxq->l2_errors = 0; rxq->pkt_len_errors = 0; rxq->l3_csum_erros = 0; @@ -1421,7 +1420,6 @@ hns3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) uint16_t pkt_len; uint16_t nb_rx; uint16_t rx_id; - int num; /* num of desc in ring */ int ret; nb_rx = 0; @@ -1435,15 +1433,11 @@ hns3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) last_seg = rxq->pkt_last_seg; sw_ring = rxq->sw_ring; - /* Get num of packets in descriptor ring */ - num = hns3_read_dev(rxq, HNS3_RING_RX_FBDNUM_REG); - while (nb_rx_bd < num && nb_rx < nb_pkts) { + while (nb_rx < nb_pkts) { rxdp = &rx_ring[rx_id]; bd_base_info = rte_le_to_cpu_32(rxdp->rx.bd_base_info); - if (unlikely(!hns3_get_bit(bd_base_info, HNS3_RXD_VLD_B))) { - rxq->non_vld_descs++; + if (unlikely(!hns3_get_bit(bd_base_info, HNS3_RXD_VLD_B))) break; - } nmb = rte_mbuf_raw_alloc(rxq->mb_pool); if (unlikely(nmb == NULL)) { @@ -1454,7 +1448,7 @@ hns3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) nb_rx_bd++; rxe = &sw_ring[rx_id]; rx_id++; - if (rx_id == rxq->nb_rx_desc) + if (unlikely(rx_id == rxq->nb_rx_desc)) rx_id = 0; rte_prefetch0(sw_ring[rx_id].mbuf); diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h index a042c99021..943c6d8bbf 100644 --- a/drivers/net/hns3/hns3_rxtx.h +++ b/drivers/net/hns3/hns3_rxtx.h @@ -245,7 +245,6 @@ struct hns3_rx_queue { bool rx_deferred_start; /* don't start this queue in dev start */ bool configured; /* indicate if rx queue has been configured */ - uint64_t non_vld_descs; /* num of non valid rx descriptors */ uint64_t l2_errors; uint64_t pkt_len_errors; uint64_t l3_csum_erros; diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c index 9948beb179..b3797ec534 100644 --- a/drivers/net/hns3/hns3_stats.c +++ b/drivers/net/hns3/hns3_stats.c @@ -219,8 +219,6 @@ static const struct hns3_xstats_name_offset hns3_reset_stats_strings[] = { /* The statistic of errors in Rx BD */ static const struct hns3_xstats_name_offset hns3_rx_bd_error_strings[] = { - {"NONE_VALIDATED_DESCRIPTORS", - HNS3_RX_BD_ERROR_STATS_FIELD_OFFSET(non_vld_descs)}, {"RX_PKT_LEN_ERRORS", HNS3_RX_BD_ERROR_STATS_FIELD_OFFSET(pkt_len_errors)}, {"L2_RX_ERRORS", @@ -510,7 +508,6 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) rxq = eth_dev->data->rx_queues[i]; if (rxq) { rxq->pkt_len_errors = 0; - rxq->non_vld_descs = 0; rxq->l2_errors = 0; rxq->l3_csum_erros = 0; rxq->l4_csum_erros = 0; -- 2.20.1